Выполнение команд в каталоге, в котором находится файл, в котором они были определены - PullRequest
0 голосов
/ 21 июля 2010

Рассмотрим, если хотите, следующую ситуацию:

$ pwd
/tmp/submake_example
$ head $(find -type f)
==> ./subdir/Makefile <==
subtarget:
        echo "executing subtarget from directory $$(pwd)"

==> ./Makefile <==
include subdir/Makefile
$ make subtarget
echo "executing subtarget from directory $(pwd)"
executing subtarget from directory /tmp/submake_example

Есть ли способ, которым я могу выполнить команду для цели subtarget из каталога subdir? Я хотел бы иметь возможность доступа к целям включенных make-файлов из командной строки в главном каталоге.

1 Ответ

0 голосов
/ 22 июля 2010

После некоторого копания и экспериментов я обнаружил пару вещей.

Подход, рекомендованный этой ссылкой , которая относится к статье Рекурсивная обработка считается вредной , это довольно сложно и включает в себя ручное ведение стека каталогов по всей иерархии включения make-файла.

Я также обнаружил, независимо от какой-либо ссылки, что последний элемент переменной $ (MAKEFILE_LIST) будет, по крайней мере,для некоторых базовых тестовых случаев укажите имя файла Makefile, который в данный момент включен.Это означает, что его каталог можно хранить в просто расширенной целевой переменной с кодом, подобным

foo: dir := $(dir $(lastword $(MAKEFILE_LIST)))

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

Вы должны быть осторожны, чтобы присвоить присвоение dir перед любыми директивами include в этом make-файле.не работает, если в имени каталога есть пробел, но я понимаю, что в make практически ничего не работает, если в именах файлов или каталогов есть пробелы.

Также примечательно, что в этом подходе используются только функции, найденные вGNU сделать.Для меня это звучит как убийственное приложение, хотя я немного озадачен тем, почему они просто не предоставляют имя каталога во встроенной переменной или функции.

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

...