makefile 文件的编写

参考

make 的工作过程

流程:

  • 查找是否有目标文件
    • 没有目标文件: 执行命令生成目标文件
    • 有目标文件,查看是否有依赖对象:
      • 没有依赖对象:报错(不需要跟新)
      • 有依赖对象,判断依赖对象是否更改,
        • 依赖对象更改:重生成目标文件
        • 依赖对象没有更改:不变
  • 重复上述工作知道makefile文件末尾

格式(前置条件和规则(多条命令组成规则)最少出现一个,缺少规则则会搜索内置的转换规则):

目标文件:依赖文件
	命令

如(可以测试只有test:test.c 会怎么样):

test:test.c
	gcc -o test test.c

伪目标

make 的目标可以是一个文件或者多个文件,又或者是一个操作,如果是一个操作就称为伪目标,如下:

clean:
	rm *.c

但是如果有clean这个文件那么make命令认为这个一个目标文件,并且没有依赖对象,不需要跟新就不会执行rm命令,这是就需要声明clean是伪目标,如下

.PHONY clean
clean: 
	rm *.c

其他

  • 使用 .RECIPEPREFIX = >更改命令前为 >
  • 两条不同行的命令是不同的进程,产生的变量不能相互访问,可以在后面接着写或者使用\将两行看作一行,主要要加分号
  • #为注释
  • 正常执行make会打印每条命令,称之为回声,关闭在命令前加@
  • makefile文件可以直接使用=定义变量,但使用时要加$(bash 的规则)
    • 上述定义会产生一个问题,如c1=c2,是定义时扩展(静态)还是运行时扩展(动态),为此产生了一下定义方法
VARIABLE = value
# 在执行时扩展,允许递归扩展。

VARIABLE := value
# 在定义时扩展。

VARIABLE ?= value
# 只有在该变量为空时才设置值。

VARIABLE += value
# 将值追加到变量的尾端
  • $@: 当前目标
  • $<: 第一个前置条件

你可能感兴趣的:(linux)