Включить в Makefile другой Makefile с относительным путем - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть такое дерево каталогов с некоторыми "общими целями" в файле rules.Makefile:

├── Makefile
├── rules.Makefile
└── my_subdir
    └── Makefile

Я хотел бы вызвать эти "общие цели" в обоих Makefile (s) в родительском каталоге и дочернем каталоге.

Также «пользовательские цели» в Makefile в дочернем каталоге должны вызываться из Makefile в родительском каталоге.

По какой-то причине я могу вызывать цели в rules.Makefile только с родного брата Makefile (тот, что находится в родительском каталоге).При использовании относительных путей в Makefile в дочернем каталоге при попытке доступа к rules.Makefile в родительском каталоге я получаю некоторые ошибки.

Содержимое Makefile в родительском каталоге:

RULES_MAKEFILE_PATH=$(PWD)/rules.Makefile
include $(RULES_MAKEFILE_PATH)

foo-parent:
    @echo $(RULES_MAKEFILE_PATH)

Содержимое Makefile в дочернем каталоге ( обратите внимание, что двойная точка ..):

RULES_MAKEFILE_PATH=$(PWD)/../rules.Makefile
include "$(RULES_MAKEFILE_PATH)"

foo-child:
    @echo $(RULES_MAKEFILE_PATH)

При вызове из родительского каталога make foo-parent, тогда я вижу ожидаемый путь.

При вызове от дочернего директора make foo-child, тогда я вижу эту ошибку:

$ make foo-child 
Makefile:9: "/<PARENT_PATH>/my_subdir/../rules.Makefile": No such file or directory
make: *** No rule to make target '"/<PARENT_PATH>/my_subdir/../rules.Makefile"'. Stop.
  • Как я могу заставить относительные пути работатьв «дочернем каталоге»?
  • Также, как я могу вызвать цели, определенные в Makefile в дочернем каталоге (например, foo-child) из Makefile в родительском каталоге?

1 Ответ

0 голосов
/ 21 февраля 2019

Ну, во-первых, $(PWD) не является специальной переменной для создания.Это просто обычная переменная, которая импортируется из вашей оболочки.Таким образом, оно всегда будет иметь одинаковое значение в вашем make-файле и во всех включенных make-файлах, оно не изменится только потому, что вы включаете make-файл из другого каталога.

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

И все пути вinclude строки оцениваются на основе каталога, в котором находилась директория, когда он запускался, а не на пути относительно проанализированного в данный момент make-файла.Так что если Makefile включает foo/Makefile, то foo/Makefile имеет include bar.mk, make будет искать bar.mk, а не foo/bar.mk.

...