Я бы хотел, чтобы все мои рецепты выполнялись из определенного каталога, каталога, в котором находится Makefile
.
Это поведение по умолчанию при вызове make
без параметров, но пользователь можетвсегда запускать:
(cd /somewhere; make -f /path/to/directory/Makefile)
Чтобы убедиться, что рабочий каталог make
совпадает с каталогом, в котором находится Makefile
, существует несколько решений:
- run
make
без параметров (по умолчанию), из этого конкретного каталога (cd /path/to/directory; make
) - используйте
make -C /path/to/directory
cd
до /path/to/directory
для каждого рецепта, например:
MAKEFILE_DIR_LOCATION := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
a:
cd ${MAKEFILE_DIR_LOCATION} && do_something_from_makefile_folder
b:
cd ${MAKEFILE_DIR_LOCATION} && do_another_thing_from_makefile_folder
Проблема состоит в том, что первые два решения требуют действий от пользователя, вызывающего Makefile, а последнее загромождает Makefile
.
Есть ли более красивый способ гарантировать, чтовсе рецепты выполняются из каталога, где расположен Makefile
?
Дополнительное решение (не работает)
Я тоже думал, сравнивая рабочий каталог ($(shell pwd)
) с ${MAKEFILE_DIR_LOCATION}
и выйдите, если он не совпадаетАст предупреждает пользователя, что make
не вызывается правильно), но я не могу найти, как это сделать.Я попытался:
MAKEFILE_DIR_LOCATION := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
WORKING_DIR := $(shell pwd)
ifneq (${MAKEFILE_DIR_LOCATION}, ${WORKING_DIR})
@error "Please run make from the directory of the Makefile, or use make -C"
endif
a:
do_something_from_makefile_folder
b:
do_another_thing_from_makefile_folder
Но я получил ошибку missing separator
(строка @error
) или recipe commences before first target
, если строка @error
имеет отступ.