我有一个非常简单的 Makefile(只是递归调用另一个子目录 make):
all:
cd addons/godot-haskell-plugin && make && cd -
run:
cd addons/godot-haskell-plugin && make run && cd -
我想做的是
ENV_VAR
。ENV_VAR=1 make all
应该完全按照上面的 make all
执行)。make all
和 make run
,并且输入“n”只是回显一条消息并退出。我知道要在 bash 中执行此操作,您需要结合使用
echo
和 read
函数。但不清楚如何在 Make 中执行此操作。
Make 并不是真的要互动,但你可以拼凑它。
有不止一种方法可以做到这一点,但由于您似乎希望这种行为特定于某些目标(
all
和 run
),我会添加一个与用户交互并可能中止 Make 的 PHONY 目标:
all run: check
.PHONY: check
check:
ifndef ENV_VAR
@echo Warning: ENV_VAR isn\'t defined\; continue? [Y/n]
@read line; if [ $$line = "n" ]; then echo aborting; exit 1 ; fi
endif
请注意,我对一个变量使用 Make 条件,对另一个变量使用 bash 条件。您可以使用其中任何一种,但在这种情况下,这是最干净的方法。
这实际上可能是 George 所问的相反,但从更多 make 内置函数、更少 shell 脚本的意义上来说,这里有一个版本可以称为“更惯用”的版本:
all:
ifndef ENV_VAR
$(error Need a value for ENV_VAR, e.g., make <target> ENV_VAR=value)
endif
cd addons/godot-haskell-plugin && make && cd -
run:
cd addons/godot-haskell-plugin && make run && cd -
此语法适用于 macOS Catalina 附带的旧 GNU
make
,因此我认为出于实际目的,它几乎可以在任何地方使用。如果 2023 年不是这种情况,请纠正我,对于目前广泛使用的任何操作系统。
由于
here提到的原因,最好避免在 Makefile 中使用
read
ing,但我非常喜欢 make target VAR=value
的方法,因为它在硬编码所有内容和提示所有内容之间找到了中间地带shell脚本。
希望能帮助某人.