makefile

Posted realplay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile相关的知识,希望对你有一定的参考价值。

等号的使用
= 递归扩展
:= 简单扩展
?= 未定义则赋值
 
字符串处理
$(var:suffix=replacement) 替换,等效于:$(patsubst %suffix,%replacement,$(var))
$(foo:%.o=%.c)
 
override VARIABLE = VALUE
如果不希望命令行指定的变量值替代在Makefile中的变量定义,那么我们需要在Makefile中使用指示符“override”来对这个变量进行声明
 
一些内置特殊变量
MAKECMDGOALS 即make的target。
CURDIR, PWD 举例:cd a; make -C b; means: CURDIR=b, PWD=a
[email protected] 扩展成当前规则的目标名, 
$< 扩展成依靠列表中的第一个依赖文件,
$^ 扩展成整个依赖列表(除掉了里面所有重复的文件名)
$?比目标文件(target)新的dependent file.而$?的值只有在使用外显示(explicit)的规则时才会被设定.
$*是内存dependent file的文件名,不含扩展名. 
 
Shell定义的特殊变量
$#:     内存位置参数的个数
$$:     shell script的进程代号(pid)
$!:     最后一个后台进程代号
$*:     所有位置参数字符串,不限于9个参数
 
 
隐含规则
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o [email protected]
 
假象目标

告诉 make 不用检查它们是否存在于磁碟上,也不用查找任何隐含规则,直接假设指定的目的需要被更新。在 makefile 里加入下面这行包含上面规则的规则:

 

      .PHONY : veryclean

 
     
函数 (Functions)
用一个 $ 符号跟开括号,函数名,空格后跟一列由逗号分隔的参数,最后 用关括号结束。
 
例如,在 GNU Make 里有一个叫 ‘wildcard‘ 的函数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。你可以像下面所示使用这个命令:

SOURCES = $(wildcard *.c)

 
另一个有用的函数是 patsubst  patten substitude, 匹配替换的缩写)函数。它需要3个参数——第一个是一个需要匹配的 式样,第二个表示用什么来替换它,第三个是一个需要被处理的 由空格分隔的字列。例如,
OBJS = $(patsubst %.c,%.o,$(SOURCES))
 
‘filter-out‘ 函数使用两个用空格分开的列表,它把第二列表中所有的存在于第一列表中的项目删除。我用它来处理 DEPS 列表,把所有已经存在的项目都删除,而只保留缺少的那些。
 
其他
如果 CPPFLAGS 指定了 -MD , 它的 .d 文件也被重新产生。
 
如果make命令后不带参数,即不指定目标,则默认使用makefile中发现的第一个目标,但不包括带有通配符(%)的目标。
在一条规则中,将忽略空行(只含有空格或制表符),而命令行必须以制表符为起始字符,忽略起始制表符与命令中间的空格和制表符。
 

 

以上是关于makefile的主要内容,如果未能解决你的问题,请参考以下文章

MakefileMakefile 中 LINUXINCLUDE 的作用

MakefileMakefile 中 LINUXINCLUDE 的作用

MakefileMakefile 中 LINUXINCLUDE 的作用

Makefile基础

makefile

makefile