【问题标题】:GNU Make documentation: contradiction in ifdef?GNU Make 文档:ifdef 中的矛盾?
【发布时间】:2015-11-16 06:09:39
【问题描述】:

以下是 GNU Make 中 ifdef 条件的文档。这是想告诉我什么?

conditional-directive
text-if-true
else
text-if-false
endif

ifdef 形式将变量的名称作为其参数,而不是对变量的引用。 该变量的值为非空值,则text-if-true有效;否则,text-if-false(如果有)有效。从未定义的变量具有空值。文本变量名被扩展,因此它可以是一个变量或扩展为变量名的函数。

注意 ifdef 只测试变量是否有值。它不会扩展变量来查看该值是否为非空。 因此,使用 ifdef 的测试对于除诸如 foo = 之类的定义之外的所有定义都返回 true。要测试空值,请使用 ifeq ($(foo),)。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    ifdef 形式将变量的 name 作为其参数,而不是对变量的引用。该变量的值为非空值,text-if-true 有效;否则,text-if-false,如果有的话,是有效的。从未定义的变量具有空值。

    假设我们有一个变量foo,那么它分配的值足以让ifdef 认为它true,它不关心foo 的实际值。有些人可能认为0 或空字符串是假的,但ifdef 不是。

    foo = 0      # or even ''
    ifdef foo    # true, bar will be set to 1
       bar = 1
    else
       bar = 0
    endif
    

    注意ifdef 只测试变量是否有值。它不会扩展变量以查看该值是否为非空。

    所以,当它已经有一个变量时,就不会进行进一步的扩展(如上)。

    文本 variable-name 被扩展,因此它可以是一个变量或扩展为变量名称的函数。

    但是,当我们传递对变量或函数的引用时,扩展就完成了。 same document 中给出的示例阐明了这一点:

    bar = true
    foo = bar
    ifdef $(foo)
    frobozz = yes
    endif
    

    变量引用$(foo)被扩展,产生bar,它被认为是一个变量的名称。变量bar 未展开,但会检查其值以确定它是否为非空。

    混乱是由于这一行:

    注意ifdef 只测试变量是否有值。它不会扩展变量以查看该值是否为非空。

    这样会更好:

    注意ifdef 只测试变量是否有值。它不会测试变量以查看该值是否为非空。

    【讨论】:

    • 我不认为它会更好。据我所知,变量评估在 make 手册中一直被称为变量扩展。
    • 也许吧,但恕我直言,前一个语句中使用的 test 更加明确,即使不习惯阅读 make 文档,也清楚地传达了意图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2021-09-30
    • 2014-10-29
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2023-01-20
    相关资源
    最近更新 更多