美文网首页
Makefile常用基础知识点

Makefile常用基础知识点

作者: hades2013 | 来源:发表于2022-06-22 17:55 被阅读0次
    1. '@'
      通常makefile会将其执行的命令行在执行前输出到屏幕上。如果将‘@’添加到命令行前,这个命令将不被make回显出来。例如:
    @echo  --compiling module----;  // 屏幕输出  --compiling module----
    echo  --compiling module----;  // 没有@ 屏幕输出echo  --compiling module----   
    

    1. ' - '
      通常删除,创建文件如果碰到文件不存在或者已经创建,那么希望忽略掉这个错误,继续执行,就可以在命令前面添加 -,
    -rm dir;
    -mkdir aaadir;
    

    1. ' $ '
      美元符号$,主要扩展打开makefile中定义的变量

    4.$$
    $$ 符号主要扩展打开makefile中定义的shell变量


    wildcard

    说明: 列出当前目录下所有符合模式“ PATTERN”格式的文件名,并且以空格分开。“ PATTERN”使用shell可识别的通配符,包括“?”(单字符)、“ *”(多字符)等。示例:

    $(wildcard *.c) 
    

    返回值为当前目录下所有.c 源文件列表。


    patsubst

    说明:把字串“ x.c.c bar.c”中以.c 结尾的单词替换成以.o 结尾的字符。示例:

    $(patsubst %.c,%.o,x.c.c bar.c)
    

    函数的返回结果 是

     x.c.o bar.o
    

    notdir

    说明:去除文件名中的路径信息 示例:

    SRC = ( notdir ./src/a.c ) 
    

    去除文件a . c 的路径信息 , 使用 (notdir ./src/a.c) 去除文件a.c的路径信息,使用 (notdir./src/a.c)去除文件a.c的路径信息,使用(SRC)得到的是不带路径的文件名称,即a.c。

    包含头文件路径

    使用-I+头文件路径的方式可以指定编译器的头文件的路径 示例:

    INCLUDES = -I./inc
    $(CC) -c $(INCLUDES) $(SRC)
    

    addsuffix

    函数名称:加后缀函数—addsuffix。语法:

    $(addsuffix SUFFIX,NAMES…) 
    

    函数功能:为“NAMES…”中的每一个文件名添加后缀“SUFFIX”。参数“NAMES…” 为空格分割的文件名序列,将“SUFFIX”追加到此序列的每一个文件名 的末尾。返回值:以单空格分割的添加了后缀“SUFFIX”的文件名序列。函数说明:示例:

    $(addsuffix .c,foo bar) 
    

    返回值为

    foo.c bar.c
    

    包含另外一个文件:include

    在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。比如命令

    include file.dep
    

    即把file.dep文件在当前Makefile文件中展开,亦即把file.dep文件的内容包含进当前Makefile文件
    在 include前面可以有一些空字符,但是绝不能是[Tab]键开始。


    foreach

    foreach函数和别的函数非常的不一样。因为这个函数是用来做循环用的 语法是:

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

    这个函数的意思是,把参数中的单词逐一取出放到参数所指定的变量中,然后再执行所包含的表达式。

    每一次会返回一个字符串,循环过程中,的所返回的每个字符串会以空格分隔,最后当整个循环结束时,所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。

    所以,最好是一个变量名,可以是一个表达式,而中一般会使用这个参数来依次枚举中的单词。

    举例:

    names := a b c d
    files := $(foreach n,$(names),$(n).o)
    

    上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中,“$(n).o”每次根据“$(n)”计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,$(files)的值是“a.o b.o c.o d.o”。

    注意,foreach中的参数是一个临时的局部变量,foreach函数执行完后,参数的变量将不在作用,其作用域只在foreach函数当中。


    call

    “ call”函数是唯一一个可以创建定制化参数函数的引用函数。使用这个函数可以实现对用户自己定义函数引用。我们可以将一个变量定义为一个复杂的表达式,用“ call”函数根据不同的参数对它进行展开来获得不同的结果。

    函数语法:

    $(call variable,param1,param2,...)
    

    函数功能:在执行时,将它的参数“ param”依次赋值给临时变量“$(1)”、“ $(2)” call 函数对参数的数目没有限制,也可以没有参数值,没有参数值的“ call”没有任何实际存在的意义。执行时变量“ variable”被展开为在函数上下文有效的临时变量,变量定义中的“$(1)”作为第一个参数,并将函数参数值中的第一个参数赋值给它;变量中的“ $(2)”一样被赋值为函数的第二个参数值;依此类推(变量**$(0)**代表变量“ variable”本身)。之后对变量“ variable” 表达式的计算值。

    返回值:参数值“ param”依次替换“ $(1)”、“$(2)”…… 之后变量“ variable”定义的表达式的计算值。

    函数说明:

    函数中“ variable”是一个变量名,而不是变量引用。因此,通常“ call”函数中的“ variable”中不包含“ $”(当然,除非此变量名是一个计算的变量名)。
    当变量“ variable”是一个 make 内嵌的函数名时(如“ if”、“ foreach”、“ strip”等),对“ param”参数的使用需要注意,因为不合适或者不正确的参数将会导致函数的返回值难以预料。
    函数中多个“ param”之间使用逗号分割。
    变量“ variable”在定义时不能定义为直接展开式!只能定义为递归展开式。
    函数示例:

    reverse = $(2)$(1)
    foo = $(call reverse,a,b)
    all:
     @echo "foo=$(foo)"
    

    执行结果:

    foo=ba
    

    即a替代了(1),b替代了(2)

    相关文章

      网友评论

          本文标题:Makefile常用基础知识点

          本文链接:https://www.haomeiwen.com/subject/wyeuvrtx.html