Получение каталога makefile находится в - PullRequest
4 голосов
/ 29 декабря 2010

Как правильно получить каталог, в котором находится исполняемый в данный момент make-файл?

В настоящее время я использую export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST)))) и сталкиваюсь с некоторыми проблемами, при которых при запуске make с точно такими же параметрамив разных значениях для ROOT.Приблизительно в 90% случаев оно имеет правильное значение, но в оставшихся 10% есть ряд недопустимых путей.

Ответы [ 3 ]

10 голосов
/ 12 мая 2011

realpath, abspath, lastword и несколько других функций были введены только в GNU Make 3.81 [см. Ссылку].Теперь вы можете получить текущее имя файла в более старых версиях, используя words и word:

THIS_MAKEFILE:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))

Но я не уверен в обходе realpath без перехода в оболочку.например, это работает с make v3.80:

THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
THIS_MAKEFILE:=$(notdir $(THIS_MAKEFILE_PATH))

all:
        @echo "This makefile is $(THIS_MAKEFILE) in the $(THIS_DIR) directory"

, что дает

$ make -f ../M
This makefile is M in the /home/sandipb directory

Ref: http://cvs.savannah.gnu.org/viewvc/make/NEWS?revision=2.93&root=make&view=markup

4 голосов
/ 04 января 2011

$ (shell pwd) неверно, поскольку make-файл может существовать в каталоге, отличном от pwd (как разрешено make -f).

ОП предлагает

export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST))))

хорошо, за исключением того, что он / она, вероятно, хочет вместо этого использовать firstword, особенно если make-файл верхнего уровня (потенциально) include другой make-файл (ы) до назначения ROOT.

Проблему ОП 10% можно было бы объяснить, если бы было условное включение в 10% времени до назначения, но, эй, это предположение ...

1 голос
/ 18 декабря 2012

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

все: echo $ (CURDIR)

...