【发布时间】:2019-06-21 15:42:19
【问题描述】:
我正在处理自动工具,情况如下:
默认情况下,libdir 设置为 '${exec_prefix}/lib',exec_prefix 设置为 '${prefix} ' 和 prefix 设置为 '/usr/local'。
这里的关键递归和在第一级libdir变量包含另一个变量和以下路径。
那么如何将${libdir}转换成包含'/usr/local/lib'的变量呢?
Info : 所有 3 (libdir, exec_prefix, prefix) 都可以根据配置进行更改。
考虑以下文件:
配置.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路径。
编辑:仅限 Bash 的解决方案
挖掘相关主题并在@Aserre 回答的帮助下,我设法使用正则表达式执行以下操作。
while expr match "${libdir}" '^.*\$.*$' 1>/dev/null;
do
echo ">${libdir}"
libdir="$(eval echo ${libdir})"
done
这意味着:而 $libdir 包含一个 $ 扩展与 eval。
但在 AC_OUTPUT 之前的 configure.ac 脚本中不起作用
【问题讨论】:
-
exec_prefix是 literal 字符串${prefix}?为什么不(我承认,我对自动工具一无所知)只是等到prefix有一个值来设置exec_prefix=${prefix}? -
@chepner : echo ${libdir} 返回 ${exec_prefix}/lib
-
是的,@chepner,这是故意的,以便用户在运行
make install时可以覆盖安装前缀。${prefix}通常由make扩展。 -
@Nelstaar,你能解释一下你为什么要这样做吗?因为更漂亮(更好)的解决方案可能是什么都不做。