makefile

Makefile 语法

  • 操作符
    1、BUILD_CONFIG_FILE ?= $(CURDIR)/build.config  ==?\=== 该操作符的意思是只有BUILD_CONFIG_FILE此变量之前没有被赋值过的情况下才会对这个变量进行赋值。
    2、 关于 =、:= 和 += 的区别:

    += 是添加等号后面的值, 
        如:x本来是X, 通过 x += YZ 运算之后x的值就成为XYZ 
    
    例:
    x := sb;
    y := u$(x); 
    x := all
    运行结果是 x = all, y = usb. 
    把 := 换成 = 运行的结果则会是: x = all, y = uall
  • 关于makefile中的 @和@echo
    makefile中的命令默认是回显的(不确定是不是所有的命令),命令前面加上@之后该命令不会回显在标准输出上,但是命令还是会正常执行

  • 自动变量
    自动变量是make自动根据规则生成的,不需要用户显式的指出相应的文件或目标名称。以下就是七个最核心的自动变量:
    $@     目标文件的文件名;
    $%     仅当目标文件为归档成员文件(.lib 或者 .a)时,显示文件名,否则为空;
    $<      依赖(prerequisite)列表里面的第一个文件名;
    $?      所有在prerequisite列表里面比当前目标新的文件名,用空格隔开;
    $^      所有在prerequisite列表中的文件,用空格隔开; 如果有重复的文件名(包含扩展名),会自动去除重复;
    $+      与$\^相似,也是prerequisite列表中的文件名用空格隔开,不同的是这里包含了所有重复的文件名;
    $*      显示目标文件的主干文件名,不包含后缀部分。此外,上面的每个变量都带有两个不同的变种,用于适应不同种类的make。分别是在后面附加一个“D”或者“F”。例如,$(^D)就是代表所有依赖文件的路径,$(<F) 表示依赖文件第一个的文件部分的值。

  • makefile 函数
    1、notdir,取文件名函数,即从文件名序列中取出非目录部分; ==如:$(notdir “/User/lgh/lgh/work/ranch”) \==>ranch==
    2、realpath,返回绝对路径
    3、strip,去掉字串开头和结尾的空字符,并将其中多个连续空字符合并为一个空字符;==如:$(strip “  a b  c  ”) \==>” a b c “, $(strip   a  b  c  )\==> a b c==
    4、$(wildcard PATTERN), 该函数用来获取当前工作目录下匹配此模式的所有文件列表,使用空格分开
    5、\$(subst From, To, String); 将字符串String中的子字符串From替换成To并且返回新字符串,==如:\$(subst cpp,o,test1.cpp test2.cpp)返回的结果是test1.o test2.o==
    6、call, 创建新的参数化函数;

    log = "====debug===" $1 "====end===" $2
    hao_test:
        @echo $(call log,"makeing","makeed")
    输出结果是:====debug=== makeing ====end=== makeed

    7、查找字符串函数: $(findstring ,),功能: 在字符串 \ 中查找 \ 字符串
    8、\$(foreach \,\,\),循环遍历\,最后按text输出

    
    #makefile 文件内容如下
    
    targets := a b c d
    objects := $(foreach i,$(targets),$(i).o)
    
    all:
        @echo $(targets)
        @echo $(objects)
    
    $ make
    a b c d
    a.o b.o c.o d.o

    9、if函数

    语法:
    $(if \<condition>,\<then-part>)
    $(if \<condition>,\<then-part>,\<else-part>)

    10、加前缀函数: $(addprefix <prefix>,<names...>)
    功能: 把前缀 <prefix> 加到 <names> 中的每个单词前面
    返回: 加过前缀的文件名序列
    11、过滤函数: $(filter < pattern…>, < text>)
    功能: 以 模式过滤字符串 , 保留 符合模式 的单词, 可以有多个模式
    返回: 符合模式 的字符串
    12、反过滤函数: $(filter-out < pattern…>,),该功能和filter函数相反

  • 关于clean

    .PHONY: clean  
    clean:
        -rm lexer.c $(object) count_words 

    .PHONY表示clean是一个“伪目标”,而rm命令前面的减号则表示,不管出现什么问题都要继续做后面的事情。 ==PS:clean规则不要放在makefile的开头,不然就会变成make的默认目标了。==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值