Makefile笔记一【基础篇】

可以用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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值