我正在使用自动工具,情况如下:
默认情况下, 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脚本中不起作用
答案 0 :(得分:3)
目标是要有一个变量,该变量包含要在 path.conf.in 中使用的路径的扩展版本,因此自动工具会在扩展后生成 path.conf 路径。
Autotools为安装目录变量的默认值提供特殊处理,以使用户能够在make install
时指定或覆盖安装前缀:
make install prefix=/my/special/prefix
您打算做的事情将打破这一点。如果用户在安装阶段指定的安装前缀不同于他们告诉configure
的安装前缀(或者默认情况下让configure
选择),那么最终安装将失败。
解决此类问题的最佳方法是在make
时make 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 /'
),则将执行所有写入的代码。
如果您完全控制环境(即在启动脚本时确定变量的值),则应该没有问题,否则请警惕潜在的副作用