2013-02-23 93 views
6

我正在开发一个需要一个具有自己的makefile和configure.ac的子项目的项目。该子项目是一个用于为主项目生成源文件的程序。有一个选项可禁用此项目的构建,并尝试使用已安装的版本。如何在autoconf configure.ac中获得顶层构建目录的绝对路径?

无论哪种情况,我都会在我的Makefile.am中创建一个包含程序路径的变量。

我的问题是,当使用本地版本的项目,我怎么能得到它的位置在我的Makefile.am中使用?

我已经试过

FOOPLACE=${abs_top_builddir}/bar/foo 

但是这总是让FOOPLACE只包含/bar/foo。即使原则上,我也不确定这是否是正确的做法。

+1

这不应该是'Makefile.am'文件中的$(abs_top_builddir)吗? – 2013-02-23 18:26:27

+0

@BrettHale,我_believe_我不能在Makefile中这样做,就好像我正在使用已安装的程序版本,而不是在我的源代码目录中构建的版本,那么我需要使用此路径。有没有解决的办法?如果有一种方法可以在Makefile中修改我的'FOOPLACE'变量,我可以将它放在Makefile中的条件中,但这似乎不起作用。 – crobar 2013-02-23 19:46:13

+0

@BrettHale:在'Makefile.am'中你可以实际使用,但'$()'表单是常规的。 – 2013-02-23 20:44:58

回答

7

我只是用一个简单的configure.ac做了一些测试。

除非通过替换(即AC_CONFIG_FILES),否则我无法获得$abs_top_builddir的合理值。根据Preset Output Variables(autoconf),它们应该至少在config.status期间可用(即,AC_CONFIG_COMMANDS)。他们不是。

潜入config.status,我发现@[email protected]设置为$ac_abs_top_builddir的值。这看起来很奇怪,我认为这可能是一个错误。 I have sent it to bug-autoconf看看他们在想什么。

道德故事:它应该在任何地方进行替代工作。您可以在config.status内使用$ac_abs_top_builddir,但我不会依赖它。

这里是我使用的测试:

configure.ac:

AC_PREREQ([2.67]) 
AC_INIT([], [0], [[email protected]]) 
AC_MSG_NOTICE([notice: ${abs_top_builddir}]) 
AC_MSG_NOTICE([notice+ac: ${abs_top_builddir}]) 
AC_CONFIG_COMMANDS_PRE([echo "pre+ac: ${ac_abs_top_builddir}"]) 
AC_CONFIG_COMMANDS_PRE([echo "pre: ${abs_top_builddir}"]) 
AC_CONFIG_COMMANDS_POST([echo "post+ac: ${ac_abs_top_builddir}"]) 
AC_CONFIG_COMMANDS_POST([echo "post: ${abs_top_builddir}"]) 
AC_CONFIG_COMMANDS([echo], 
[echo "config.status+ac: ${ac_abs_top_builddir}" 
echo "config.status: ${abs_top_builddir}"]) 
AC_CONFIG_FILES([test], [chmod +x test]) 
AC_OUTPUT 

test.in:

#!/bin/sh 
# -*- sh -*- 
# @[email protected] 
echo "test: @[email protected]" 
echo "test+ac: @[email protected]" 

autoconf && ./configure && ./test运行它。

相关问题