Я имею дело с автоинструментами, и вот ситуация:
По умолчанию libdir установлен на '$ {exec_prefix} / lib' с exec_prefix установлен на '$ {prefix}' и префикс установлен на '/ usr / local' .
Введите здесь рекурсиюи на первом уровне переменная libdir содержит еще одну переменную и следующий путь.
Итак, как преобразовать $ {libdir} в переменную, содержащую '/ usr / local / lib' ?
Информация: все 3 (libdir, exec_prefix, 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 с этим расширенным путем.
Редактировать: решение только для Bash
Копая связанные темы и помогая ответом @Aserre, мне удается сделать следующее с регулярным выражением.
while expr match "${libdir}" '^.*\$.*$' 1>/dev/null;
do
echo ">${libdir}"
libdir="$(eval echo ${libdir})"
done
Что означает: в то время как $ libdir содержит один $ развернуть с помощью eval .
, но не работает в скрипте configure.ac до AC_OUTPUT