【问题标题】:automake Environment Variable Conditionautomake 环境变量条件
【发布时间】:2013-01-11 06:44:52
【问题描述】:

我有一个文件 Makefile.am 我用来生成一个 Makefile。在生成的 Makefile 中,我想要类似的内容:

ifndef SOURCECODEPATH
   SOURCECODEPATH := /home/root/source_code_path
endif

看起来很简单,有谁知道我该怎么做?

【问题讨论】:

    标签: makefile conditional environment-variables autotools automake


    【解决方案1】:

    configure.ac 中使用AM_CONDITIONAL 宏。

    该脚本设置了一个您可以测试的变量,例如,如果启用条件,则设置为非空的变量:AM_CONDITIONAL([ENABLE_SOURCECODEPATH], [test "x$ac_srcpath" != "x"])

    然后在Makefile.am

    if !ENABLE_SOURCECODEPATH
    SOURCECODEPATH = ...
    endif
    

    但是,由于如果未定义变量,您将显式定义变量,因此您可能应该在 configure.ac 中定义它,无论如何,使用 AC_SUBST(SRCPATH, $ac_srcpath)

    SOURCECODEPATH = @SRCPATH@ # or $(SRCPATH)
    

    【讨论】:

    • 没有办法只告诉 automake 将 Makefile.am 中的文本复制到 Makefile 中?
    【解决方案2】:

    您可以简单地使用 Makefile.am 包含的辅助 makefile(以及它的扩展)。

    Makefile.am:

    #...
    include Makefile.env
    #...
    

    和 Makefile.env:

    ifndef SOURCECODEPATH
       SOURCECODEPATH := /home/root/source_code_path
    endif
    

    automake 不会触及(或尝试解析)included Makefile.env

    【讨论】:

    • 没有测试但很有意义,似乎是最好的解决方案。讨厌将 2 个文件用于如此简单的事情的想法。希望尝试摆脱自动工具来构建 10 个文件左右的 GStreamer 插件。这是我第一次使用自动工具,但它似乎不利于代码可维护性和易于使用的构建系统。
    • 我认为 autotools 的重点是提供一个跨平台可维护且易于使用的构建系统。它做得很好。不幸的是,它不是一个易于学习的构建系统,并且需要您适应他们的思维方式,而不是试图强制执行您自己的方式;我敢肯定 autotools 已经为您最初想用您的构造解决的问题提供了一个很好、简单的解决方案(这当然从您提供的 sn-p 中不清楚)
    【解决方案3】:

    以下解决方案至少应在 GNU Make 和 BSD Make 中工作。 Brett Hale 的 autotools solution 应该适用于任何地方,但它要复杂得多。

    SOURCECODEPATH?=/home/root/source_code_path
    

    【讨论】:

    • 这几乎奏效了...我必须在 ? 之前添加一个空格在 = 之后让 automake 处理它(SOURCECODEPATH ?= /home/root/source_code_path)。它将 SOURCECODEPATH 分配逐字复制到 Makefile 的底部,但无法编译。我将 SOURCECODEPATH 分配移动到 Makefile 的顶部并编译。有什么方法可以自动将它移动到 Makefile 的顶部?我将 SOURCECODEPATH ?=... 作为 Makefile.am 的第一行。
    • 不幸的是,我的专长仅限于 make,而不是 autotools 套件。
    • 唉,我无法在评论中插入代码块,所以我将答案作为评论发布,见下文。
    【解决方案4】:

    您确实不应该使用 automake 来生成不可移植的 makefile,但如果您真的想这样做来生成用于 GNU make 的 Makefile,那么您只需在 endif 之前添加一个空格:

    ifndef SOURCECODEPATH
       SOURCECODEPATH := /home/root/source_code_path
     endif
    

    如果e 不在第一列,Automake 将不会尝试将endif 解析为 automake 条件的结尾,而是将文本逐字复制到 Makefile。 GNU-make 会识别带空格的条件(至少,3.80 可以识别。我没有尝试过其他的。)

    【讨论】:

    • 它没有为我逐字复制文本。它实际上只是逐字复制了 SOURCECODEPATH := ... 行,无论是否定义了 SOURCECODEPATH 。 (制作 v3.81,自动制作 v1.11.3)
    【解决方案5】:

    实际上,正如http://www.gnu.org/software/make/manual/make.html#Flavors 所说,?= 用于用= 声明的变量。如果您需要为使用:= 声明的变量设置默认值,请使用如下构造:

    ifeq ($(origin SOURCECODEPATH), undefined)
      SOURCECODEPATH := /home/root/source_code_path
    endif
    

    【讨论】:

      猜你喜欢
      • 2019-08-16
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 2016-05-23
      • 2018-11-14
      相关资源
      最近更新 更多