http://blog.vjeux.com/category/makefile
http://scottmcpeak.com/autodepend/autodepend.html
http://www.freezhongzi.info/?p=216
依赖解释
http://maskray.me/blog/2011-08-11-generate-dependency-in-makefile
层级makefile
http://blog.csdn.net/hmsiwtv/article/details/20905177
静态库
http://www.cnblogs.com/itech/archive/2009/09/08/1562292.html
动态库
http://www.360doc.com/content/09/0421/19/36491_3216558.shtml
makefile处理
通配符展开
srcs:=$(wildcard *.c)
后缀替换
$(source:.d=.c)
增加前缀
$(source:%=pre%)
增加后缀
$(source:%=%suf)
转义
当在Makefile中需要使用字符“#”时,可以使用\#来实现
当在Makefile中需要使用字符“$”时,可以使用$$来实现
统配符*使用\*转义
在模式规则中字符‘%’可以用前面加反斜杠“\”方法引用。
查找的makefile文件名顺序为
GNUmakefile、makefile、Makefile。
使用include标示符包含的文件文件查找顺序
当前文件夹
命令行选项-I或者--include-dir指定的目录
/usr/gnu/include
/usr/local/include
/usr/include
-include,sinclude来忽略由于包含文件不存在或者无法创建时的错误提示
共享库查找路径
当前文件夹
VPATH vpath”指定的搜索目录。
/lib /usr/lib /usr/local/lib
多个makefile读取顺序
make在执行时,首先读取的是环境变量“MAKEFILES”所指定的文件列表,之后才是工作目录下的makefile文件,“include”所指定的文件是在make发现此关键字的时、暂停正在读取的文件而转去读取“include”所指定的文件。
make -t 更新时间戳
make -n 打印命令
所有匹配模式
#sample GNUmakefile
foo:
frobnicate > foo
%: force
@$(MAKE) -f Makefile $@
force: ;
make如何解析makefile文件
第一阶段:读取所有的makefile文件,内建所有的变量、明确规则和隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。
在第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标。
在make执行的第一阶段中如果变量和函数被展开,那么称此展开是“立即”的,其他的展开称之为“延后”的。
变量及规则的展开
IMMEDIATE = DEFERRED
IMMEDIATE ?= DEFERRED
IMMEDIATE := IMMEDIATE
IMMEDIATE += DEFERRED or IMMEDIATE
define IMMEDIATE
DEFERRED
Endef
ifdeq ifeq是立即的
所有的规则在make执行时,都按照如下的模式展开:
IMMEDIATE : IMMEDIATE ; DEFERRED
DEFERRED
规则中目标和依赖如果引用其他的变量,则被立即展开。而规则的命令行中的变量引用会被延后展开。
make的执行过程如下:
1. 依次读取变量MAKEFILES定义的makefile文件列表
2. 读取工作目录下的makefile文件(根据命名的查找顺序GNUmakefile,makefile,Makefile首先找到那个就读取那个)
3. 依次读取工作目录makefile文件中使用指示符“include”包含的文件
4. 查找重建所有已读取的makefile文件的规则(如果存在一个目标是当前读取的某一个makefile文件,则执行此规则重建此makefile文件,完成以后从第一步开始重新执行)
5. 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
6. 根据“终极目标”以及其他目标的依赖关系建立依赖关系链表
7. 执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)
8. 执行“终极目标”所在的规则
http://www.cnblogs.com/azraelly/archive/2012/07/07/2580839.html
Gcc –E hello.c –o hello.i 预处理,包含头文件,宏展开
Gcc –S hello.i –o hello.s 汇编,生成可阅读的汇编代码
Gcc –c hello.s –o hello.o 生成二进制文件
Gcc hello.o –o hello 生成可执行文件