У меня есть несколько файлов Makefile в определенных каталогах приложений, например:
/project1/apps/app_typeA/Makefile
/project1/apps/app_typeB/Makefile
/project1/apps/app_typeC/Makefile
Каждый Makefile включает в себя файл .inc по этому пути на один уровень выше:
/project1/apps/app_rules.inc
Внутри app_rules.inc я устанавливаю место назначения, куда я хочу поместить двоичные файлы при сборке. Я хочу, чтобы все двоичные файлы были на своем app_type
пути:
/project1/bin/app_typeA/
Я пытался использовать$(CURDIR)
, как это:
OUTPUT_PATH = /project1/bin/$(CURDIR)
но вместо этого я похоронил двоичные файлы во всем имени пути следующим образом: (обратите внимание на избыточность)
/project1/bin/projects/users/bob/project1/apps/app_typeA
Что я могу сделать, чтобы получить «текущий каталог» выполнения, чтобы я мог знать только app_typeX
, чтобы поместить двоичные файлы в папку их соответствующих типов?
источник
$(lastword "$(MAKEFILE_LIST)")
make-файл на пути"Sub Directory/Makefile"
даст вам"Directory/Makefile"
. Я не думаю, что есть какой-то способ обойти это, так как$(MAKEFILE_LIST)
с двумя make-файлами дает вам одну строку"Makefile One Makefile Two
, которая не может обрабатывать пробелыcurrent_dir
не работает для меня.$(PWD)
делает, и это намного проще."solution only works when you are running make from the Makefile's current directory"
это мягкий способ сказать "не очень работает". Я бы поставил последнюю часть в верхней части ответа.Как взято отсюда ;
Появляется как;
Надеюсь это поможет
источник
dir
вместо того,shell dirname
чтобы получить путь с завершающим/
символом.DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))))
$MAKEFILE_LIST
должно предшествовать любымinclude
операциям ( документам ).dirname
- в случае пробелов в пути.Если вы используете GNU make, $ (CURDIR) на самом деле является встроенной переменной. Это
место, где Makefile находитсяв текущем рабочем каталоге, где, вероятно, находится Makefile, но не всегда .См. Приложение A Краткий справочник в http://www.gnu.org/software/make/manual/make.html.
источник
/
. Я пытался связать сgmake
v3.81. Но Ты прав, еслиmake
называется какmake -f xxx/Makefile
.CURDIR
у меня работает гдеPWD
нет. У меняmkdir -p a/s/d
тогда в каждой папке был make-файл, который печаталсяPWD
иCURDIR
раньше+$(MAKE) <subdir>
.источник
Я попробовал многие из этих ответов, но в моей системе AIX с gnu make 3.80 мне нужно было кое-что сделать в старом стиле.
Оказывается
lastword
,abspath
иrealpath
не были добавлены до 3.81. :(Как уже говорили другие, не самый элегантный, так как он дважды вызывает оболочку, и у него все еще есть проблемы с пробелами.
Но так как у меня нет пробелов в моих путях, это работает для меня независимо от того, как я начал
make
:Все дают мне
wherever
заcurrent_dir
и абсолютный путь дляwherever
заmkfile_dir
.источник
Мне нравится выбранный ответ, но я думаю, что было бы более полезно показать, как он работает, чем объяснить.
/tmp/makefile_path_test.sh
Вывод:
ПРИМЕЧАНИЕ . Функция
$(patsubst %/,%,[path/goes/here/])
используется для удаления косой черты.источник
Решение найдено здесь: https://sourceforge.net/p/ipt-netflow/bugs-requests-patches/53/
Решение : $ (CURDIR)
Вы можете использовать это так:
источник
$(CURDIR)
уже пытались безуспешно.make
был запущен). Это действительно то, что ОП действительно хотел, но название вопроса поддельное, поэтому сам вопрос противоречив. Таким образом, это правильный ответ на неправильный вопрос. ;)Вот одна строка для получения абсолютного пути к вашему
Makefile
файлу с использованием синтаксиса оболочки:А вот версия без оболочки, основанная на ответе @ 0xff :
Проверьте это, распечатав, например:
источник
Насколько я знаю, это единственный ответ, который корректно работает с пробелами:
Это в основном работает вытекание космических символов путем замены
' '
на'\ '
которых позволяет Сделать правильно разобрать его, а затем удаляет имя файла Makefile вMAKEFILE_LIST
делая другую замену , так что вы оставили с каталогом , который Makefile находится. Не совсем самый компактный вещь в мире, но это работает.Вы получите что-то вроде этого, где все пробелы будут экранированы:
источник
Пример для вашей справки, как показано ниже:
Структура папок может быть такой:
Там, где есть два файла Makefile, каждый, как показано ниже;
Теперь давайте посмотрим содержимое Makefiles.
Теперь выполните образец / Makefile, как;
Объяснение будет состоять в том, что родительский / домашний каталог может быть сохранен в флаге среды и может быть экспортирован, чтобы его можно было использовать во всех файлах подкаталогов.
источник
Обновление 2018/03/05 Finnaly Я использую это:
Это может быть выполнено правильно в относительном пути или абсолютном пути. Выполняется правильно, вызвано crontab. Выполнено правильно в другой оболочке.
покажите пример, a.sh напечатайте собственный путь.
старый: я использую это:
Может отображаться правильно, если выполняется в другой оболочке и другом каталоге.
источник
Одной строки в Makefile должно быть достаточно:
DIR := $(notdir $(CURDIR))
источник