我有一个文件 Makefile.am 我用来生成一个 Makefile。在生成的 Makefile 中,我想要类似的东西:
ifndef SOURCECODEPATH
SOURCECODEPATH := /home/root/source_code_path
endif
看起来很简单,有人知道我该怎么做吗?
我有一个文件 Makefile.am 我用来生成一个 Makefile。在生成的 Makefile 中,我想要类似的东西:
ifndef SOURCECODEPATH
SOURCECODEPATH := /home/root/source_code_path
endif
看起来很简单,有人知道我该怎么做吗?
使用AM_CONDITIONAL宏configure.ac
。
该脚本设置了一个您可以测试的变量,例如,如果启用了条件,则该变量设置为非空:AM_CONDITIONAL([ENABLE_SOURCECODEPATH], [test "x$ac_srcpath" != "x"])
然后在Makefile.am
:
if !ENABLE_SOURCECODEPATH
SOURCECODEPATH = ...
endif
但是,由于如果未定义变量,您将显式定义变量,因此您可能应该configure.ac
无论如何定义它,使用AC_SUBST(SRCPATH, $ac_srcpath)
:
SOURCECODEPATH = @SRCPATH@ # or $(SRCPATH)
您可以简单地使用 Makefile.am 包含的辅助生成文件(以及它的扩展)。
生成文件.am:
#...
include Makefile.env
#...
和 Makefile.env:
ifndef SOURCECODEPATH
SOURCECODEPATH := /home/root/source_code_path
endif
automake
不会触及(或尝试解析)include
d Makefile.env
实际上,正如http://www.gnu.org/software/make/manual/make.html#Flavors所说,?=
用于用=
. 如果您需要为用 声明的变量设置默认值:=
,请使用如下构造:
ifeq ($(origin SOURCECODEPATH), undefined)
SOURCECODEPATH := /home/root/source_code_path
endif
以下解决方案至少应适用于 GNU Make 和 BSD Make。Brett Hale的autotools 解决方案应该适用于任何地方,但它要复杂得多。
SOURCECODEPATH?=/home/root/source_code_path
你真的不应该使用 automake 来生成不可移植的 makefile,但是如果你真的想这样做来生成一个用于 GNU make 的 Makefile,那么你可以简单地在之前添加一个空格endif
:
ifndef SOURCECODEPATH
SOURCECODEPATH := /home/root/source_code_path
endif
如果e
不在第一列,Automake 将不会尝试解析endif
为 automake 条件的结尾,而是将文本逐字复制到 Makefile。GNU-make 将识别带有空格的条件(至少,3.80 识别它。我没有尝试过任何其他的。)