码迷,mamicode.com
首页 > 其他好文 > 详细

Makefile 备忘录

时间:2015-08-27 13:38:58      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

一、主体框架

target... : prerequisites ...

command

    ...

    ...

------------------------------------------------------------------------------------------------------------

Target:目标文件,可以是Object File,也可以是执行文件。还可以是一个标签;

Prerequisites:生成target所需要的文件或是目标;

Command:make需要执行的命令 注:如果以[Tab] 开头,则会被认为是command;

二、主体执行流程

1.读入所有的Makefile。

2.读入被include的其它Makefile。

3.初始化文件中的变量。

4.推导隐晦规则,并分析所有规则。

5.为所有的目标文件创建依赖关系链。

6.根据依赖关系,决定哪些目标要重新生成。

7.执行生成命令。

三、关键字

1、  ~  代表当前目录                如:~/test

2、  *  匹配所有                     如:*.c

3、  VPATH  为make指定搜索目录     如:VPATH = ~/test

4、  vpath   为具体种类的文件指定搜索目录   如:vpath%.c test  .c文件在test中搜索

5、  @echo  向屏幕输出信息          注:命令前带@ 代表这行命令不会输出出来

6、  -       阻止命令出错make退出  如:-rm –f *.o

7、  MAKE   在makefile中调用make   如:cd subdir&& $(MAKE)

8、  变量的使用 赋值:A=1 A:=$(B) A?=${B}  A+=$(C)  注:和宏一样直接替换

9、  Override 变量前的标识符代表此变量是命令行赋值的,但是你想在makefile中自己赋值 override <v> += <text>

10、define 可以定义多行变量、命令包

11、环境变量 类似全局的            如:CFLAGS MAKEFILESMAKECMDGOALS

12、目标变量 类似局部变量          如:prog: CFLAGS=-g

13、模式变量 类似目标变量          如:%.o:CFLAGS=-O

14、ifeq ifneq ifdef ifndef

15、-f 指定makefile                 如:make –f hchen.mk

16、.PHONY 指定伪目标              如:.PHONY: all

17、include 引用其他make文件      注:-I --include-dir可以为其指明include搜索路径

18、-B   所有的目标都得重新编译

19、-C <dir>      指定读取Makefile读取的目录

20、--debug[=<options>]     输出make的调试信息

21、-e   指明环境变量的值覆盖makefile中定义的变量的值

22、-f=<file>     指定需要执行的makefile

23、-i    在执行时忽略所有的错误

24、-I <dir> 指定一个被包含makefile的搜索目标。可以使用多个“-I”参数来指定多个目录。

25、-j [<jobsnum>]  指同时运行命令的个数

26、-k   出错也不停止运行

27、-l <load>     指定make运行命令的负载

28、-n   仅输出执行过程中的命令序列,但并不执行

29、-o <file>      不重新生成的指定的<file>,即使这个目标的依赖文件新于它

30、-p   输出makefile中的所有数据,包括所有的规则和变量

31、-q   不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新。如果是0则说明要更新,如果是2则说明有错误发生

32、-r    禁止make使用任何隐含规则

33、-R   禁止make使用任何作用于变量上的隐含规则

34、-s   在命令运行时不输出命令的输出

35、-S   取消“-k”选项的作用

36、-t    相当于UNIX的touch命令,只是把目标的修改日期变成最新的,也就是阻止生成目标的命令运行

37、-v   输出make程序的版本、版权等关于make的信息

38、-w  输出运行makefile之前和之后的信息

39、--no-print-directory 禁止“-w”选项

40、-W <file>    假定目标<file>需要更新,如果和“-n”选项使用,那么这个参数会输出该目标更新时的运行动作

41、--warn-undefined-variables  只要make发现有未定义的变量,那么就输出警告信息

      

42、$@ 规则中的目标文件集

43、$%  仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"

44、$<  依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集

45、$?   所有比目标新的依赖目标的集合

46、$^  所有的依赖目标的集合

47、$+  这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标

48、$*   这个变量表示目标模式中"%"及其之前的部分


49、export  向下传递变量

四、函数

1、 模式 $(<function><arguments> )

<function>就是函数名,make支持的函数不多。<arguments>是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。

2、常用函数

$(subst<from>,<to>,<text> )

功能:把字串<text>中的<from>字符串替换成<to>。

返回:函数返回被替换过后的字符串。

 

$(patsubst<pattern>,<replacement>,<text> )

功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。

返回:函数返回被替换过后的字符串。

 

$(strip <string> )

功能:去掉<string>字串中开头和结尾的空字符。

返回:返回被去掉空格的字符串值。

 

$(findstring <find>,<in> )

功能:在字串<in>中查找<find>字串。

返回:如果找到,那么返回<find>,否则返回空字符串。

 

$(filter<pattern...>,<text> )

功能:以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式。

返回:返回符合模式<pattern>的字串。

 

$(filter-out <pattern...>,<text>)

功能:以<pattern>模式过滤<text>字符串中的单词,去除符合模式<pattern>的单词。可以有多个模式。

返回:返回不符合模式<pattern>的字串。

 

$(sort <list> )

功能:给字符串<list>中的单词排序(升序)。

返回:返回排序后的字符串。

 

$(word <n>,<text> )

功能:取字符串<text>中第<n>个单词。(从一开始)

返回:返回字符串<text>中第<n>个单词。如果<n>比<text>中的单词数要大,那么返回空字符串。

 

$(wordlist<s>,<e>,<text> )

功能:从字符串<text>中取从<s>开始到<e>的单词串。<s>和<e>是一个数字。

返回:返回字符串<text>中从<s>到<e>的单词字串。如果<s>比<text>中的单词数要大,那么返回空字符串。如果<e>大于<text>的单词数,那么返回从<s>开始,到<text>结束的单词串。

 

$(words <text> )

功能:统计<text>中字符串中的单词个数。

返回:返回<text>中的单词数。

 

$(firstword <text> )

功能:取字符串<text>中的第一个单词。

返回:返回字符串<text>的第一个单词。

 

$(dir <names...> )

功能:从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。

返回:返回文件名序列<names>的目录部分。

 

$(notdir <names...> )

功能:从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠(“/”)之后的部分。

返回:返回文件名序列<names>的非目录部分。

 

$(suffix <names...> )

功能:从文件名序列<names>中取出各个文件名的后缀。

返回:返回文件名序列<names>的后缀序列,如果文件没有后缀,则返回空字串。

 

$(basename <names...> )

功能:从文件名序列<names>中取出各个文件名的前缀部分。

返回:返回文件名序列<names>的前缀序列,如果文件没有前缀,则返回空字串。

 

$(addsuffix<suffix>,<names...> )

功能:把后缀<suffix>加到<names>中的每个单词后面。

返回:返回加过后缀的文件名序列。

 

$(addprefix<prefix>,<names...> )

功能:把前缀<prefix>加到<names>中的每个单词后面。

返回:返回加过前缀的文件名序列。

 

$(join <list1>,<list2> )

功能:把<list2>中的单词对应地加到<list1>的单词后面。如果<list1>的单词个数要比<list2>的多,那么,<list1>中的多出来的单词将保持原样。如果<list2>的单词个数要比<list1>多,那么,<list2>多出来的单词将被复制到<list2>中。

返回:返回连接过后的字符串。

 

$(foreach<var>,<list>,<text> )

功能:把list中的值挨个赋值给var,text一般会引用var

返回:返回list中的所有值

 

$(if <condition>,<then-part>,<else-part>)

功能:如果<condition>为真则返回<then-part> 否则返回<else-part>

返回:如上所述

 

$(call<expression>,<parm1>,<parm2>,<parm3>...)

功能:类似format

返回:返回格式化后的值

 

$(origin <variable> )

功能:指明参数的来源

返回:undefined default environment file command line override automatic

 

shell

功能:shell 函数也不像其它的函数。顾名思义,它的参数应该就是操作系统Shell的命令。它和反引号“`”是相同的功能。这就是说,shell函数把执行操作系统命令后的输出作为函数

 

$(error <text ...> ) $(warning<text ...> )

warning函数很像error函数,只是它并不会让make退出,只是输出一段警告信息,而make继续执行

五、隐藏的规则

1、 由目标默认的推导出依赖文件  如:<n>.o”的目标的依赖目标会自动推导为“<n>.c”…

 



版权声明:本文为博主原创文章,未经博主允许不得转载。

Makefile 备忘录

标签:

原文地址:http://blog.csdn.net/pppaass/article/details/48023955

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!