查看: 880|回复: 0

[技术交流] makefile规则简单整理

[复制链接]

8

主题

10

帖子

28

积分

助理工程师

Rank: 1

积分
28
发表于 2019-5-16 13:01:20 | 显示全部楼层 |阅读模式
一、一个完整的makefile包含5部分内容:显式规则、隐含规则、变量定义、指示符和注释
二、Makefile文件的命名
1、make 会在工作目录下按照文件名顺序寻找makefile 文件读取并执行,查找的文件名顺序为: “GNUmakefile”、“makefile”、“Makefile”。推荐使用"Makefile"或者"makefile","GUNmakefle"只有在GUN make下才能被识别,因此不推荐使用"GUNmakefle"作为Makefile文件名。
三、包含其它的Makefile文件
1、Makefile 中包含其它文件所需要使用的关键字是“include”,基本格式如下:
include filenames...
四、Makefile规则
4.1、order-only”依赖和常规依赖
order-only”依赖通常以“|”和常规依赖分割开,常规依赖在左边,order-only”依赖在右边,示例:
LIBS=libtest.a
foo:foo.c|$(LIBS)
如果最终目标foo存在,当常规依赖foo.c被修改后,执行make会更新foo。而更改LIBS后,则不会更新foo.
4.2、Makefile通配符
1)~ :代表宿主目录
        示例: ”~/bin“,代表“ /home/username/bin/”(当前用户宿主目录下的 bin 目录)
2)
注意:Makefile通配符可以出现在规则的目标、依赖以及规则的命令中,但是不能出现在其它上下文之中,例如变量。如果要在变量定义中使用通配符可以用“wildcard”关键词,如objects = $(wildcar *.o)。
4.3、伪目标
4.4、shell规则
1)在命令行前面([TAB]字符之后)加上“-”,可以忽略该命令行的执行错误。即当该条命令执行失败的时候不会终止整个Makefile。也可以使用“-i”、“—ignore-errors”或者“.IGNORE”来忽略命令行的执行错误。
示例:clean:
-rm *.o

五、Makefile目录搜索
5.1、一般搜索(VPATH)
1)通过变量“ VPATH”可以指定依赖文件的搜索路径,当规则的依赖文件在当前目录不存在        时, make 会在此变量所指定的目录下去寻找这些依赖文件。
2)定义变量“ VPATH”时,使用空格或者冒号( :)将多个需要搜索的目录分开。 make
搜索目录的顺序是按照变量“ VPATH”定义中的目录顺序进行的。基本格式如下:
VPATH = src:../headers
目录的查找顺序:当前目录-src-../headers
3)变量“ VPATH”指定的路径对所有文件有效
5.2、选择性搜索(vpath)
1)"vpath"不是一个变量,而是一个 make 的关键字,它可以为不同类型的文件指定不同的搜索路径。它的使用方法有三种:
---vpath PATTERN DIRECTORIES
为所有符合模式“ PATTERN”的文件指定搜索目录“ DIRECTORIES”。多个目录使用空格或者                冒号(:)分开。类似上一小节的“ VPATH”变量。
---vpath PATTERN
清除之前为符合模式“ PATTERN”的文件设置的搜索路径。
--- vpath
清除所有已被设置的文件搜索路径。
2)实例:vpath %.h ../headers
六、Makefile运算符
6.1、赋值运算符
1)=  最基本的赋值
2):=  覆盖之前的值,该赋值不会被递归展开
3)?= 如果没有被赋值过就赋予等号后面的值,如果之前赋值过则使用之前的值,本次赋值无效。
4)+= 是添加等号后面的值
示例:https://www.cnblogs.com/wanghuaijun/p/8092747.html
6、自动化变量和模式规则
6.1、模式规则
在模式规则中需要包含模式字符“%”(一个),“%”所在的目标被用来匹配一个文件名,它可以匹配任何非空字符串,例如:"%.c"表示以".c"结尾的文件名(文件名的长度至少为3)而"s.%.c"则表示以"s."开头,".c"结尾的文件名(文件名的长度至少为5)。
6.2、自动化变量
1)$@ 规则中目标文件的集合。
2)$<   依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
3)$^ 所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
示例:  test1.o test2.o test3.o:test1.c test2.c test3.c
                        gcc -o $@ $^
$@=test1.o test2.o test3.o
$^=test1.c test2.c test3.c
六、Makefile选项CFLAGS,LDFLAGS,LIBS
6.1、CFLAGS
1)-I 指定头文件的路径,如:CFLAGS=-I/usr/include -I/path/include。
2)-Wall 打开告警
3)-werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程
七、Makefile打印调试信息
7.1、使用echo输出调试信息,前面加上“@”表示不在终端显示
1)@echo + "调试信息"
示例:echo "打印调试信息"
2)@echo $(files)
7,2、使用info/warning/error增加调试信息
1): $(info, "here add the debug info")
           但是此不能打印出.mk的行号
       2): $(warning, "here add the debug info")
       3): $(error "error: this will stop the compile")
             这个可以停止当前makefile的编译
八、make的递归执行
make 的递归过程指的是:在 Makefile 中使用“ make”作为一个命令来执行本身
或者其它 makefile 文件的过程。
九、Makefile关键词
9.1、export 和 unexport
export  该关键词修饰的变量可以在子Makefile中使用,如果子Makefile中存在同名的变量,则以子Makefile中的变量为准,除非使用make的“-e”选项。如果不希望该变量在子Makefile中使用,可以使用unexport关键词。
一个不带任何参数的指示符“ export”指示符:export,含义是将此 Makefile 中定义的所有变量传递给子 make 过程。如果不需要传递其中的某一个变量,可以单独使用指示符“ unexport”来声明这个变量。
9.2、MAKELEVEL
该关键词代表了Makefile递归的深度,最上层的Makefile里面MAKELEVEL=0,以此类推。
十、Makefile变量
10.1、定义一个空格
nullstring :=
space := $(nullstring) # end of the line
在使用注释时,“#”(注释)最好单独写在一行,在单独定义变量时,变量的结尾和注释之间的空格会被作为变量的一部分。如:
dir := /foo/bar # directory to put the frobs in
变量“ dir”的值是“ /foo/bar ”(后面有 4 个空格)
10.2、变量的替换引用
格式:$(VAR:A=B)”(或者“ ${VAR:A=B}”),意思是,将变量“ VAR”中所有以“ A”字符结尾的变量(通常是文件名)替换为以“ B”结尾的变量(通常是文件名)。如:
foo := a.o b.o c.o o.o
bar := $(foo:.o=.c)
变量展开后,bar的值为“ a.c b.c c.c o.c”
10.2、override 指示符
格式:override VARIABLE = VALUE或override VARIABLE := VALUE
说明:override 关键词可以防止变量被覆盖,使用override关键词修饰的变量后续使用“=”或者“:=”对该变量的操作将无效,如果想要对该变量进行修改则需要加上override关键词。
10.3、Makefile目标指定变量
格式:TARGET ... : VARIABLE-ASSIGNMENT 或者:
    TARGET ... : override VARIABLE-ASSIGNMENT
说明:一个多目标指定的变量的作用域是所有这些目标的上下文,它包括了和这个目标相关的所有执行过程。它不会改变之前定义的同名变量的值。
示例:prog : CFLAGS = -g
   prog : prog.o foo.o bar.o
这个例子中,无论 Makefile 中的全局变量“ CFLAGS”的定义是什么。对于目标“ prog”以及其所引发的所有(包含目标为“ prog.o”、“ foo.o”和“ bar.o”的所有
规则)规则,变量“ CFLAGS”值都是“ -g”。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表