Неверное расширение переменной в Makefile.am

Я застрял со странным переменным расширением. Позволь мне объяснить.

У меня есть проект, использующий automake, составленный configure.ac, Makefile.am. В основном, в Makefile.am я делаю:

ARCH = $(shell ${CURDIR}/./arch.sh)
...
noinst_HEADERS = license/${ARCH}/lchecker.h
proj_SOURCES = main.c license/${ARCH}/lchecker.c
proj_LDFLAGS = -avoid-version -Llicense/${ARCH}

./arch делает только uname -m, чтобы определить необходимую архитектуру, потому что я должен войти в правильный каталог.

Когда я запускаю сборку, у меня есть эта ошибка:

Makefile:622: license/x86_64/.deps/lchecker.Po: No such file or directory
make[1]: *** No rule to make target 'license/x86_64/.deps/lchecker.Po'.  Stop.

и если я вхожу в каталог license, я замечаю новый созданный каталог с именем ${ARCH}/, где я нахожу отсутствующий .deps из license/x86_64.

Я почти уверен, что это неправильная проблема расширения; Я пробовал много способов, но я потерпел неудачу.

Может ли кто-нибудь объяснить мне правильный способ сделать это? Читая в сети, я вижу, что Makefile.am имеет синтаксис, отличный от Makefile.

ОБНОВЛЕНИЕ:

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

AC_DEFINE([ARCH], ["$ARCH"], [arch check])

echo ARCH = "$ARCH" printf x86_64 поэтому переменная определена в configure.ac, но расширение снова неверно в Makefile.am.


person Kyrol    schedule 21.03.2019    source источник
comment
@Mike Ты удалил свой ответ?   -  person Kyrol    schedule 22.03.2019
comment
Ага. Если это не сработает, я думаю, вам нужен минимальный воспроизводимый пример. Могу восстановить, если поможет.   -  person Mike Kinghan    schedule 22.03.2019
comment
Ну, на самом деле я изменил свой код и использовал ваш, потому что он, конечно, лучше моего. В любом случае, я последую вашему совету и надеюсь, что смогу решить :)   -  person Kyrol    schedule 22.03.2019


Ответы (1)


В своем configure.ac используйте макрос AC_SUBST(varname,[value]) для создания make-переменной varname в каждом сгенерированном make-файле, которая будет иметь значение, равное которому value было оценено во время создания make-файла. value может быть расширением оболочки. Так, например.

AC_SUBST(ARCH,[`./arch.sh`])

in configure.ac создаст в каждом make-файле задание:

ARCH = x86_64

предполагая, что x86_64 является стандартным выводом ./arch.sh в ./configure времени в каталоге сборки. Затем вы можете предположить, что эта переменная так назначена в вашем Makefile.am, и написать что-то вроде:

noinst_HEADERS = license/${ARCH}/lchecker.h
person Mike Kinghan    schedule 21.03.2019
comment
Я сделал именно то, что вы предлагаете, но у меня тот же результат :( - person Kyrol; 21.03.2019
comment
@Kyrol После этого вы регенерировали систему сборки? - make distclean; autoreconf; ./configure; make. - person Mike Kinghan; 21.03.2019
comment
Да. У меня есть скрипт ./build.sh, который делает это: autoreconf --force --install automake --add-missing autoconf. Даже если поставить make distclean результат тот же. - person Kyrol; 22.03.2019
comment
@Kyrol В таком случае я думаю, что настоящая проблема не видна в вашем посте. Лучше предоставьте минимально воспроизводимый пример. - person Mike Kinghan; 22.03.2019
comment
autoreconf уже звонит automake и autoconf (это цель autoreconf), поэтому вашему build.sh нужно позвонить только autoreconf. - person ndim; 16.06.2019