可以用autoconf和automake自动生成工程所需要的makefile。
makefile的工作方式:
Makefile 中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的
1、读入所有的 Makefile。
2、读入被 include 的其它 Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
每条命令的开头必须是[Tab]键开头。
makefile的关键字:vpath,包含大量的源文件的目录
伪目标:
.PHONY : clean
clean:
rm *.o temp
自动化变量:$@ 所有目标的集合,$<所有的依赖目标集
显示命令@,调试makefile很有帮助
我们用这个功能来像屏幕显示一些信息。如:@echo 正在编译 XXX 模块......,当 make 执行时,会输出“正在编译 XXX 模块......”字串,但不会输出命令,如果没有“@”,那么,make 将输出:echo 正在编译 XXX 模块......
如果 make 执行时,带入 make 参数“-n”或“--just-print”,那么其只是显示命令
而 make 参数“-s”或“--slient”则是全面禁止命令的显示。
命令执行:
Makefile默认ed环境路径就是makefile文件当前的路径。cd /home/hchen; pwd 这样才会打印出/home/hchen, 换行就不会了
多文件路径makefile
build:
cd subdir && $(MAKE)
$(MAKE)宏变量的意思是,也许我们的 make 需要一些参数,所以定义成一个变量比较利于维护。这个例子的意思都是先进入“subdir”目录,然后执行 make 命令
如果你要传递变量到下级 Makefile 中,那么你可以使用这样的声明:export <variable ...>
如果你不想让某些变量传递到下级 Makefile 中,那么你可以这样声明:unexport <variable ...>
需要注意的是,有两个变量,一个是 SHELL,一个是 MAKEFLAGS,这两个变量不管你是否 export,其总是要传递到下层 Makefile 中
多个文件共同的CFLAGS这个变量,相当于全局变量
定义命令包:
类似C语言的宏,这样$(run-yacc) 就相当于 define和endef之间的命令
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
makefile的变量是大小敏感的
= 直接赋值和宏一样,可以使用后面的变量,最终的结果
:= 前面的变量不能使用后面的变量,只能使用前面已定义好了的变
量
+=追加变量
?=如果没定义过,就赋值
可以嵌套变量a := $($(x))