Убедитесь, что make вызывается из определенного каталога - PullRequest
0 голосов
/ 04 февраля 2019

Я бы хотел, чтобы все мои рецепты выполнялись из определенного каталога, каталога, в котором находится 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 имеет отступ.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Отвечая на вопрос, который вы задали, не комментируя, хорошая это идея или нет, я не уверен, где вы нашли этот синтаксис:

@error "Please run make from the directory of the Makefile, or use make -C"

, но это определенно неправильно.error - это функция make, поэтому вы хотите:

$(error Please run make from the directory of the Makefile, or use make -C)
0 голосов
/ 04 февраля 2019

Вариант с вашей последней попытки будет повторно вызывать Make в правильном каталоге с той же целью:

ifneq (${MAKEFILE_DIR_LOCATION},${WORKING_DIR})

%:
    $(MAKE) -C ${MAKEFILE_DIR_LOCATION} $@

.PHONY: %

else

## rest of Makefile rules

endif
...