Makefile 笔记

规则

伪目标

变量

变量定义的3种方式

  • 1 foo = bar (递归展开式变量)
    会在引用$(foo)地方原地替换,直到不能再替换,这种方式称之为递归展开式变量

    1
    2
    3
    4
    foo = $(bar)
    bar = $(ugh)
    ugh = Huh?
    all @echo $(foo)

    以上例子会在@echo $(foo) 地方递归展开
    缺点一 : 是当嵌套定义 foo = $(foo) bar 时讲进入死循环,导致Make失败
    其他例子
    x = $(y)
    y = $(x) $(z)
    同样会陷入死循环,所以这种定义方法只推荐在不引用变量的时候应用
    缺点二 这种定义中如果使用函数,只会在变量被引用时展开,而不是在定义时展开
    会使得Make的效率降低,另外有可能会在变量函数的引用会出现非预期结果,特别当变量
    定义引用到shell wildcard 函数的情况下,出现不可控的结果

    1
    2
    3
    4
    5
    6
    x = foo
    y = $(x) bar //$(x) 不会被立即替换,只有在$(y)被用到的地方才用x的值替换
    x = later //将会覆盖 原来的 x ,
    等价于
    y = later bar
    x = later