美文网首页
makefile之call函数

makefile之call函数

作者: frank_545b | 来源:发表于2018-09-17 15:51 被阅读0次

    call函数是唯一一个可以创建定制化参数函数的引用函数。
    支持对自定义函数的引用;
    支持将一个变量定义为一个复杂的表达式,用call函数根据不同的参数对它进行展开来获取不同的结果;

    函数语法:
    $(call VARIABLE,PARAM,PARAM,...)

    函数功能:
    在执行时,将它的参数"PARAM"依次赋给临时变量"$(1)","$(2)".call对参数的数目没有限制,也可以没有参数值。
    最后再对VARIABLE展开后的表达式进行处理.
    函数返回值:
    VARIABLE展开后的表达式的值
    函数说明:
    1. 变量VARIABLE在定义时最好定义为递归展开式;
    2. call函数中对VARIABLE的调用,直接给函数或变量名就好了,不要用"$";
    3. 多个PARAM使用逗号分割开,且逗号和PARAM之间不能有空格,否则会导致解析异常;(PS:我自己在这个挖过坑,因为习惯c编码时,在逗号后面加一个空格)

    1. 变量的引用

    1.1 变量定义为直接展开式

    如果这里将VARIABLE1定义为直接展开式,最终调用call函数后,返回值为空
    我的理解是,直接展开式在定义时将(1)和(2)展开,而此时它们的值为空,所以变量的值为空.当执行到call函数时,尽管带上了需要传递的参数,但PARAM((1)和(2))之前已经被展开了,故此时已经取不到传递进来的参数值.

    VARIABLE1 := $(2) $(1)
    
    $(info 1-$(VARIABLE1))
    
    aa=$(call VARIABLE1,hello,world)
    
    $(info 1-$(aa))
    all:
        @echo Done
    

    1.2 变量定义为递归展开式

    VARIABLE1 = $(2) $(1)
    
    $(info 2-$(VARIABLE1))
    
    aa=$(call VARIABLE1,hello,world)
    
    $(info 2-$(aa))
    all:
        @echo Done
    

    这里变量类型的定义再罗嗦一下,所谓的直接展开式,即在定义的时候立即展开;递归展开式,在定义的时候其实相当于声明,只有在实际引用时才展开.

    2. 函数的引用

    2.1 不带参数的函数引用

    define FUNC1
    $(info echo 3-"hello")
    endef
    $(call FUNC1)
    all:
        @echo Done
    

    2.2 带参数的函数引用

    define FUNC1
    $(info echo 4-$(1) $(2))
    endef
    
    $(call FUNC1,hello,wolrd)
    
    all:
        @echo Done
    

    2.3 逗号和参数之间有空格的示例

    define FUNC1
    $(info echo 5-$(1) $(2))
    endef
    
    $(call FUNC1, hello, wolrd)
    
    all:
        @echo Done
    

    从执行的结果会发现,逗号和参数之间的空格也被作为参数的一部分.在这个例子中可能看不出明显的负面影响,后面我在举个栗子.

    相关文章

      网友评论

          本文标题:makefile之call函数

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