關於makefile文件研究
阿新 • • 發佈:2017-12-01
依賴 uuid onos fff sub ace uid 12px 可見
makefile文件采用依賴倒推的模式進行編譯。
主要由以下幾步構成:
1 申明
2 default 默認生成的對象
3 TARGET 鏈接過程
4 cpp 編譯過程
5 生成一個version.h文件
6 一個空force過程
附上一個測試文件
.PHONY: default
SYSNAME=$(shell uname -s)ifeq ($(SYSNAME),Darwin)ECHO=echoelse
ECHO=echo -eendifCXX = g++CFLAGS = -pg -Wall -std=c++0xPRO_HOME=~/build-env/build-systemLDFLAGS = -L $(PRO_HOME)/3rd-soft/lib/CLINC = -I $(PRO_HOME)/3rd-soft/include/LDLIBS = -ljsoncpp -lsybdb -lgcrypt -lcurl -luuid -lglog -ljsoncppSOURCES = $(wildcard *.cpp ./common/*.cpp)
OBJECTS = $(patsubst %.cpp,%.o,$(SOURCES))TARGET=program_name# TODO: 這裏加入所有默認需要編譯的目標default: version.h $(TARGET)@echo Generation default ...# 鏈接過程${TARGET}: $(OBJECTS)@echo Generation TARGET ...$(CXX) $(OBJECTS) $(CLINC) $(LDFLAGS) $(LDLIBS) -o $(TARGET)cp -f $(TARGET) ../bin/$(TARGET)# 編譯過程%.o : %.cpp@echo Generation cpp ...$(CXX) -c $(CFLAGS) $(CLINC) $(LDFLAGS) $(LDLIBS) $< -o $@# 下面是每個目標的生成過程TEST_PROGRAM_NAME=ASTEST_PROGRAM_NAME_CN=模塊名簡介MAIN_VERSION_STRING="1.0.0"VERSION_STRING:=$(shell LANG=C git log --oneline -1 2>/dev/null |cut -c1-7)version.h: force@echo Generation version.h ...@$(ECHO) "# ifndef __TEST_SERVICE_VERSION_H__\n\# define __TEST_SERVICE_VERSION_H__\n\# define SERVICE_VERSION_STRING \"$(MAIN_VERSION_STRING).$(VERSION_STRING)\"\n\# define TEST_PROGRAM_NAME \"$(TEST_PROGRAM_NAME)\"\n\# define TEST_PROGRAM_NAME_CN \"$(TEST_PROGRAM_NAME_CN)\"\n\# endif" > version.hforce:@echo Generation force ...# 程序的生成過程 {{{# }}}
運行以後打印整理如下:
Generation force ...Generation version.h ...Generation cpp ...Generation targets ...Generation default ...
由此可見,實際運行時程序由下往上,按各自的依賴關系,先執行被依賴的部分。
關於makefile文件研究