使用 automake/autoconf 条件生成文件

Posted

技术标签:

【中文标题】使用 automake/autoconf 条件生成文件【英文标题】:Makefile conditional with automake/autoconf 【发布时间】:2011-05-14 11:38:34 【问题描述】:

谁能告诉我是否有办法在 Makefile.am 中插入一个条件块,以便将其进一步传递给由 autotools 创建的 Makfile?

这是一个例子:

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

这似乎是 Makefile 做有条件的事情的常用方法。 Automake 会切断 endif 行并最终导致失败,并显示如下消息:

Makefile:390: * 缺少 `endif'。停下来。

有什么想法吗?

【问题讨论】:

【参考方案1】:

由于它也被标记为 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 调用的。那么你可以做两件事。

    将上述命令改为python setup.py --root=$DESTDIR/// --prefix=$DESTDIR///$(prefix)。三斜线可能是必要的,因为 AFAIK,POSIX 允许双斜线具有特殊含义,但不允许三个或更多连续斜线。

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

值得注意的是,在我看来,以及对整体情况的有限理解,这些都不是必需的。由于configure 的原始调用者能够准确指定他真正想要使用的prefix。如果没有指定,Autoconf 已经默认为绝对路径 (/usr/local)。所以,我想,我不太明白你为什么会遇到问题。

【讨论】:

谢谢!这是为了配置。我说的是make期间的条件块(取决于环境设置)。例如,如果你运行 make 安装在不同的位置,像这样:“DESTDIR=/some/rpm/builds make install”,那么 Makefile 应该检查是否设置了这个变量,然后生成一个用于安装的命令选项 您能否详细说明您想要做什么? DESTDIR=/some/rpm/builds make install 做它该做的事。您是否需要对其进行修改或对其进行足够的扩展?它可以由install-exec-localinstall-data-local 目标扩展。这些可能会检查是否设置了DESTDIR 类似地,如果 python ... 命令位于您的 Makefile.am 中,您可以这样做:DESTDIR="$DESTDIR:-/" python setup.py ... 最终我以其他方式解决了这个问题。我在 Makefile.am: DESTDIR ?= / 上面放了一行,这意味着如果没有设置一个值,然后在 python 行中使用它。不知道为什么它不适用于 $DESTDIR:-/ 构造。我用gnu make和bash,会不会是我的环境不理解? 很多无意义的解决方法,但有没有办法让 automake 将常规 if/else/endif 发出到 makefile 中??【参考方案2】:

我提出了另一种在Is there a way to tell automake not to interpret part of the automakefile? 中偶然发现的方法。但不幸的是,它不适用于ifeq .. else .. endif 条件。

【讨论】:

以上是关于使用 automake/autoconf 条件生成文件的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用 automake/autoconf 来分发小型 ansi C 应用程序吗?

大型项目使用Automake/Autoconf完成编译配置

autoconf,automake,libtool

sh 脚本只显示工具的版本,如果它们安装在系统中。 (clang make automake autoconf cmake)

使用现有的 Makefile 作为 automake 项目的一部分

大型项目使用Automake/Autoconf完成编译配置(标准的编译过程已经变成了简单的三部曲:configure/make/make install,)