公共文件
把通用的变量定义、函数定义、编译模板都抽象出来,定义到单独的文件中,然后在每一个Makefile文件中,引入公共的文件。
分层
大的工程通常都有好几个子目录,一层套一层,所以通常每一层都对应一个Makefile,一层层深入。
并发
对于大工程来讲,需要让Makefile在编译的时候可以尽量地并发。make -j {并发数} 可以达到这个目的。
为了达到并发的目的,编译的时候,可以分阶段来进行,每个阶段可以尽量地并发。例如如果编译的结果是生成一个可执行的二进制文件,可以分两个阶段,第一个阶段叫编译阶段,第二个阶段叫链接阶段。编译阶段负责把.c编译成.o,这个过程可以完全地并发。链接阶段把.o链接成最后的可执行文件。
清理
记得在编译后,清理无用的临时文件,在编译过程中,可能会生成大量的.o临时文件,在工程巨大的时候,这些临时文件会占用大量的空间,编译完成后删除它们是一个不错的选择。
模板
Makefile其实基本上是类似的,可以使用模板,把常规的编译动作都抽象出来。
- 子目录模式:编译指定子目录下的Makefile
- 目标文件模式:对于每个.c,编译成对应的.o
- lib模式:对于每个.c,编译成对应的.o,然后再生成动态或者静态库。
Makefile目标动作
上面提到,为了尽可能地并行构建,把构建的动作分成几个部分,例如编译阶段,链接阶段,打包阶段等等,各个阶段内部是可以完全并行的,但是阶段与阶段之间,是串行的。
典型的目标动作有:
- compile:将.c编译成.o
- link:将.o链接成可执行程序,或者.a和.so
- all: all一般相当于是compile + link
- clean:清理所有编译后的结果
- cleantemp:清理无用的临时文件
网友评论