make的简单使用个人整理篇
格式:
目标 〔属性。。。〕
分隔符 〔依赖文件〕 〔;命令菜单〕
{ < 制表符 > 命令菜单}
makefile 根据符号 tab 来辨认命令
make 命令的运行格式:
make 〔 option 〕 〔 macrodef 〕 〔 target 〕
make 将使用默认的 makefile 或 Makefile 作为配置文件
也可以指定配置文件,用参数- f
例如: make –f test1.mk
Option指出make的工作行为,make的具体选项有:
-c dir make在开始运行后的工作目录为指定目录
-e 不允许在makefile中队环境的宏赋值
-f filename 使用指定的文件作makefiel
-k 执行命令出错时,放弃改目标去维护其它目标
-n 按实际运行时的执行顺序现实命令,包括用@开头的命令,但不振的执行
-p -现实makefile中所有的宏定义,河内部规则
-r 忽略内部规则
-s 执行但不显示命令,常用来检查makefile的正确性
-S 执行make时 出错即退出
-t 修改每个目标文件的创建日期,但又不正的创建
-V 打印make的版本号
-x 将所有的宏定义输出的shell环境中
-i 忽略运行make 中的错误,而又不退出make
make 按规则中的依赖文件依次从左到右检查,除非依赖文件为源文件,否则 make 将递归方式检查该依赖文件的依赖文件。
可以用 touch 命令强行修改文件的修改时间
可以使用变量(宏)来缩减 makefile 的文件大小
定义: CC=gcc
引用: $(CC)
%o:%c
$(COMPILE) –o $@ $<
可以同时使用多个依赖文件匹配多个目标文件
例如:
io.o init.o:muprogram.h
配合上面的规则,执行命令,表示该目标文件还同时依赖于 muprogram.h 文件
可以使用特殊的目标文件( clean )
例如:
clean:
-rm $(OBJS)
make 不会自动执行 clean 目标, clean 也没有任何依赖文件
makefile 文件中的分隔符:
::表示目标文件将多次出现。使用“:”时, make 规定目标文件只能出现一次
: ^ 将指定的依赖文件和目标文件已有的依赖文件合并起来,作为新的依赖文件列表
:-清除原有的依赖文件,将新的依赖文件列表作为目标的文件列表
:!对每个更新过的依赖文件都执行一次命令菜单
: | 只在内部规则中使用???
Makefile 文件中的命令行属性:
默认情况下,系统执行每条命令,打印该命令,如果在运行命令时出错,就会退出 make
命令行属性的选项:
- 忽略该行的错误,继续执行下一命令
+ 强行执行该命令
@ 不显示命令行
makefile 文件中的目标文件属性:
格式 1 :
属性 1 属性 2 。。。:目标文件 1 目标文件 2 。。。
格式 2 :
目标文件 属性 1 属性 2 。。。:
常见的几种属性:
.IGNORE 忽略错误,继续执行
.SILENT 不现实目标文件下的命令行
.PRECIOUS 保留中间目标文件。默认情况下,退出 make 时,系统将自动删除临时的中间目标文件。
伪目标选项:
伪目标 就是程序执行的一些与目标文件本身没有直接关系的辅助性操作。
1. 自定义伪目标
要求系统中没有重名的文件
2. 内部伪目标
.ERROR: 依赖文件 1 。。。 当执行错误时,显示错误信息,并完成简单的错误处理
.INCLUDE: makefile 文件 1 。。。 当执行到该伪目标时,插入其他 makefile 文件的内容,并且执行该内容。
例如: .INCLUDE : make.mk
当其他 makefile 文件不在同一目录下,使用格式:
.INCLUDE:dir1 dir2 …
或 .INCLUDE:<dir/file>
.IMPORT: 宏名 1 。。。 在环境变量中查找宏名,并使用。不需要命令行
make 本身定义了一个依赖文件 .EVERYTHING 可以使用环境中的所以宏定义,而不需要逐一列出宏名。
例如:
.IMPORT:.EVERYTHING
.EXPORT: 宏名 1 。。。 导出宏名到环境文件中
.SETDIR = path 指定工作目录
make 的命令参数
………………
可以通过 3 中方式控制命令行的执行属性:
命令行、目标文件、 make 命令参数
当出现矛盾时,体现一般服从特殊的原则。
宏定义:( makefile 文件中的“宏”又叫做“变量”)
宏名 赋值符号 宏的值
其中,宏名不能以数字开头
赋值符号包括:
= 直接赋值到宏
:= 将后面的字符串常量赋值给宏
+= 使宏原来的值加上一个空格,再加上后面的字符串,作为新的宏值
宏的引用:
$( 宏名 )
或: ${ 宏名 }
内定义宏
1 、控制宏 控制 make 的属性,代表某些特殊的值
.MAKEDIR 调用 make 的绝对路径名
.NULL 空字符串
.OS 正在运行的操作系统名
.PWD 运行 make 时的活动工作目录的绝对路径名
.SHELL 运行命令行时启动的 SHELL 类型
调用格式: $ (宏名)
2 .属性宏 控制 make 的属性,作用域为整个 makefile 文件
调用格式 不必使用 $ 和括号
例如:
.IGNORE=$(.NULL)
动态宏
$@ 当前的目标文件名。当目标文件是库成员,则等于 lib 的名称。
$% 当前的目标文件名。当目标文件是库文件时,指示成员名
$> 类似 $@ ,但不能用于普通目标文件中
$* 等于目标文件去掉后缀的名字
$^ 当前目标文件在本规则中的依赖文件
$& 当前目标文件的所有 依赖文件
$? 当前目标文件的所有 的依赖文件中比目标文件新的文件列表
$< 当前规则的依赖文件中比目标文件新的文件列表
修改宏
d : 仅展开路径
b : 展开文件名,不包括扩展名
f : 展开文件名,包括扩展名
例如:
$(FILE:d)
替换宏中的字符串
宏名: s/ 原字符串 / 新字符串
宏名 :+ “后缀”、
宏名 :^ “前缀”
例如(宏 FILE=main ):
$(FILE:^”/user/”) 表示 /user/main
$(FILE:+”.o”) 表示 main.o
内部规则
make 的内部规则是系统或用户预先定义的一些特殊规则,它普遍适用于 makefile 文件中的各个目标文件,只要目标文件的后缀名相匹配。
内部规则的目标文件和依赖文件只使用后缀名来表示。
在 c 语言中涉及到的内部规则如下:
.c:
$(CC)$(CFLAGS) –O $@ $<
.c .o:
$(CC)$(CFLAGS) –c $<
其中, CC/CFLAGS 是 make 的预定义宏
内部规则可以是单后缀或双后缀
单后缀给出的是目标文件,而没有依赖文件。
双后缀的前一个后缀是后一个后缀的依赖文件,双后缀命令行体现了前一个后缀向后一个后缀转化的过程
在上例中,“ .o ”为后缀的目标文件依赖于“ .c ”为后缀的依赖文件,并且给出了转化过程。
另两个 make 的预定义宏:
MAKE/MAKEFLAGS :常用于在 makefile 文件中再调用一个 make 过程。适用于对 makefile 文件的模块化设计。
当“ .o ”为后缀的目标文件没有显式的规则文件时,系统根据匹配的内部规则,自动将该类的后缀名改为内部规则的依赖文件的后缀名,并以相应的值填写入规则的命令行中,实现一个完整的规则。
Make 的递归
可以使用宏 $(MAKE) 来递归调用 make 命令,执行子模块的 makefile
格式:
目标文件:
$(MAKE) –C 目录名
可以在各个 make 过程中,进行变量设置通信。
1. 使用一个被所有 makefile 包含的文件
2. 从顶级 make 中输出变量到他的子进程,它使用 export 关键字
文件中再调用一个make 过程。适用于对 makefile 文件的模块化设计。
当“ .o ”为后缀的目标文件没有显式的规则文件时,系统根据匹配的内部规则,自动将该类的后缀名改为内部规则的依赖文件的后缀名,并以相应的值填写入规则的命令行中,实现一个完整的规则。
Make 的递归
可以使用宏 $(MAKE) 来递归调用 make 命令,执行子模块的 makefile
格式:
目标文件:
$(MAKE) –C 目录名
可以在各个 make 过程中,进行变量设置通信。
1. 使用一个被所有 makefile 包含的文件
2. 从顶级 make 中输出变量到他的子进程,它使用 export 关键字
伪目标
.PHONY: clean
clean:
rm *.o temp