如何在configure.ac中的bash变量中以递归方式替换变量的路径?

时间:2019-01-28 15:36:36

标签: bash autotools autoconf

我正在使用自动工具,情况如下:

默认情况下, libdir 设置为'$ {exec_prefix} / lib',而 exec_prefix 设置为'$ {prefix} 前缀设置为'/ usr / local'

这里的键递归,并且在第一级 libdir 变量中包含另一个变量和以下路径。

那么如何将 $ {libdir} 转换为包含'/ usr / local / lib'的变量?

信息:所有3个(libdir,exec_prefix,前缀)都可以根据配置进行更改。

请考虑以下文件:

configure.ac

AC_PREREQ([2.59])
AC_INIT([test], [0.0.0] )
AM_INIT_AUTOMAKE()
AC_CONFIG_SRCDIR([test.cpp])
AC_LANG([C++])
AC_PROG_CXXCPP
AC_PROG_CXX

AC_CONFIG_FILES([Makefile path.conf])

AC_MSG_NOTICE([">>> Before ac_output prefix=${prefix}"])
AC_OUTPUT
AC_MSG_NOTICE([">>> after ac_output prefix=${prefix}"])

Makefile.am

bin_PROGRAMS = test
test_SOURCES = test.cpp

test.cpp

int main()
{}

path.conf.in

@libdir@

然后调用:

aclocal && autoconf && automake -a --foreign && ./configure

配置日志显示:

configure: ">>> Before ac_output prefix=NONE"
...
...
...
configure: ">>> after ac_output prefix=/usr/local"

生成的文件path.conf包含

${exec_prefix}/lib

目标是要有一个变量,该变量包含要在 path.conf.in 中使用的路径的扩展版本,因此自动工具会在扩展后生成 path.conf 路径。


编辑:仅重击解决方案

在挖掘相关主题并得到@Aserre回答的帮助下,我设法使用正则表达式执行以下操作。

while expr match "${libdir}" '^.*\$.*$' 1>/dev/null;
do
    echo ">${libdir}"
    libdir="$(eval echo ${libdir})"
done

这意味着: $ libdir 包含一个 $ ,并用 eval 展开。

但是在AC_OUTPUT之前在configure.ac脚本中不起作用

2 个答案:

答案 0 :(得分:3)

  

目标是要有一个变量,该变量包含要在 path.conf.in 中使用的路径的扩展版本,因此自动工具会在扩展后生成 path.conf 路径。

Autotools为安装目录变量的默认值提供特殊处理,以使用户能够在make install时指定或覆盖安装前缀:

make install prefix=/my/special/prefix

您打算做的事情将打破这一点。如果用户在安装阶段指定的安装前缀不同于他们告诉configure的安装前缀(或者默认情况下让configure选择),那么最终安装将失败。

解决此类问题的最佳方法是在makemake install的控制下构建配置文件,而不是在配置时进行配置。如果项目使用Automake,则可能表示以下内容:

install-data-local:
    $(SED) -e 's,[@]libdir[@],$(libdir),' path.conf.in > $(sysconfdir)/path.conf
    chmod 0644 $(sysconfdir)/path.conf
    chown root:root $(sysconfdir)/path.conf

uninstall-local:
    rm $(sysconfdir)/path.conf

当然,您可以选择替换更多的输出变量。它与configure本身所做的工作非常接近。

当然,如果您这样做,则无需担心执行额外的扩展。

答案 1 :(得分:1)

如果您100%确定${exec_prefix}变量的内容,则可以使用以下行来实现所需的目标:

libdir="$(eval echo ${exec_prefix})"

请注意,在许多情况下,不建议使用eval。在此,如果用户已覆盖变量exec_prefix的内容(例如,使用exec_prefix='a; rm -rf /'),则将执行所有写入的代码。

如果您完全控制环境(即在启动脚本时确定变量的值),则应该没有问题,否则请警惕潜在的副作用