使用automake/autoconf的Makefile条件

7 投票
2 回答
3003 浏览
提问于 2025-04-16 07:30

有没有人能告诉我,是否可以在Makefile.am中插入一个条件块,这样它就能被后续由autotools创建的Makefile使用?

这里有个例子:

ifeq "$(SOMEVAR)" ""
SOMEVAR="default_value"
endif

这看起来是Makefile中处理条件的常见方式。但是,Automake会把endif这一行去掉,最终导致make失败,并出现这样的提示信息:

Makefile:390: * 缺少 `endif'。停止。

大家有什么想法吗?

2 个回答

0

我想分享一个我偶然发现的另一种方法,来源于这个链接:有没有办法让automake不解析automakefile的一部分?。不过不幸的是,这个方法在使用ifeq .. else .. endif这种条件语句时并不奏效。

5

因为这个问题也和Autoconf有关,我建议把条件放在configure.ac里,如果可以的话。可以像这样:

AM_CONDITIONAL([CONDITION_NAME], [test x"${SOMEVAR}" != x])

然后,你的Makefile.am里会包含:

if CONDITION_NAME
<conditional code>
else
<else :)>
endif

更新

这个问题和

python setup.py --root=$(DESTDIR) --prefix=$(DESTDIR)$(prefix)

从某个地方被调用有关。如果DESTDIR是空的,前缀可能会变成一个相对路径,这样就不太对了。你已经确认它是从你的Makefile.am里被调用的。那么你可以做两件事。

  1. 把上面的命令改成python setup.py --root=${DESTDIR}/// --prefix=${DESTDIR}///$(prefix)。这里用三个斜杠可能是必要的,因为据我所知,POSIX规定两个斜杠有特殊含义,但三个或更多的连续斜杠就没有这个限制了。

  2. 把上面的命令改成DESTDIR=${DESTDIR:-///} && python setup.py --root=${DESTDIR} --prefix=${DESTDIR}$(prefix)

值得注意的是,依我个人的理解,这些操作其实都不应该是必要的。因为最初调用configure的人已经能够准确指定他想用的prefix。如果没有指定,Autoconf默认会使用一个绝对路径(/usr/local)。所以,我想我不太明白你为什么会遇到这个问题。

撰写回答