Linux - Makefile

Makefile 介绍:

  1. Makefile 是一种配置文件,它可以指定工程中的源文件的编译顺序、重新编译哪些文件以及执行更复杂的操作

  2. 就像一个Shell脚本,可以执行操作系统的命令

  3. Makefile 可以更有效率地管理工程中的源文件,提高工作效率

Makefile 的基本书写规则:

1
2
target(目标)... : prerequisites(依赖)... 
command(命令)
  1. 目标 (Target)
    • 通常是需要生成的文件名(如 app.exe, main.o
    • 也可以是伪目标(执行操作而非生成文件,如 clean
  2. 依赖 (Prerequisites)
    • 生成目标所需的文件或其他目标(用空格分隔)
    • 当依赖比目标更新时,命令会被执行
  3. 命令 (Command)
    • 生成目标的具体操作指令(必须用 Tab 缩进,不能用空格)
    • 每条命令在独立的 Shell 中执行,失败则终止构建

Make1

make 执行的条件:

  1. make 命令执行时,需要一个 Makefile 文件,以告诉 make 命令需要怎么样的去编译和链接程序

  2. 默认提供的 makefile 文件有三类名称: “GNUmakefile”、“makefile” 和 “Makefile”(GNU make 找寻默认的 Makefile 的顺序)

指令的隐藏 @:

  • 在指令前加符号 @ 可以在终端上隐藏指令,不会在终端上显示出来

    Make2

make 运行其他目标:

  1. makefile 文件可以有多个目标,但是只会执行第一个目标
  2. 在 make 指令后追加目标名称即可执行其他目标
1
2
3
4
5
6
MyTarget:
@echo "hello world"

MyCmd:
@pwd
@ls
  • 终端执行的时候:make MyCmd 指定名称,就会执行MyCmd

清空目标规则:(clean)

1
2
clean:
rm *.i #表示删除所有后缀为.i的文件

变量规则:

  1. 变量的定义与引用:

    1. 变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 “$” 符号,但最好用小括号()或是大括号 {} 把变量给包括起来

    2. 如果要使用真实的 “$” 字符,需要用 “$$” 来表示

    3. 变量可以应用在目标、依赖、指令

      1
      2
      a=123
      b=$(a) #引用 a 给到 b
  2. 递归赋值 = :

    1. 在 “=” 左侧是变量,右侧是变量的值

    2. 右侧变量的值可以定义在文件的任何一处,也就是说, 右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值

      1
      2
      3
      4
      5
      a=123
      b=$(a)
      a=456
      val:
      echo $(a) #a 的值变成 456
  3. 赋值 := :

    • := 相当于C语言的 =
  4. 查询赋值 ?= :

    • 例如: Temp ?= Val
    • 执行代码时,查询 Temp 变量是否被定义过?
    • 如果 Temp 没有被定义过,那么变量 Temp 的值就是“Val”
    • 如果 Temp 先前被定义过,那么这条语将什么也不做
    • 注意:赋值方式是递归赋值
  5. 替换赋值 $(val:a=b)

    • 格式是 “$(var:a=b)” 或 “${var:a=b}”

      1
      2
      foo := a.1o b.o c.o 
      bar := $(foo:.o=.c) #foo里面的 .o 被替换为 .c
  6. 变量的多层引用:

    • 类似于 shell ${!Value}, makefile 中的格式为 $($(Value))

      1
      2
      3
      Temp = 2025
      Value = Temp
      echo $($(Value)) #输出结果2025
  7. 追加赋值 += :

    1
    2
    3
    Temp=1.c 2.c
    Temp+=3.c
    现在 Temp 等于 1.c 2.c 3.c
  8. 特殊变量:

    Make3

指定目标与伪目标:

  • all 这个伪目标是所有目标的目标,其功能一般是编译所有的目标
  • clean 这个伪目标功能是删除所有被 make 创建的文件
  • install 这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去
  • print 这个伪目标的功能是例出改变过的源文件
  • tar 这个伪目标功能是把源程序打包备份。也就是一个tar文件
  • dist 这个伪目标功能是创建一个压缩文件,一般是把tar文件压成 Z 文件或是 gz 文件
  • TAGS 这个伪目标功能是更新所有的目标,以备完整地重编译使用
  • check 和 test 这两个伪目标一般用来测试 makefile 的流程
1
2
3
4
5
6
7
8
9
10
.PHONY:all

all:Target1 Target2 Target3

Target1:
@echo "Target1 是终极目标"
Target2:
@echo "Target2 是终极目标"
Target3:
@echo "Target3 是终极目标"
  • 执行 make 会把Target1 Target2 Target3全部执行

参考链接: