Как рекурсивно подставить переменную для пути в переменную bash в configure.ac? - PullRequest
0 голосов
/ 28 января 2019

Я имею дело с автоинструментами, и вот ситуация:

По умолчанию 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

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Цель состоит в том, чтобы иметь переменную, содержащую расширенную версию пути, которая будет использоваться в path.conf.in , чтобы автоинструменты генерировали path.conf с этимрасширенный путь.

Автоинструменты обеспечивают специальную обработку значений по умолчанию переменных каталога установки, чтобы пользователь мог указать или переопределить префикс установки во время 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 делает сам.

И, конечно, если вы делаете это таким образом, вам не нужно беспокоиться о выполнении дополнительных расширений.

0 голосов
/ 28 января 2019

Если вы на 100% уверены в содержании переменной ${exec_prefix}, вы можете использовать следующую строку для достижения желаемого:

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

Обратите внимание, что во многих случаяхИспользование Eval не рекомендуется.Здесь, если пользователь переопределил содержимое переменной exec_prefix, например, с помощью exec_prefix='a; rm -rf /', будет выполнен весь написанный код.

Если вы полностью контролируете свою среду (т. Е. Вы уверены в значении переменных при запуске сценария), проблем не должно быть, в противном случае опасайтесь возможных побочных эффектов

...