【问题标题】:What is the difference between := and += in kernel Makefiles?内核 Makefile 中的 := 和 += 有什么区别?
【发布时间】:2012-07-05 13:11:09
【问题描述】:

:= 和 += 在 Linux 内核 Makefile 中是否相同并且可以互换使用?如果不是,那两者有什么区别呢?

【问题讨论】:

    标签: makefile linux-kernel kernel


    【解决方案1】:

    正如其他人所说,:= 是分配。

    但:= 和= 之间存在细微差别。在大多数情况下,这无关紧要,但可能会产生很大的不同。

    X = $(Y) 将X 定义为递归变量,类似于 C 预处理器宏。
    每当引用X 时,将使用Y 的值。
    扩展发生在 X 扩展时。所以你可以在定义X之后再定义Y,就可以了。

    X := $(Y) 将X 定义为一个简单的变量。这更像是一个 C 作业。
    现在,Y 在定义时已扩展,因此稍后更改它将无济于事。

    X += $(Y) 附加到X,但保持其类型。
    如果X 之前用= 定义,Y 将不会立即展开。如果从未定义过 X,则相同。
    如果X 之前用:= 定义,Y 将立即展开。

    你可以试试这个示例生成文件:

    X = 1
    
    Y  = $(X)
    Z := $(X)
    
    X = 2
    
    Y += $(X)
    Z += $(X)
    
    X = 3
    
    test:
            @echo "Y = $(Y)"
            @echo "Z = $(Z)"
    

    打印出来

    Y = 3 3
    Z = 1 2
    

    【讨论】:

    • 是的,:= 和 = 之间的区别对于在尝试编写/诊断 makefile 时不会发疯至关重要。
    【解决方案2】:

    := 类似于 =, i。 e 这是一个作业。

    += 是一个连接和赋值运算符。

    示例:

    VARIABLE := abc
    # here VARIABLE is abc
    VARIABLE := def
    # VARIABLE is now def only!
    
    VARIABLE_2 = abc
    # VARIABLE_2 is now abc
    VARIABLE_2 += def
    # VARIABLE_2 is abc def
    

    【讨论】:

    • 感谢您的快速回复。那么我们也可以在 Linux Kernel Makefiles 中使用 = 而不是 := 吗?因为我一个都没见过。我在想内核makefile中是否也有立即分配和延迟分配的概念?
    • 在第二种情况下,变量变为abc def,而不是abcdef。
    • 说:= 等同于= 具有误导性;有一个关键的区别。
    • @ugoren 在回答中给出的示例清楚地解释了 = 和 := 之间的区别。
    【解决方案3】:

    := 是赋值。 += 是串联。见here.

    【讨论】:

      【解决方案4】:

      := 清除您要分配的变量的先前值,而 += 向变量添加(连接)

      例如,假设 CFLAGS 已设置为 -Wundef

      如果我们这样做,

      CFLAGS := -Wall
      

      CFLAGS 现在设置为“-Wall”

      如果我们这样做,

      CFLAGS += -Wall
      

      CFLAGS 现在变为“-Wundef -Wall”

      在 Linux Makefiles 中经常使用它。

      【讨论】:

        猜你喜欢
        • 2016-03-17
        • 2011-06-20
        • 1970-01-01
        • 2011-05-31
        • 2010-09-15
        • 2010-10-05
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        相关资源
        最近更新 更多