美文网首页
Make学习笔记

Make学习笔记

作者: 小码弟 | 来源:发表于2019-01-07 13:33 被阅读0次

make 是一个根据指定Shell命令进行构建的工具。规定要构建哪个文件,它依赖于哪些源文件,当这些文件变动时,如何重新构建

1. Makefile的格式

make的规则写在名为Makefile的文件里,make根据这个文件进行构建。

1. 1 规则格式

<target> : <prerequisites>
 [tab] <commands>

其中,

  • target通常是文件名,表示你想构建的文件,也可以是带有具体含义的名称(伪目标)
  • prerequisites是前置条件,要构建出target,需要先满足前置条件
  • commands是构建出target具体执行的命令

1.2 target

一个目标(target)通常是文件名,多个目标之间用空格隔开。
除了具体的文件名,还可以是伪目标(PHONY)

clean:
  rm *.o

$ make clean将删除所有目标文件
但是,如果当前文件中存在clean文件,那么这个命令将不会执行。解决办法是使用.PHONY.

.PHONY: clean
clean:
  rm *.o

每次执行make命令,不管有没有名为clean的文件,都会删除目标文件。

1.3 prerequisites

前置条件(prerequisites)通常是一组文件,空格分隔。指明目标的构建条件:只要有一个前置条件文件不存在或更新,就重新构建目标。

result.txt: source.txt
  cp source.txt result.txt

在上面的规则中,如果source.txt不存在,那么必须在这条规则上面再添加一条规则生成source.txt

source.txt:
  echo "source txt" >>source.txt

如果要生成多个文件,使用下面写法

source: file1 file2 file3

这里的source是伪目标,只有三个前置文件,没有对应命令

1.4 commands

命令(commands)表示如何构建目标文件,由一行或多行shell命令组成。
需要注意的是,每行命令是在单独的shell中执行的,shell之间没有继承关系。

test:
  export var=hello
  echo $$var

结果不会输出hello,因为两个shell不在同一环境。
一个解决办法是写在一行,分号分开。或者使用 \串接,或者加上.ONESHELL

# 或者
.ONESHELL:
test:
  export var=hello; echo $$var
  #或者
  export var=hello; \
  echo $$var

2. Makefile文件语法

2.1 注释

#表示注释

result.txt: source.txt
 # 这是注释
 cp source.txt result.txt

2.2 echoing

make会将每条命令包括注释输出,再执行命令。
如果不想输出,就在语句前面加上@

2.3 通配符

Makefile通配符与Bash一致。

2.4 模式匹配

make允许对文件名进行匹配,用到的是%匹配符。比如,当前有a.c 和 b.c 两个源文件,要编译成目标文件。

%.o : %.c

等同于

a.o : a.c
b.o : b.c

2.5 变量和赋值

make允许自定义变量

text = hello make
test:
  @echo $(text)

变量要放在$()里面才能被正确解析。

我们都知道,Shell变量都以开头。但在Makefile引用shell变量,需要再加上一个,因为make会对$进行转义。

test:
  @echo $$PPID

2.6 内置变量

make提供了一系列内置变量。常见的有

内置变量 含义
CC 当前使用的编译器
MAKE 当前使用的构建工具
CXX C++编译器
CPP C与预处理器,标准输出
AS 编译汇编语言

2.7 自动变量

自动变量 含义
$@ 指代当前目标
$< 指代第一个前置条件
$^ 指代所有前置条件,空格分隔
$* 匹配符%匹配的部分
(@D)/(@F) 分别指向$@的目录名和文件名

参考:

阮一峰的博客之make学习
Makefile文件教程
GNU Make手册

相关文章

网友评论

      本文标题:Make学习笔记

      本文链接:https://www.haomeiwen.com/subject/ieferqtx.html