Makefile简介

# 一、为什么要用 make

  • 一个词来说就是:自动化
  • 只需要写一个 Makefile,就可以通过一句命令来自动化地完成编译、测试、打包、部署等一系列操作
    • 即使是 Linux 内核,也可以通过一句 make 来完成编译
  • 而且它不仅仅是用来编译 C/C++ 的,还可以用来执行任何命令
    • 比如说用 make 来简化输入命令的
    • 有些时候会比 shell 脚本更容易编写
      • 处理依赖、读取命令行输入等 make 都会帮你完成

# 二、如何编写 Makefile

target ...: prerequisites ...
    command
    ...
    ...
1
2
3
4
  • target: 目标文件 / 可执行文件/ 标签

    • .PHONY 定义伪目标

    .PHONY: clean

    
    
    1
  • prerequisites: 依赖文件 / 依赖 target

  • command: 执行的命令

    • 即触发 target 时执行的 shell 命令
    • 开头加 @ 不会在终端输出命令本身
    • 开头加 - 会忽略命令执行失败的错误,继续向下执行

# 三、Makefile 变量

  • 变量定义:
    • VAR = value,value 会在使用时才被展开(可以在文件任何位置)
    • VAR := value,右边的 value 会在定义时就被展开
    • VAR ?= value,如果 VAR 未定义,则定义为 value
    • VAR += value,将 value 追加到 VAR 的末尾
  • 变量引用:
    • $(VAR):引用变量 VAR(Makefile 中的变量引用)
    • ${VAR}:引用变量 VAR(Shell 中的变量引用)
    • 会以“字符串”的形式展开(类似 C 中的宏展开)
    • 可以通过 $(shell command) 来将 command 的输出结果作为替换的值
    • 可以直接使用环境变量,如 $(PATH)

# 四、make 命令

  • make 后面可以跟多个 target,指定执行的内容

    • 如果不跟任何 target,则默认执行第一个 target
  • 可以在 make 后面直接通过 VAR=value 的形式来定义变量

    • 优先级:make 后 > Makefile 中定义 > 环境变量(make 前)
  • 一些常用的 make 命令 flag:

    • make -f FILE:指定 Makefile 文件
    • make -n:不执行命令,只显示命令
    • make -s:不显示命令
    • make -j N:并行执行 N 个任务
    • make -k:忽略错误,继续执行

# 五、相关资料

Buy me a cup of coffee ☕.