【问题标题】:How to conditionally include sub automake configuration files如何有条件地包含子 automake 配置文件
【发布时间】:2024-01-04 11:49:01
【问题描述】:

我正在一个使用 automake 构建应用程序的项目中工作。我们使用一个 automake 配置文件 (Makefile.am) 为多个平台构建应用程序。在这个 Makefile.am 中,包含平台特定的子 automake 配置文件(我们将它们命名为 Makefile.platform),如下所示:

include platform_A/Makefile.platform
include platform_B/Makefile.platform
...
include platform_X/Makefile.platform

我最近想要做的是修改 Makefile.am 以将其中一个平台分离出来,同时仍然保持它在其他平台上的工作。我正在尝试在下面做

if PLATFORM_A
include platform_A/Makefile.platform
endif
include platform_B/Makefile.platform
...
include platform_X/Makefile.platform

但似乎“include”在评估 if/endif 之前生效,这意味着,如果我删除“platform_A/Makefile.platform”,当我尝试为其他应用程序构建应用程序时,automake 将无法成功解析 Makefile.am平台(例如platform_B & platfrom_X),因为它找不到“platform_A/Makefile.platform”。

这里有专家可以告诉我如何有条件地将外部文件包含在 automake 配置文件中吗?这里的“有条件”是指如果条件不满足,则外部文件根本不会被包含(导入)。

非常感谢!

【问题讨论】:

    标签: makefile gnu-make automake


    【解决方案1】:

    我不知道有什么方法可以做你想做的事。你可以翻转条件的位置来完成同样的事情:

    Makefile.am

    include platform_A/Makefile.platform
    include platform_B/Makefile.platform
    ...
    

    platform_A/Makefile.platform

    if PLATFORM_A
    ...
    endif
    

    automake include directive 的描述提到了包含的片段:

    以这种方式包含的 Makefile 片段总是被分发,因为它们是重建 Makefile.in 所必需的。

    【讨论】:

      【解决方案2】:

      我不能专门为 automake 说话,但对于 GNU make 至少是 ifeq/etc。可以正确控制 makefile 的条件包含。

      $ 更多 * |猫 :::::::::::::::: 生成文件 :::::::::::::::: ifneq ($(ONE),) 包括一个.mk 万一 包括两个.mk 包括两者.mk 全部: ; :::::::::::::::: 两者.mk :::::::::::::::: $(警告两者.mk) :::::::::::::::: 一个.mk :::::::::::::::: $(警告一个.mk) :::::::::::::::: 二.mk :::::::::::::::: $(警告二.mk) $ 制作 两个.mk:1:两个.mk 两个.mk:1: 两个.mk make: `all' 是最新的。 $使一=f one.mk:1: 一个.mk 两个.mk:1:两个.mk 两个.mk:1: 两个.mk make: `all' 是最新的。

      【讨论】:

      • 我确信这确实有效。与 automake 的不同之处在于 Makefile.am 是一种用于制作 Makefile 的模板,并且在该上下文中使用 include 指令(在运行 configure 时),而不是在运行 make 时使用。
      • 有道理。根据 automake 文档,尽管有条件确实可以执行您想要的操作(不使用该代码),但它并不能阻止包含本身。您是否有理由要阻止包含而不仅仅是使用该文件的内容? gnu.org/software/automake/manual/html_node/Include.html
      • 原因是我想提供PLATFORM_B的源代码包,使该包可以通过“configure/make/make install”构建和安装,同时将PLATFORM_A的源代码从包中排除。但是我发现如果我删除PLATFORM_A的所有代码(包括Makefile.platform),make会在源代码包上失败(配置可以通过)。有什么想法吗?
      【解决方案3】:

      取决于你的 Makefile-sn-ps 做什么,你可以逃脱:

      if PLATFORM_A
      -include platform_A/Makefile.platform
      endif
      

      在这种情况下,Makefile-sn-ps 被简单地包含在内,而不被 automake 解析。 另请注意,如果-included sn -p 不存在,则不会产生错误(重要部分是include前缀的连字符(-))

      【讨论】: