如何有条件地包含子automake配置文件

时间:2013-10-28 15:57:21

标签: makefile gnu-make automake

我正在使用automake构建应用程序的项目中工作。我们使用一个automake配置文件(Makefile.am)为多个平台构建应用程序。在这个Makefile.am中,平台特定的子自动配置文件(让我们将它们命名为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配置文件中有条件地包含外部文件吗?这里的“有条件”意味着如果不满足条件,则根本不会包含(导入)外部文件。

非常感谢!

3 个答案:

答案 0 :(得分:1)

取决于你的Makefile-snippets的功能,你可以逃脱:

if PLATFORM_A
-include platform_A/Makefile.platform
endif

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

答案 1 :(得分:0)

我不知道如何做你想做的事。你可以翻转条件的位置来完成同样的事情:

<强> 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 :(得分:0)

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

$ 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.