Makefile 自动变量&字符替换

一、自动变量:

$*:

不包括后缀名的当前依赖文件的名称这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是make所能识别的后缀名,所以,"$*"的值就是"foo"。

$+       

所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件

 $<        

第一个依赖文件的名称,如果依赖目标是以模式(即“%” )定义的,那么“$<”将是符合模式的一系列的文件集。注意,其是一个一个取出来的。

$?       

所有时间戳比目标文件晚的依赖文件,并以空格分开

 $@       

目标文件的完整名称(目标集合)在模式规则中,如果有多个目标,那么“$@”就是匹配于目标中模式定义的集合。注意其目标是一个一个取出来的。

 $^      

 所有不重复的目标依赖文件,以空格分开(区分$+)

 -:       

告诉make命令忽略所有的错误

@:     

 告诉make在执行命令前不要将命令显示在标准输出上

二、makefile 中的字符替换

1、字符替换

 

使用指定字符串替换变量中的后缀字符(串)格式:$(var:a=b)或${var:a=b} 注意:替换表达式中不能有空格
例如:

  src := acc bcc ccc
  obj := $(src:cc=o)

最后obj = ao bo co

 

2、模式字符串替换

使用%保留变量值中的指定字符串,其他部分替换为新字符
格式:$(var:a%b=x%y)或${var:a%b=x%y} 注意:替换表达式中不能有空格
例如:

  src := a123b.c a234b.c ajkhb.c
  obj := $(src:a%b.c=x%y)

最后 x123y.c x234y.c xjkhy.c

3、规则中的模式替换

    targets:target-pattern:prereq-pattern
        command1
        command2

作用:通过target-pattern(目标模式)从targets中匹配子目标,再通过prereq-pattern从子目标生成依赖,进而构成完整规则。
例:

  objs := func.o main.o
  $(objs): %.o : %.c
    gcc -o $@ -c $^

分析:
上述第二行,通过%.o匹配objs中的func.o,通过func.c生成依赖,再匹配main.o生成main.c依赖。
上述第二行会被make程序解析成

   func.o: func.c
  gcc -o $@ -c $^
  main.o: main.c
  gcc -o $@ -c $^

4、Makefile一般编写规则

  1. 先定义一个目标文件名变量
  2. 然后就是 目标文件的保存目录编写
  3. 然后是源文件的变量定义包括C文件和汇编文件
  4. 再然后定义交叉编译工具链,编译选项(选项 include目录 连接脚本 )

 

posted @ 2020-03-29 13:32  Little_Village  阅读(2642)  评论(0编辑  收藏  举报