确保从特定目录调用make

时间:2019-02-04 12:26:12

标签: makefile gnu-make

我希望所有食谱都可以从特定目录(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

2 个答案:

答案 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