MakeFile学习

来源:互联网 发布:网络推广公司宣传语 编辑:程序博客网 时间:2024/06/07 03:03
参考:http://blog.chinaunix.net/uid-22473300-id-3320462.html
http://www.gnu.org/software/make/manual/make.html
(1) 带目录的 MakeFile的写法

总的根目录下的MakeFile

点击(此处)折叠或打开

  1. include ./config.mk
  2. SUBDIRS=`find . -name makefile|sed -"s/makefile//"`

  3. #dir below will not be complied
  4. EXCLUDE=./subDirWantToExclude/\
  5.     ./

  6. define make_sub
  7.     @for subdir in $(SUBDIRS);do\
  8.     omitflag=0;\
  9.         for d in $(EXCLUDE);do\
  10.             echo "$$d and $$subdir";\
  11.             if [ $$d == $$subdir ];then\
  12.                 omitflag=1;\
  13.                 break;\
  14.             fi;\
  15.         done;\
  16.     if [ $$omitflag -ne 0 ];then\
  17.         echo "omit $$subdir";\
  18.         continue;\
  19.     fi;\
  20.     cd $$subdir && make $1;\
  21.     ret=$$?;\
  22.     if [ $$ret -ne 0 ];then \
  23.         echo "make $$subdir error with[$$ret]";\
  24.         exit 1;\
  25.     fi;\
  26.     cd -;\
  27.     done;
  28. endef

  29. all:
  30.     echo "do predo";
  31.     cd $(PRE_DIR) && chmod +./run.sh && ./run.sh;cd -;
  32.     $(call make_sub)
  33. clean:
  34.     $(call make_sub,clean)
  35. installconf:
  36.     $(call make_sub,installconf)
  37. install:
  38.     $(call make_sub,install)
(1)子目录的MakeFile(其中不在包含子目录)

点击(此处)折叠或打开

  1. include ../config.mk
  2. HOME = ../..
  3. LIB_BUILD = libXXXX.so

  4. HEADER_FILE_PATH = -I. -I$(HOME)/xxxx
  5. LIBPATH = -L.
  6. LIBS = -ldl -lz -lpthread -L$(HOME)/xxxx -lxxx

  7. AR = ar cr
  8. CPP = g++
  9. CCFLAGS = -Wall --fPIC
  10. CCFLAGS += $(GCCARGS)


  11. SOURCES=$(wildcard *.cpp)
  12. OBJECTS=$(SOURCES:.cpp=.o)

  13. .SUFFIXES :
  14. .SUFFIXES : .cpp ..exe .c

  15. all: $(LIB_BUILD)

  16. $(LIB_BUILD) : $(OBJECTS)
  17.     $(CPP) -shared -o $@ $^ $(LIBS)
  18. install:
  19.     cp libXXXX.so $(LOCAL_LD_LIBRARY_PATH)/libXXXX.so

  20. .cpp.o:
  21.     $(CPP) $(CCFLAGS) -c $<     $(HEADER_FILE_PATH)
  22. clean:
  23.     @/bin/rm -*.o $(LIB_BUILD)
(2)子目录的MakeFile(其中包含子目录)

点击(此处)折叠或打开

  1. #set your project name
  2. PRJ_NAME = libXXXX.so

  3. #set your project type : choose one below
  4. #设置项目的类型,是共享库、可执行程序还是静态库
  5. PRJ_TYPE = g++ -shared
  6. #PRJ_TYPE = 
  7. #PRJ_TYPE = ar -

  8. #set Debug or Release
  9. Compile_Flag = Debug
  10. #Compile_Flag = Release

  11. #set your output path
  12. Output:= bin

  13. #set your source folder
  14. SRC:= code

  15. #add the lib you used here
  16. #LIBS := -lLib1 -lLib2 -lLib3
  17. LIBS := -lpthread
  18. #LIBPATH := -Lpath1 -Lpath2 -Lpath3
  19. LIBPATH := 
  20. INCLUDEPATH :=
  21. # INCLUDEPATH := -I/usr/lib/XXX/include

  22. ###################################
  23. #DON"T MODIFY THE BELOWS

  24. #combine output folder
  25. FinalOutput := $(Output)/$(Compile_Flag)/
  26. #:=,只展开一次,防止陷入循环递归
  27. #list all dirs
  28. SUBDIRS := $(shell find $(SRC) -type d
  29. #调用shell,执行find命令,然后把返回的结果放到变量SUBDIRS里面。
  30. #find code -type d 查找code文件夹里面的所有文件夹,包括code文件夹
  1. #flags in makefile
  2. DEBUG_FLAG = -O0 -g3 -Wall -c -fmessage-length=0
  3. RELEASE_FLAG = -O3 -Wall -c -fmessage-length=0
  4. RM := rm -rf

  5. #set compile flag
  6. ifeq ($(Compile_Flag),Debug)
  7. CFLAGS := $(DEBUG_FLAG)
  8. else
  9. CFLAGS := $(RELEASE_FLAG)
  10. endif

  11. #prepare files
  12. CPP_SRCS:=$(shell find $(SRC) -name *.cpp)
  13. #查找.cpp文件,然后把文件列表保存在CPP_SRCS里面。找到的文件是带着相对的路径名的
  14. OBJS:=$(CPP_SRCS:%.cpp=$(FinalOutput)%.o)
  15. #把CPP_SRCS里面,每个cpp部分结尾的字符串,.cpp部分都替换成.o,并且在前面加上$(FinalOutput)字符串
  16. #在路径./code/test下面有个文件a.cpp,执行上面的操作后,CPP_SRCS里面就有了一个./code/test/a.cpp,然后经过替换,OBJS里面就有了
  17. #一个bin/Debug/code/test/a.o了。
  18. #all target
  19. all: dir $(FinalOutput)$(PRJ_NAME)
  20. #all是我们要make的目标,冒号(:)后面的内容是这个目标的依赖项,依赖项可以没有,也可以有多个。这个all,就依赖于两个项目,一个
  21. #是dir,一个是$(FinalOutput)和$(PRJ_NAME)一起组成的目标文件夹。其中dir是用来创建目录的,而$(FinalOutput)$(PRJ_NAME)是用来生成
  22. #项目文件的。
  23. dir:
  24.     mkdir -p $(FinalOutput);
  25.     for val in $(SUBDIRS);do \
  26.      mkdir -p $(FinalOutput)$${val}; \
  27.     done;
  28. #创建文件夹

  29. #tool invocations
  30. $(FinalOutput)$(PRJ_NAME):$(OBJS)
  31.     @echo 'Building target: $@'
  32. #$@是个特殊的系统变量,它代表“目标”
  33.     @echo 'Invoking:GCC C++ Linker'
  34.     $(PRJ_TYPE) $(LIBPATH) -o"$@" $^ $(LIBS)
  35. #$^代表依赖项,也就是$(OBJS)
  36.     @echo 'Finished building target: $@'
  37.     @echo ' '

  38. #这里是makefile最核心的地方,模式规则
  39. #$(FinalOutput)%o:./%cpp的意思。我有一个目标是bin/Debug/src/data/core.o,其中变量$(FinalOutput)的值是bin/Debug/.应用规则后对应的依
  40. #赖文件就是./src/data/core.cpp了。
  41. $(FinalOutput)%o:./%cpp
  42.     @echo 'Building file: $<'
  43.     @echo 'Invoking:GCC C++ Compiler'
  44.     g++ $(CFLAGS) $(INCLUDEPATH) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<


http://blog.chinaunix.net/uid-17102734-id-3976814.html
0 0
原创粉丝点击