参考:
http://blog.chinaunix.net/uid-22473300-id-3320462.html
http://www.gnu.org/software/make/manual/make.html
(1) 带目录的 MakeFile的写法
总的根目录下的MakeFile
(1)子目录的MakeFile(其中不在包含子目录)
(2)子目录的MakeFile(其中包含子目录
)
http://www.gnu.org/software/make/manual/make.html
(1) 带目录的 MakeFile的写法
总的根目录下的MakeFile
点击(此处)折叠或打开
- include ./config.mk
- SUBDIRS=`find . -name makefile|sed -e "s/makefile//"`
-
- #dir below will not be complied
- EXCLUDE=./subDirWantToExclude/\
- ./
-
- define make_sub
- @for subdir in $(SUBDIRS);do\
- omitflag=0;\
- for d in $(EXCLUDE);do\
- echo "$$d and $$subdir";\
- if [ $$d == $$subdir ];then\
- omitflag=1;\
- break;\
- fi;\
- done;\
- if [ $$omitflag -ne 0 ];then\
- echo "omit $$subdir";\
- continue;\
- fi;\
- cd $$subdir && make $1;\
- ret=$$?;\
- if [ $$ret -ne 0 ];then \
- echo "make $$subdir error with[$$ret]";\
- exit 1;\
- fi;\
- cd -;\
- done;
- endef
-
- all:
- echo "do predo";
- cd $(PRE_DIR) && chmod +x ./run.sh && ./run.sh;cd -;
- $(call make_sub)
- clean:
- $(call make_sub,clean)
- installconf:
- $(call make_sub,installconf)
- install:
- $(call make_sub,install)
点击(此处)折叠或打开
- include ../config.mk
- HOME = ../..
- LIB_BUILD = libXXXX.so
-
- HEADER_FILE_PATH = -I. -I$(HOME)/xxxx
- LIBPATH = -L.
- LIBS = -ldl -lz -lpthread -L$(HOME)/xxxx -lxxx
-
- AR = ar cr
- CPP = g++
- CCFLAGS = -Wall -g -fPIC
- CCFLAGS += $(GCCARGS)
-
-
- SOURCES=$(wildcard *.cpp)
- OBJECTS=$(SOURCES:.cpp=.o)
-
- .SUFFIXES :
- .SUFFIXES : .cpp .o .exe .c
-
- all: $(LIB_BUILD)
-
- $(LIB_BUILD) : $(OBJECTS)
- $(CPP) -shared -o $@ $^ $(LIBS)
- install:
- cp libXXXX.so $(LOCAL_LD_LIBRARY_PATH)/libXXXX.so
-
- .cpp.o:
- $(CPP) $(CCFLAGS) -c $< $(HEADER_FILE_PATH)
- clean:
- @/bin/rm -f *.o $(LIB_BUILD)
点击(此处)折叠或打开
- #set your project name
- PRJ_NAME = libXXXX.so
-
- #set your project type : choose one below
- #设置项目的类型,是共享库、可执行程序还是静态库
- PRJ_TYPE = g++ -shared
- #PRJ_TYPE =
- #PRJ_TYPE = ar -r
-
- #set Debug or Release
- Compile_Flag = Debug
- #Compile_Flag = Release
-
- #set your output path
- Output:= bin
-
- #set your source folder
- SRC:= code
-
- #add the lib you used here
- #LIBS := -lLib1 -lLib2 -lLib3
- LIBS := -lpthread
- #LIBPATH := -Lpath1 -Lpath2 -Lpath3
- LIBPATH :=
- INCLUDEPATH :=
- # INCLUDEPATH := -I/usr/lib/XXX/include
-
- ###################################
- #DON"T MODIFY THE BELOWS
-
- #combine output folder
- FinalOutput := $(Output)/$(Compile_Flag)/
- #:=,只展开一次,防止陷入循环递归
- #list all dirs
- SUBDIRS := $(shell find $(SRC) -type d
- #调用shell,执行find命令,然后把返回的结果放到变量SUBDIRS里面。
- #find code -type d 查找code文件夹里面的所有文件夹,包括code文件夹
- #flags in makefile
- DEBUG_FLAG = -O0 -g3 -Wall -c -fmessage-length=0
- RELEASE_FLAG = -O3 -Wall -c -fmessage-length=0
- RM := rm -rf
-
- #set compile flag
- ifeq ($(Compile_Flag),Debug)
- CFLAGS := $(DEBUG_FLAG)
- else
- CFLAGS := $(RELEASE_FLAG)
- endif
-
- #prepare files
- CPP_SRCS:=$(shell find $(SRC) -name *.cpp)
- #查找.cpp文件,然后把文件列表保存在CPP_SRCS里面。找到的文件是带着相对的路径名的
- OBJS:=$(CPP_SRCS:%.cpp=$(FinalOutput)%.o)
- #把CPP_SRCS里面,每个cpp部分结尾的字符串,.cpp部分都替换成.o,并且在前面加上$(FinalOutput)字符串
- #在路径./code/test下面有个文件a.cpp,执行上面的操作后,CPP_SRCS里面就有了一个./code/test/a.cpp,然后经过替换,OBJS里面就有了
- #一个bin/Debug/code/test/a.o了。
- #all target
- all: dir $(FinalOutput)$(PRJ_NAME)
- #all是我们要make的目标,冒号(:)后面的内容是这个目标的依赖项,依赖项可以没有,也可以有多个。这个all,就依赖于两个项目,一个
- #是dir,一个是$(FinalOutput)和$(PRJ_NAME)一起组成的目标文件夹。其中dir是用来创建目录的,而$(FinalOutput)$(PRJ_NAME)是用来生成
- #项目文件的。
- dir:
- mkdir -p $(FinalOutput);
- for val in $(SUBDIRS);do \
- mkdir -p $(FinalOutput)$${val}; \
- done;
- #创建文件夹
-
- #tool invocations
- $(FinalOutput)$(PRJ_NAME):$(OBJS)
- @echo 'Building target: $@'
- #$@是个特殊的系统变量,它代表“目标”
- @echo 'Invoking:GCC C++ Linker'
- $(PRJ_TYPE) $(LIBPATH) -o"$@" $^ $(LIBS)
- #$^代表依赖项,也就是$(OBJS)
- @echo 'Finished building target: $@'
- @echo ' '
-
- #这里是makefile最核心的地方,模式规则
- #$(FinalOutput)%o:./%cpp的意思。我有一个目标是bin/Debug/src/data/core.o,其中变量$(FinalOutput)的值是bin/Debug/.应用规则后对应的依
- #赖文件就是./src/data/core.cpp了。
- $(FinalOutput)%o:./%cpp
- @echo 'Building file: $<'
- @echo 'Invoking:GCC C++ Compiler'
- g++ $(CFLAGS) $(INCLUDEPATH) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<
http://blog.chinaunix.net/uid-17102734-id-3976814.html