4

在一个基于 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时间执行的。即使它有效,我也会觉得它冗长而臃肿。有没有更好的办法?我的直觉告诉我应该使用 myconfigure.ac来设置一个变量,然后我将简单地在 中展开Makefile.am,如下所示:

AUTOMAKE_OPTIONS = $(SERIAL_TESTS)

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

4

1 回答 1

3

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

AUTOMAKE_OPTIONS您应该尝试使用参数,而不是尝试使用AM_INIT_AUTOMAKE变量。因为configure.ac总是使用 M4 读取,所以您可以在那里使用 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 对我来说似乎是一个更好的举措。)

于 2013-04-05T15:29:31.190 回答