Сделать включение в make-файлы относительно местоположения файла - PullRequest
19 голосов
/ 10 ноября 2011

Непосредственно связан с этим вопросом .Как я могу заставить директиву include в make-файлах вести себя относительно расположения текущего скрипта?

Предположим, что путь current является произвольным, и вы не можете его контролировать.Только местоположение make-файла известно.Ваш make-файл не является корневым - он включен.Именно так в Android NDK.

Есть ли встроенная переменная с именем текущего make-файла?Могу ли я удалить имя файла, оставив только путь?Использование make 3.81 на Cygwin.

Ответы [ 3 ]

17 голосов
/ 10 ноября 2011

Вы можете получить имя обрабатываемого в данный момент make-файла из встроенной переменной MAKEFILE_LIST .

Учитывая, что текущий make-файл является последним , который был включен (другими словами, вы не использовали другую директиву include с начала текущего скрипта), путь к скрипту само по себе будет:

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

Теперь вы можете включить сценарий в тот же каталог, что и (обратите внимание на отсутствие косой черты, он уже был добавлен $(dir ...)):

include $(SELF_DIR)another.mk

Примечание: в GNU Make 3.80 не было встроенной функции lastword. В этом случае вы можете реализовать его следующим образом, заменив $(lastword ...) на $(call lastword,...):

lastword = $(if $(firstword $1),$(word $(words $1),$1))
7 голосов
/ 10 ноября 2011

Есть ли встроенная переменная с именем текущего make-файла?

Да, есть, используйте $ {CURDIR}.Это каталог, в котором находится Makefile верхнего уровня, поэтому вам не нужно ничего извлекать из него.

http://www.gnu.org/software/make/manual/make.html#Recursion

2 голосов
/ 10 ноября 2011

Я считаю, что относительные пути работают (GNUMake 3.81), но если они вам не подходят, попробуйте это:

include $(abspath ../whatever)
...