在基于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)
自动配置背后的理念是检查功能 - 我可以以某种方式跳过版本检查并检查串行测试选项的可用性并在给出时使用它吗?
答案 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对我来说似乎更好。)