Makefile — экспорт объявлений во вложенные makefile

#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 Тогда я не понял вашего вопроса.