Как передать флаги компилятора из Autoconf в Automake?

У меня чертовски много времени, чтобы получить параметры компилятора из Autoconf в Automake. Некоторые из моих исходных файлов имеют флажки Automake для каждого объекта:

## Makefile.am
librijndael_simd_la_SOURCES = rijndael-simd.cpp
librijndael_simd_la_CXXFLAGS = $(AES_FLAG)

AES_FLAG нужны архитектурные флаги для IA-32, Aarch32/64 и Power8. Другие платформы не получают флаг. Раньше флаги были жестко запрограммированы в Makefile.am.

Я пытаюсь жестко закодировать параметры в Autoconf, поскольку я создаю начальную поддержку Autotools:

# configure.ac
AC_SUBST([GCM_FLAG], [-mssse3 -mpclmul])
AC_SUBST([AES_FLAG], [-msse4.1 -maes])
AC_SUBST([SHA_FLAG], [-msse4.2 -msha])
...
AC_OUTPUT(Makefile)

Но получается:

$ ./configure
...

checking how to run the C++ preprocessor... g++ -E
./configure: line 16195: -mpclmul: command not found
./configure: line 16199: -maes: command not found
./configure: line 16201: -msha: command not found

Руководство Autoconf, 3.1.2 Язык Autoconf говорит использовать двойные скобки ([[ и ]]):

AC_SUBST([[GCM_FLAG]], [[-mssse3 -mpclmul]])
AC_SUBST([[AES_FLAG]], [[-msse4.1 -maes]])
AC_SUBST([[SHA_FLAG]], [[-msse4.2 -msha]])

Это приводит к (думаю, именно поэтому большинство людей не следуют руководству):

$ autoreconf --force --install
...

error: AC_SUBST: `[AES_FLAG]' is not a valid shell variable name
configure.ac:50: the top level
autom4te: /usr/bin/m4 failed with exit status: 1
aclocal: error: echo failed with exit status: 1
autoreconf: aclocal failed with exit status: 1

Я полагаю, что это документация, но в ней нет примеров или шагов по устранению неполадок: 7.2 Настройка выходных переменных.

Наивно я думал, что будет тысяча блогов, показывающих, как выполнить эту простую задачу, но это не так: параметр autoconf передать компилятору automake.

Как передать флаги компилятора из Autoconf в Automake?


person jww    schedule 03.11.2017    source источник
comment
Можете ли вы добавить свои Makefile.in или Makefile сегменты, связанные с GCM_FLAG и другими?   -  person Vicente Bolea    schedule 06.11.2017
comment
Спасибо @Висенте. Я никогда не заходил так далеко (т. е. достаточно далеко, чтобы мой Makefile.am превратился в Makefile).   -  person jww    schedule 06.11.2017
comment
Только в редких случаях вам нужны или нужны двойные скобки.   -  person John Bollinger    schedule 06.11.2017
comment
Если, как я подозреваю, окажется, что обнаруженное вами решение не делает то, что вы думаете, то я призываю вас представить минимальный воспроизводимый пример. Я не вижу ничего изначально неправильного в подходе с одной скобкой, с которого вы начали.   -  person John Bollinger    schedule 06.11.2017
comment
Просто чтобы знать, что произошло, можете ли вы показать строку рядом с 16195 в файле конфигурации.   -  person Vicente Bolea    schedule 07.11.2017


Ответы (1)


Похоже, ваша конфигурация правильная. В вашем файле Makefile.am или configure.ac может быть новая строка или любой другой символ, который портит вашу систему сборки.

Советую посмотреть генерацию Makefile. Вы можете сделать grep -nC5 AES_FLAG Makefile, чтобы посмотреть, как это выглядит. Это может дать нам некоторые подсказки.

person Vicente Bolea    schedule 06.11.2017
comment
Спасибо @Висенте. Проблема была обнаружена в отсутствии кавычек. То есть мне нужно было использовать AC_SUBST([GCM_FLAG], ["-mssse3 -mpclmul"]). Ни одинарных, ни двойных скобок было недостаточно. - person jww; 06.11.2017
comment
@jww Я рад, что ты решил эту загадку. Меня очень озадачил ваш вопрос! - person Vicente Bolea; 06.11.2017
comment
@jww, я тоже рад, что ты решил свою проблему, если это действительно так. Но решение, которое вы описываете, не имеет смысла. Ваша ошибка autoreconf, возможно, исчезла, но будьте осторожны: я подозреваю, что в конечном итоге вы укажете другие флаги, чем вы думаете. - person John Bollinger; 06.11.2017