Makefile知识总结

1、.PHONY:声明为伪目标,当目标不依赖于任何文件时,在执行make的时候会认为该目标(没有变化)已经存在,不再执行底下的命令。
    例如:clean:
             @rm -f main2.o
 
2、wildcard:匹配指定模式的文件
   $(wildcard *.c):匹配所有的.c文件

3、define:定义一个命令包,在执行make时,命令包中的每个命令被依次执行
函数定义:
define make
    @make -C $(BR) PLATFORM=$(PLATFORM) TAG=$(1) $(2)  
endef
函数调用:
$(call make,$(PLATFORM)_debug,vpp-wipe)

4.make -C $(BR):进入到指定的目录执行make
  make -c :只编译不连接
5.特殊赋值符号:
        = 是最基本的赋值
       := 是覆盖之前的值
      ?= 是如果没有被赋值过就赋予等号后面的值;如果已赋值,则不变
      += 是添加等号后面的值

举例:
ifdef DEFINE_VRE
    VRE = “Hello World!”
else
endif
ifeq ($(OPT),define)
    VRE ?= “Hello World! First!”
endif
ifeq ($(OPT),add)
    VRE += “Kelly!”
endif
ifeq ($(OPT),recover)
    VRE := “Hello World! Again!”
endif
all:
    @echo $(VRE)
敲入以下make命令:
make DEFINE_VRE=true OPT=define 输出:Hello World!
make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!
make DEFINE_VRE=true OPT=recover  输出:Hello World! Again!
make DEFINE_VRE= OPT=define 输出:Hello World! First!
make DEFINE_VRE= OPT=add 输出:Kelly!
make DEFINE_VRE= OPT=recover 输出:Hello World! Again!

6.if语句:
$(if $(ARCH),ARCH=$(ARCH),)//if语句,如果ARCH变量定义了,那么将返回第一个逗号后面的内容,否则返回第2个逗号后面的内容,所以模型为:$(if CONDITION,then value1,else value)
例如:

7.foreach语句
 $(foreach <var> ,<list> ,<text>)

这个函数的意思是,把参数<list>;中的单词逐一取出放到参数<var>;所指定的变量中,然后再执行<text>;所包含的表达式。每一次<text>;会返回一个字符串,循环过程中,<text>;的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>;所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。


8.shell语句
  调用shell语句    
9.eval语句

10.wildcard语句
   功能是展开成一列所有符合由其参数描述的文 件名,文件间以空格间隔。
    SOURCES = $(wildcard *.c)
    这行会产生一个所有以 '.c' 结尾的文件的列表,然后存入变量 SOURCES 里

11.函数调用call

12.patsubst ( patten substitude, 匹配替 换的缩写)函数
它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的 由空格分隔的字列。例如,处理那个经过上面定义后的变量,
    
    OBJS = $(patsubst %.c,%.o,$(SOURCES))
    
    这行将处理所有在 SOURCES 字列中的字(一列文件名),如果它的 结尾是 '.c' ,就用 '.o' 把 '.c' 取代。注意这里的 % 符号将匹 配一个或多个字符,而它每次所匹配的字串叫做一个‘柄’(stem) 。 在第二个参数里, % 被解读成用第一参数所匹配的那个柄。

13.value函数
$(value VARIABLE)
函数功能:不对变量“VARIBLE”进行任何展开操作,直接返回变量“VARIBALE”代表的值。这里“VARIABLE”是一个变量名,一般不包含“$”(当然,除了计算的变量名),
返  回 值:变量“VARIBALE”所定义文本值(不展开其中的变量或者函数应用)。

14.origin函数
$(origin VARIABLE)
函数功能:函数“origin”查询参数“VARIABLE”(通常是一个变量名)的出处。

15.error 函数
$(error TEXT…)
函数功能:产生致命错误,并提示“TEXT…”信息给用户,之后退出make的执行


16.$(addsuffix SUFFIX,NAMES…)
函数名称:加后缀函数—addsuffix。
函数功能:为“NAMES…”中的每一个文件名添加后缀“SUFFIX”。参数“NAMES…”为空格分割的文件名序列,将“SUFFIX”追加到此序列的每一个文件名的末尾。

返  回 值:以单空格分割的添加了后缀“SUFFIX”的文件名序列。
示例:$(addsuffix .c,foo bar)返回值是“foo.c bar.c”。


17.$(addprefix PREFIX,NAMES…)
函数名称:加前缀函数—addprefix。
函数功能:为“NAMES…”中的每一个文件名添加前缀“PREFIX”。参数“NAMES…”是空格分割的文件名序列,将“SUFFIX”添加到此序列的每一个文件名之前。

返  回 值:以单空格分割的添加了前缀“PREFIX”的文件名序列。
示例:$(addprefix src/,foo bar)返回值是“src/foo src/bar”。


18.$(notdir NAMES…)
函数名称:取文件名函数——notdir。
函数功能:从文件名序列“NAMES…”中取出非目录部分。目录部分是指最后一个斜线(“/”)(包括斜线)之前的部分。删除所有文件名中的目录部分,只保留非目录部分。
返  回 值:文件名序列“NAMES…”中每一个文件的非目录部分。

19.$(suffix NAMES…)
函数名称:取后缀函数—suffix。

20.$(findstring FIND,IN)
函数名称:查找字符串函数—findstring。
函数功能:搜索字串“IN”,查找“FIND”字串。
返  回 值:如果在“IN”之中存在“FIND”,则返回“FIND”,否则返回空。
函数说明:字串“IN”之中可以包含空格、[Tab]。搜索需要是严格的文本匹配。

21.$(word N,TEXT)
函数名称:取单词函数—word。
函数功能:取字串“TEXT”中第“N”个单词(“N”的值从1开始)。
返  回  值:返回字串“TEXT”中第“N”个单词。
函数说明:如果“N”值大于字串“TEXT”中单词的数目,返回空字符串。如果“N”为0,出错!

22.$(wordlist S,E,TEXT)
函数名称:取字串函数—wordlist。
函数功能:从字串“TEXT”中取出从“S”开始到“E”的单词串。“S”和“E”表示单词在字串中位置的数字。
返  回 值:字串“TEXT”中从第“S”到“E”(包括“E”)的单词字串。
函数说明:“S”和“E”都是从1开始的数字。当“S”比“TEXT”中的字数大时,返回空。如果“E”大于“TEXT”字数,返回从“S”开始,到“TEXT”结束的单词串。如果“S”大于“E”,返回空。

23.$(words TEXT)
函数名称:统计单词数目函数—words。
函数功能:字算字串“TEXT”中单词的数目。
返  回 值:“TEXT”字串中的单词数。

24.make V=0 -------make V=1 will produce verbose output, make V=0 less verbose output(相当于brief output).

25. make -n :查看makefile中的环境变量

26.13.链接的时候查找顺序是:
    -L 指定的路径, 从左到右依次查找
    由 环境变量 LIBRARY_PATH 指定的路径,使用":"分割从左到右依次查找
    /etc/ld.so.conf 指定的路径顺序
    /lib 和 /usr/lib (64位下是/lib64和/usr/lib64)

27.
$$:在makefile中会被替换成一个$。
    相关资料是这么描述的:makefile中变量在声明时需要赋予初值,在使用时,需要在使用的变量前加"$"符号,但是最好使用"()"或者"{}"将变量包括起来。如果想使用真实的"$"符号,需要用"$$"来表示

Makefile中所有以$打头的单词都会被解释成Makefile中的变量。如果你需要调用shell中的变量(或者正则表达式中锚定句位$),都需要加两个$符号($$)

28.在Makefile中执行shell命令,一行创建一个进程来执行。这也是为什么很多Makefile中有很多行的末尾都是“;  \”,以此来保证代码是一行而不是多行,这样Makefile可以在一个进程中执行,例如:
SUBDIR=src example
all:
    @for subdir in $(SUBDIR); \
    do\
        echo "building "; \
    done上述可以看出for循环中每行都是以”; \”结尾的。

29. filter
$(filter <pattern...>,<text> )
名称:过滤函数——filter。
功能:以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式。
返回:返回符合模式<pattern>的字串。
举例:
sources := foo.c bar.c baz.s ugh.h
$(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”

30. make V=1 :打印编译时的详细信息(如编译选项),默认V=0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值