如何有条件地定义AUTOMAKE_OPTIONS?

时间:2013-04-04 20:13:35

标签: automake

在基于autotools的项目中,我目前在Makefile.am中有以下行:

AUTOMAKE_OPTIONS = serial-tests

我想将此选项应用于当且仅当我的automake版本为1.12或更高时。原因是需要支持1.11和1.13 automake的串行测试工具。这样做的最佳方式是什么?


我已经尝试过这个:

AM_VER = $(shell $(AUTOMAKE) --version | head -n1 | sed -e 's|[^0-9.]||g')
AM_VER_MAJOR = $(shell echo $(AM_VER) | cut -d. -f1)
AM_VER_MINOR = $(shell echo $(AM_VER) | cut -d. -f2)
AM_VER_PATCH = $(shell echo $(AM_VER) | cut -d. -f3)

$(info $(AM_VER_MAJOR) $(AM_VER_MINOR) $(AM_VER_PATCH))

supports_serial_tests_opt = $(shell if [ "$(AM_VER_MAJOR)" -gt 1 ] || { [ "$(AM_VER_MAJOR)" -eq 1 ] && [ "$(AM_VER_MINOR)" -ge 12 ]; }; then echo true; fi)

$(info $(supports_serial_tests_opt))

$(if $(supports_serial_tests_opt), $(eval AUTOMAKE_OPTIONS=serial-opts))

$(info $(AUTOMAKE_OPTIONS))

并且它不起作用,因为AUTOMAKE_OPTIONS需要在automake执行时设置,并且函数条件在make时执行。即使它奏效了,我也会发现它荒谬冗长和臃肿;有没有更好的办法?我的直觉告诉我,我应该使用我的configure.ac设置一个变量,然后我只需要在Makefile.am中展开,就像这样:

AUTOMAKE_OPTIONS = $(SERIAL_TESTS)

自动配置背后的理念是检查功能 - 我可以以某种方式跳过版本检查并检查串行测试选项的可用性并在给出时使用它吗?

1 个答案:

答案 0 :(得分:3)

您的尝试不起作用,因为$(shell ...)仅由GNU Make解释,而Automake自己读取Makefile.am并且对GNU Make的功能一无所知。

您应该尝试使用AUTOMAKE_OPTIONS参数,而不是尝试使用AM_INIT_AUTOMAKE变量。因为始终使用M4读取configure.ac,所以可以在那里使用shell扩展。此外,您在此处设置的选项将适用于整个项目,并且不需要在每个Makefile.am中重复。

例如:

...
AM_INIT_AUTOMAKE(m4_esyscmd([case `automake --version | head -n 1` in 
                             *1.11*);; 
                             *) echo serial-tests;; 
                             esac]))
...

如果需要调试该脚本,请使用autoconf -t AM_INIT_AUTOMAKE跟踪传递给AM_INIT_AUTOMAKE的参数。

(那就是说,我必须同意威廉的评论。要求1.12对我来说似乎更好。)