#makefile
#makefile
Вопрос:
Я знаю, что переменные могут быть экспортированы в вложенные makefile: передача переменных в вложенный make
Пример:
-
Makefile:
export PWD := $(shell pwd) target: @echo $(PWD) @cd somewhere; $(MAKE)
-
где-нибудь/Makefile
target: @echo $(PWD)
Предположим, что первый Makefile находится по адресу /path/to/first/makefile
, приведенный выше код выведет:
/path/to/first/makefile
/path/to/first/makefile
Мой вопрос: есть ли способ разрешить неявное вычисление переменной PWD внутри вложенных файлов makefile?
Вывод должен выглядеть следующим образом:
/path/to/first/makefile
/path/to/first/makefile/somewhere
Пока я могу думать только о:
- Экспортируем объявление литерала и используем функцию
eval
- Сделайте это как-нибудь с
.SECONDEXPANSION
- Поместите объявление в отдельный файл и включите его как в первый, так и во второй Makefile
Все это решение является эксплицитным: они подразумевают, что код должен быть добавлен к вложенным make-файлам. То, что я ищу, — это неявное решение, которое изменит только код внутри первого Makefile.
Плюс, честно говоря…первые два решения настолько уродливы, что я бы предпочел вручную объявлять PWD в каждом вложенном makefile.
[ПРАВИТЬ]
Просто чтобы было более понятно: переменная PWD — это всего лишь пример, я не пытаюсь получить путь к каждому Makefile.
Комментарии:
1. Какую версию Make вы используете? Эти makefile работают так, как вы предполагаете в GNUmake 3.8.1.
2. Я использую GNU Make 3.81
3. Я не думаю, что это возможно. Для переменных среды всегда так, если они назначены с
:=
, а не с=
Ответ №1:
Используйте ${MAKEFILE_LIST}
переменную и позволяйте создавать каталоги изменений для вас:
[max@earth:~/tmp]$ cat Makefile
target:
@echo $(abspath $(lastword ${MAKEFILE_LIST}))
${MAKE} -C somewhere $@
[max@earth:~/tmp]$ cat somewhere/Makefile
target:
@echo $(abspath $(lastword ${MAKEFILE_LIST}))
[max@earth:~/tmp]$ make target
/home/max/tmp/Makefile
make -C somewhere target
make[1]: Entering directory '/home/max/tmp/somewhere'
/home/max/tmp/somewhere/Makefile
make[1]: Leaving directory '/home/max/tmp/somewhere'
Выводит полный путь к обрабатываемому makefile. Используется для отсечения имени файла . $(dir $(abspath $(lastword ${MAKEFILE_LIST})))
Makefile
Комментарии:
1. Это не отвечает на мой вопрос по двум причинам: 1) PWD — это всего лишь пример, чего я пытаюсь добиться, так это автоматического расширения экспортируемой переменной, а не получения значения текущего каталога при каждом makefile (я отредактирую свой вопрос, чтобы сделать его более понятным). 2) Предлагаемое вами решение будет подразумевать изменение кода внутри каждого вложенного makefile, и это именно то, чего я пытаюсь избежать.
2. @TKK Тогда я не понял вашего вопроса.