После некоторого копания и экспериментов я обнаружил пару вещей.
Подход, рекомендованный этой ссылкой , которая относится к статье Рекурсивная обработка считается вредной , это довольно сложно и включает в себя ручное ведение стека каталогов по всей иерархии включения make-файла.
Я также обнаружил, независимо от какой-либо ссылки, что последний элемент переменной $ (MAKEFILE_LIST) будет, по крайней мере,для некоторых базовых тестовых случаев укажите имя файла Makefile, который в данный момент включен.Это означает, что его каталог можно хранить в просто расширенной целевой переменной с кодом, подобным
foo: dir := $(dir $(lastword $(MAKEFILE_LIST)))
Вот и все.Тогда вы можете просто использовать $(dir)
в этом правиле, как и любую другую переменную;он сохраняет значение, которое он принял при включении make-файла.cd
к нему, поместите его в командные пути, что угодно.
Вы должны быть осторожны, чтобы присвоить присвоение dir
перед любыми директивами include в этом make-файле.не работает, если в имени каталога есть пробел, но я понимаю, что в make
практически ничего не работает, если в именах файлов или каталогов есть пробелы.
Также примечательно, что в этом подходе используются только функции, найденные вGNU сделать.Для меня это звучит как убийственное приложение, хотя я немного озадачен тем, почему они просто не предоставляют имя каталога во встроенной переменной или функции.
В любом случае это работает, по крайней мере, на первый взгляд,Я все еще в значительной степени просто плаваю на этом без какой-либо реальной резервной копии, поэтому комментарии по поводу практичности этого подхода и альтернативные предложения очень приветствуются.