Makefile

target ... : prerequisites ...
    recipe
    ...
    ...
  • target

    可以是一个 object file(目标文件),也可以是一个可执行文件,还可以是一个标签(label)。对于标签这种特性,在后续的“伪目标”章节中会有叙述。

  • prerequisites

    生成该 target 所依赖的文件和/或target。prerequisites中如果有一个以上的文件比target文件要新的话,recipe所定义的命令就会执行

  • recipe

    该 target 要执行的命令(任意的shell命令)在 Makefile 中的命令,必须要以 Tab 键开始

这就是 makefile 的规则也就是 makefile 中最核心的内容


  • 反斜杠 ( \ )是换行符的意思

  • make 是如何工作的

    1. make会在当前目录下寻找 Makefile / makefile

    2. if finds,它会找第一个目标文件(target), 并把这个文件作为最终的目标文件

    3. if it doesn't find target, 或者target所依赖的 .o files 的文件修改时间要比 target 新,它就会执行后面定义的命令来生成target

    4. if .o files don't exist , make 会在当前文件寻找目标为 .o 文件的依赖性,如果找到规则就按照该规则生成 .o files (it's similar to the process of stack)

    5. bec .c and .h files exist, 于是 make 生成 .o 然后生成make的终极任务

  • 变量 (类似c语言里的宏)

    1697473696111
  • 自动推导 (其是 make 的隐式规则)

    只要 make 看到一个 .o 文件,它就会自动的把 .c 文件加在依赖关系中

  • 伪目标 ( .PHONY 表示 clean 是个伪目标文件)

    1697473959893
  • 清空目录 (在 rm 命令前面加小减号是,也许某些文件出现问题,但继续执行 | clean 从来都是放在文件最后

    1697474194873
  • 环境变量 MAKEFILES

    如果当前环境中定义了环境变量 MAKEFILES ,那么make会把这个变量中的值做一个类似于 include 的动作。这个变量中的值是其它的 Makefile ,用空格分隔。只是,它和 include 不同的是,从这个环境变量中引入的Makefile的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。

    但是在这里我还是建议不要使用这个环境变量,因为只要这个变量一被定义,那么当你使用 make 时,所有的Makefile 都会受到它的影响,这绝不是你想看到的。在这里提这个事,只是为了告诉大家,也许有时候你的 Makefile出现了怪事,那么你可以看看当前环境中有没有定义这个变量。

  • 语法

    1697528626321

    command 是命令行,如果其不与 “targets : prerequisites” 在一行,那么必须以 Tab 开头,如果在一行,用分号间隔

  • 文件搜寻

    1697530279559

    目录由“冒号”分隔

  • 自动生成依赖性

    大多数C/C++编译器都支持“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系,如果使用GNU的C/C++编译器,你得用 -MM 参数,不然, -M 参数会把一些标准库的头文件也包含进来