3

我正在一个使用 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 配置文件中吗?这里的“有条件”是指如果条件不满足,则外部文件根本不会被包含(导入)。

非常感谢!

4

3 回答 3

3

根据您的 Makefile-snippets 的作用,您可以逃脱:

if PLATFORM_A
-include platform_A/Makefile.platform
endif

在这种情况下,Makefile-snippets 只是被包含在内,而不是由 automake 解析。另请注意,如果-included 片段不存在,则不会产生错误(重要部分是连字符 ( -) 前缀include

于 2013-10-30T15:44:34.380 回答
0

I can't speak for automake specifically but for GNU make at least ifeq/etc. works correctly to control conditional inclusion of makefiles.

$ more * | cat
::::::::::::::
Makefile
::::::::::::::
ifneq ($(ONE),)
include one.mk
endif
include two.mk
include both.mk

all: ;
::::::::::::::
both.mk
::::::::::::::
$(warning both.mk)
::::::::::::::
one.mk
::::::::::::::
$(warning one.mk)
::::::::::::::
two.mk
::::::::::::::
$(warning two.mk)
$ make
two.mk:1: two.mk
both.mk:1: both.mk
make: `all' is up to date.
$ make ONE=f
one.mk:1: one.mk
two.mk:1: two.mk
both.mk:1: both.mk
make: `all' is up to date.
于 2013-10-29T02:33:12.550 回答
0

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

生成文件.am

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

platform_A/Makefile.platform

if PLATFORM_A
...
endif

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

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

于 2013-10-28T18:58:08.003 回答