理解GNU make的后缀规则与Makefile编写

需积分: 50 401 下载量 84 浏览量 更新于2024-08-10 收藏 964KB PDF 举报
本文介绍了"老式风格的"后缀规则"在Makefile中的使用方法,这是在编写构建脚本时,尤其是与早期GNU make版本兼容时的重要概念。后缀规则是一种定义目标文件如何从源文件生成的方式,逐渐被更强大的模式规则所替代。 **后缀规则类型** 1. **双后缀规则**:这种规则定义了目标文件和源文件的后缀,如`.c.o`,意味着`.c`文件经过编译生成`.o`文件。等价于`%o : %c`的模式规则。 2. **单后缀规则**:只定义源文件的后缀,如`.c`,等价于`% : %.c`。如果后缀是Makefile已经识别的,那么它将被视为单后缀规则。 **规则的使用** - **依赖文件**:后缀规则不包含依赖文件,只有目标文件和源文件的后缀关系。如果出现依赖文件,如`.c.o: foo.h`,那它就不是一个纯粹的后缀规则,而是表示`.c.o`依赖于`foo.h`,这通常应写为`%.o: %.c foo.h`。 - **命令**:没有命令的后缀规则是没有意义的,因为它不会覆盖Makefile的内置隐含规则。 - **扩展后缀列表**:通过`.SUFFIXES`伪目标可以添加或删除Makefile认识的后缀,例如`.SUFFIXES: .hack .win`将`.hack`和`.win`加入后缀列表。 此外,文章还提到了Makefile的其他部分,包括: - **显式规则和隐晦规则**:显式规则是用户明确指定的,隐晦规则是Makefile内置的用于推断编译和链接步骤的规则。 - **变量的使用**:Makefile中可以定义变量来简化和复用命令。 - **自动推导**:make可以自动推导源文件和目标文件之间的依赖关系。 - **静态模式规则**和**伪目标**:静态模式规则允许更灵活地定义规则,伪目标如`.PHONY`用于标记总是需要重新执行的目标。 - **命令书写**:包括显示命令、命令执行控制以及嵌套`make`调用等。 - **变量的高级特性**:如变量的叠加、覆盖、多行定义等。 - **条件判断**和**函数**:在Makefile中实现条件分支和字符串、文件名的处理功能。 这篇文章详细阐述了Makefile中的后缀规则及其在构建过程中的应用,对于理解和编写Makefile具有指导价值,特别是对于需要与旧版Makefile保持兼容的项目。