首页 > 代码库 > makefile一例

makefile一例

 

    尝试编写了第一个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 = http://www.mamicode.com/$(wildcard *.c ./foo/*.c) >68 # notdir 去除文件路径,例如:SRC = http://www.mamicode.com/$(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 # $@ 表示目标集

 

makefile一例