尝试编写了第一个makefile,此makefile支持:
1、源码、编译中间文件、目标文件 区分目录存放;
2、程序A、程序B分开编译,公用部分自动编译;
1 CC = g++ 2 ifeq ($(cpu), arm) 3 CC := arm_g++ 4 endif 5 6 CURR_DIR = $(shell pwd) 7 OBJ_DIR = build 8 BIN_DIR = bin 9 VPATH = code : code/aa : code/bb 10 CXXFLAGS = -I$(CURR_DIR)/code/platform -I$(CURR_DIR)/code 11 12 13 # 14 libSource = $(notdir $(wildcard code/*.cpp)) 15 libObjs = $(libSource:%.cpp=$(OBJ_DIR)/%.o) 16 17 $(libObjs): $(OBJ_DIR)/%.o : %.cpp 18 $(CC) -c $(CXXFLAGS) $< -o $@ 19 20 #make aa 21 aaSource = $(notdir $(wildcard code/aa/*.cpp)) 22 aaObjs = $(aaSource:%.cpp=$(OBJ_DIR)/%.o) 23 24 aa: $(aaObjs) $(libObjs) 25 $(CC) -o $(BIN_DIR)/$@ $^ 26 @echo done 27 28 $(aaObjs): $(OBJ_DIR)/%.o : %.cpp 29 $(CC) -c $(CXXFLAGS) $< -o $@ 30 31 32 #make bb 33 bbSource = $(notdir $(wildcard code/bb/*.cpp)) 34 bbObjs = $(bbSource:%.cpp=$(OBJ_DIR)/%.o) 35 36 bb: $(bbObjs) $(libObjs) 37 $(CC) -o $(BIN_DIR)/$@ $^ 38 @echo done 39 40 $(bbObjs): $(OBJ_DIR)/%.o : %.cpp 41 $(CC) -c $(CXXFLAGS) $< -o $@ 42 43 44 #make clean 45 .PHONY : clean 46 clean: 47 rm -fr $(OBJ_DIR)/*.o 48 49 50 51 #打印变量 52 #一种方式:$(shell echo $(aaObjs) > readme.txt ) 53 show: 54 @echo "CC : "$(CC) 55 @echo "curr dir : "$(CURR_DIR) 56 #命令tab开头 57 #@echo时命令不显示,echo时命令显示 58 59 #赋值 60 # = 是最基本的赋值(类似宏替换) 61 # := 是覆盖之前的值(类似C语句) 62 # ?= 是如果没有被赋值过就赋予等号后面的值 63 # += 是添加等号后面的值 64 65 #函数调用 66 # return = $(functionname arg1,arg2,arg3...) 67 # wildcard 返回文件名,包括路径,例如:SRC = $(wildcard *.c ./foo/*.c) 68 # notdir 去除文件路径,例如:SRC = $(notdir wildcard) 69 # patsubst 替换,例如:OBJ = $(patsubst %.c %.o $(SRC)) 70 71 #指定源文件路径 72 # VPATH = dir1 : dir2 73 # 另外vpath用来定义查找的路径与匹配的模式 74 75 #静态模式 76 # <targets ...>: <target-pattern>: <prereq-patterns ...> 77 # <commands> 78 # $< 表示所有的依赖目标集 79 # $@ 表示目标集