4 tagline: "见习魔法师的Spellbook"
11 作为Spellbook,也就是小抄,我才不会介绍[make](http://en.wikipedia.org/wiki/Make_%28software%29)到底是什么呢!
15 ……也就是规则(rule)啦。每条规则都包括以下三部分:
23 target1 target2 ... : preq1 preq2
27 规则的触发条件很简单: 当prerequisites中某项的修改时间新于targets中的某项,则执行commands部分。
34 OBJECTS = hello.o bye.o
36 $(CC) -o $@ $(OBJECTS)
39 * 使用`+=`添加新条目进入列表 `OBJECTS += hey.o`;
40 * 使用`=`时,若等号左边没被用到,等号右边就不会展开;当需要等号右边在定义时马上被展开的话,改用`:=`;
45 ……请使用隐含规则(Implicit Rule)以及`-M`选项
49 $(CC) $(CFLAGS) $(CPPFLAGS) -M $< > $@
51 ifeq($(findstring $(MAKECMDGOALS), clean),)
52 -include $(OBJECTS:.o=.d)
57 * `-M`选项可以从源文件中产生规则;如果是GNU C编译器的话,可以换成`-MM`, 该选项不会生成系统头文件的prerequisites
58 * `$<`是规则中的第一个prerequisite的名称
61 * `$(CPPFLAGS)`传入预处理器的选项
62 * `$(OBJECTS:.o=.d)`将OBJECTS里每项的后缀从.o改成.d
64 ## 呜啊.d/.o文件都生成在.c文件的目录里了好讨厌
69 SOURCES = hello.cpp bye.cpp
70 OBJECTS = $( addprefix $(BUILDDIR)/,$(SOURCES :.cpp=.o) )
71 DEPS = $( OBJECTS :.o=.d)
73 $( BUILDDIR )/%.o : %.cpp
74 $(CC) $( CFLAGS ) $( CPPFLAGS ) -o $@ -c $<
75 $( BUILDDIR )/%.d : %.cpp
76 $(CC) $( CFLAGS ) $( CPPFLAGS ) -MT $(@:.d=.o) -M $< > $@
80 * `-MT`选项强制指定target为`$(@:.d=.o)`
85 [source link](https://gist.github.com/ZephyrSL/3194416/)
87 {% highlight Makefile %}
89 EXECUTABLE = Datastructure_test
90 SOURCES = Datastructure_test.cpp SPList.cpp
91 # Put generated files into seperate directory
93 OBJECTS = $(addprefix $(BUILDDIR)/,$(SOURCES:.cpp=.o))
94 DEPS = $(OBJECTS:.o=.d)
96 # Switch of full output
102 # Adapt C flags for debug/optimized build
104 CFLAGS += -O3 -DNDEBUG
109 CFLAGS += $(MY_CFLAGS)
110 CPPFLAGS += $(MY_CPPFLAGS)
114 $(BUILDDIR)/$(EXECUTABLE) : $(OBJECTS)
115 $(CC) -o $@ $(OBJECTS)
117 ifeq ($(findstring $(MAKECMDGOALS), clean),)
124 $(BUILDDIR)/%.o : %.cpp
125 @echo "===> DEPEND $@"
126 $(Q)$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $<
128 $(BUILDDIR)/%.d : %.cpp
129 @echo "===> COMPILE $@"
130 $(Q)$(CC) $(CFLAGS) $(CPPFLAGS) -MT $(@:.d=.o) -M $< > $@
133 rm -f $(OBJECTS) $(EXECUTABLE)
136 * 引入了`config.mak`文件,用来分离放置用户自定义的选项
137 * 因为`clean`不是文件,所以将其声明为`.PHONY`
138 * 加入了`$(Q)`这样的黑魔术,使用`make Q=`能输出详细内容
140 ## 这份小抄弱爆了请给我更好的spellbook
142 ……请猛击[GNU Make Manual Quick Reference](http://www.gnu.org/software/make/manual/make.html#Quick-Reference)