我希望所有食谱都可以从特定目录(Makefile
所在的目录)执行。
这是在不带选项的情况下调用make
时的默认行为,但用户始终可以运行:
(cd /somewhere; make -f /path/to/directory/Makefile)
为确保make
工作目录与Makefile
所在的目录相同,有多种解决方案:
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
。
答案 0 :(得分:3)
回答您提出的问题时不评论它是否是一个好主意,我不确定您在哪里找到此语法:
@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)
答案 1 :(得分:2)
您上次尝试的变体会在相同的目标位置重新调用正确的目录中的Make:
ifneq (${MAKEFILE_DIR_LOCATION},${WORKING_DIR})
%:
$(MAKE) -C ${MAKEFILE_DIR_LOCATION} $@
.PHONY: %
else
## rest of Makefile rules
endif