1. 程式人生 > >關於makefile文件研究

關於makefile文件研究

依賴 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=echo
else
        ECHO=echo -e
endif
CXX = g++
CFLAGS = -pg -Wall -std=c++0x
PRO_HOME=~/build-env/build-system
LDFLAGS = -L $(PRO_HOME)/3rd-soft/lib/
CLINC = -I $(PRO_HOME)/3rd-soft/include/
LDLIBS = -ljsoncpp -lsybdb -lgcrypt -lcurl -luuid -lglog -ljsoncpp
SOURCES = $(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=AS
TEST_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.h
    
force:
    @echo Generation force ...
# 程序的生成過程 {{{
# }}}

運行以後打印整理如下:

Generation force ...
Generation version.h ...
Generation cpp ...
Generation targets ...
Generation default ...

由此可見,實際運行時程序由下往上,按各自的依賴關系,先執行被依賴的部分。

關於makefile文件研究