【问题标题】:How to get absolute path to top build directory in autoconf configure.ac?如何在 autoconf configure.ac 中获取顶级构建目录的绝对路径?
【发布时间】:2013-02-23 14:48:15
【问题描述】:

我正在做一个项目,该项目需要一个具有自己的 makefile 和 configure.ac 的子项目。子项目是用于为主项目生成源文件的程序。有一个选项可以禁用此项目的构建并尝试使用已安装的版本。

在任何一种情况下,我都会创建一个变量,该变量在我的 Makefile.am 中使用,其中包含程序的路径。

我的问题是,当使用项目的本地版本时,如何获取它的位置以在我的 Makefile.am 中使用?

我试过了

FOOPLACE=${abs_top_builddir}/bar/foo

但这总是使FOOPLACE 只包含/bar/foo。我什至不确定这是否是正确的方法,即使原则上也是如此。

【问题讨论】:

  • 这不应该是$(abs_top_builddir)Makefile.am 文件中吗?
  • @BrettHale,我 相信 我无法在 Makefile 中执行此操作,就好像我使用的是已安装的程序版本,而不是内置版本我的源目录,那么我需要使用此路径。有没有解决的办法?如果有办法在 makefile 中修改我的 FOOPLACE 变量,我可以将它放在 Makefile 中的条件中,但这似乎不起作用。
  • @BrettHale:在Makefile.am 中,您实际上可以使用任何一种,但$() 形式是传统的。

标签: autotools autoconf automake


【解决方案1】:

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

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

深入config.status,我发现@abs_top_builddir@被设置为$ac_abs_top_builddir的值。这看起来很奇怪,我认为这可能是一个错误。 I have sent it to bug-autoconf 看看他们的想法。

故事的寓意:它应该在任何完成替换的地方都有效。你也许可以在config.status 中使用$ac_abs_top_builddir,但我不会依赖它。

这是我使用的测试:

配置.ac:

AC_PREREQ([2.67])
AC_INIT([], [0], [foo@example.com])
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 -*-
# @configure_input@
echo "test: @abs_top_builddir@"
echo "test+ac: @ac_abs_top_builddir@"

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

【讨论】:

    【解决方案2】:

    查看配置脚本内部,我看到运行配置脚本的绝对路径是通过使用设置的

    ac_abs_confdir=`(
        cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
        pwd)`
    

    我已经在 configure.ac 中使用 $ac_abs_confdir 对其进行了测试,它可以工作。

    【讨论】:

    • 好的。请注意,这是顶级源目录,而不是 OP 要求的顶级构建目录。但是,按照这些思路,您可以使用 $ac_pwd 来获取顶级构建目录。
    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多