Makefile深入解析:目标变量与环境变量

需积分: 48 71 下载量 189 浏览量 更新于2024-08-09 收藏 478KB PDF 举报
"这篇文档是《跟我一起写Makefile》PDF重制版的一部分,由陈皓撰写,介绍了Makefile的编写和使用。内容涵盖了Makefile的基本概念、规则、变量使用、命令书写、条件判断和函数应用等多个方面。" 在Makefile的编写中,环境变量和目标变量是两个重要的概念。 环境变量在Makefile中的使用允许我们设置通用的编译参数,例如`CFLAGS`。当Makefile运行时,如果在系统环境中定义了`CFLAGS`,这个变量的值会被所有Makefile使用,除非Makefile内部重新定义了该变量。如果使用`-e`选项启动`make`,则系统环境变量会覆盖Makefile中的定义。在嵌套调用Makefile时,上层Makefile定义的变量可以通过环境变量传递给下层,但需要使用`export`关键字。然而,过多地依赖环境变量可能造成不同Makefile之间配置冲突的问题。 目标变量(Target-specific Variables)是Makefile的一个高级特性,允许为特定的目标设定局部变量。这样的变量只在定义的规则及其连带规则中有效,不会影响其他全局变量。定义目标变量的语法如下: ``` <target ...> : <variable-assignment>; <target ...> : override <variable-assignment> ``` 例如,可以为`prog`目标指定`CFLAGS`变量: ``` prog : CFLAGS = -g prog : prog.o foo.o bar.o $(CC) $(CFLAGS) prog.o foo.o bar.o ``` 在这个例子中,`-g`只在构建`prog`时启用,不会影响其他规则对`CFLAGS`的使用。 Makefile的基本结构包括规则、变量和命令。规则定义了目标文件如何由依赖文件生成,变量则用来存储常量和动态计算值,命令用于描述执行的操作。Makefile还支持自动化变量,如`$<`代表第一个依赖目标,以及模式规则,用于匹配和处理一组相似的文件。 此外,Makefile还可以利用条件判断和内置函数进行更复杂的逻辑控制和字符串、文件路径的处理。理解并熟练运用这些概念和技巧,能帮助开发者编写出高效且易于维护的Makefile,提高软件构建的自动化程度。