【Makefile/GNU Make】知识总结

1. 总体认识

  • GNU Make是一个命令工具,用于控制从源文件生成可执行文件和其他非源文件。使用前需要进行安装(以ubuntu为例):
    sudo apt install make
    
  • Make从Makefile中了解如何构建程序,该文件列出了每个非源文件及其构建方法,因此需要编写Makefile以供make命令构建项目。
  • GNU Make的具体用途
    • 能够使用户在不知道如何完成的情况下构建和安装包。
    • 能够根据更改的源文件,自动确定需要更新哪些文件
    • 不限于任何特定的语言,最常用于C/C++项目的构建。对于程序中的每个非源文件,Makefile指定用于构建它的shell命令。这些shell命令可以运行编译器来生成目标文件,可以运行链接器来生成可执行文件,可以更新库,也可以运行TeX或Makeinfo来格式化文档。
    • 不限于构建包。还能控制软件包的安装或卸载,为其生成标记表,或者执行经常做的任何任务。
  • 默认情况下,make命令只执行完遇到的第一条规则,包括递归执行生成先决条件的规则,其他的规则不执行。要执行其他规则,需要指定目标,比如make clean

2. 编写Makefile

2.1. Makefile的组成

Makefile包括明确的规则、模糊的规则、变量的定义、指令和注释。

  • 明确的规则(explicit rule)规定何时以及如何构建目标,其基本结构如下:
    targets ... : prerequisites ...
    	recipe	# 注意Tab键开头
    	...
    
    • 目标(targets):通常是生成的文件名,也可以是要执行的操作名(伪目标)。
    • 先决条件(prerequisites):是构建命令需要输入的所有文件,用空格隔开。
    • 构建方法(recipe):每行以Tab键开头,内容是构建目标文件的shell命令。
    • 如果先决条件比目标更新,或者目标不存在,那么会重新构建目标
  • 模糊的规则(implicit rule)规定了何时以及如何基于文件名重新构建一类文件。比如源文件编译成目标文件:
    main.o : defs.h
    
    不用写源文件名和编译命令。
  • 变量的定义(variable definition)指定了后续变量要替换的文本字符串值。
  • 指令(directive)用于读取Makefile时执行一些特殊的操作,包括
    • 读取另一个makefile文件
    • 基于变量的值决定使用还是忽略makefile的一部分
    • 定义多行变量(用一个变量替换多行命令)
  • 注释(comment)
    • #后面的内容忽略,如果有反斜杠折行则会跨行注释
    • 使用#字符要转义:\#
    • 不能在变量引用和函数调用中使用注释,#号都会当字面量处理。
    • 构建命令中的注释会传递给shell,shell决定如何处理。
    • define指令中注释不会被忽略,而是作为变量的值,根据变量展开时的上下文,被视为注释或构建命令文本。
  • 使用反斜杠\可以将长行折成多行。
  • 使用$\可以去掉多余的空格。

2.2. Makefile文件名

  • 默认情况下,make会尝试查找以下文件名:GNUmakefile、makefile和Makefile。推荐使用Makefile
  • 如果make没找到默认文件名,则需要通过命令参数-f--file=指定。
  • 如果使用多个-f--file=参数,则可以指定多个生成文件。所有的制作文件都按照指定的顺序有效地连接起来。
  • 如果指定-f--file=参数,默认文件名的makefile不会自动检查。

2.3. 包含其他Makefile

3. 编写规则

4. 编写规则中的构建命令

5. 如何使用变量

6. 条件判断

7. 转换文本的函数

8. 如何运行make

9. 使用模糊规则

10. 使用make来更新存档文件

11. 扩展GNU make

12. 集成GNU make

13. GNU make的特性

14. 不兼容和缺少的特性

15. makefile文件约定

相关推荐

  1. jvm基础知识总结

    2023-12-28 19:56:01       55 阅读
  2. 【SpringBoot】知识总结

    2023-12-28 19:56:01       63 阅读
  3. 流媒体知识总结

    2023-12-28 19:56:01       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-28 19:56:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-28 19:56:01       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-28 19:56:01       82 阅读
  4. Python语言-面向对象

    2023-12-28 19:56:01       91 阅读

热门阅读

  1. 【ACW66】Secure Digital Infrastructure

    2023-12-28 19:56:01       54 阅读
  2. Git更新远程分支

    2023-12-28 19:56:01       55 阅读
  3. postgresql 序列

    2023-12-28 19:56:01       51 阅读
  4. RBE306TC Computer Vision Systems Lab Manuals and Reports

    2023-12-28 19:56:01       56 阅读
  5. centos 配置 git 连接 github

    2023-12-28 19:56:01       59 阅读
  6. C# 中 加盐(salting)

    2023-12-28 19:56:01       63 阅读
  7. 《LIO-SAM阅读笔记》3.后端优化

    2023-12-28 19:56:01       52 阅读
  8. CSS中浮动float带来的高度塌陷问题及4种解决方案

    2023-12-28 19:56:01       55 阅读
  9. 抽象工厂模式(Abstract Factory)

    2023-12-28 19:56:01       62 阅读