在 Makefile 脚本中读取用户输入

Geo*_*rge 1 shell makefile

我有一个非常简单的 Makefile(只是递归调用另一个子目录 make):

all:
    cd addons/godot-haskell-plugin && make && cd -
run:
    cd addons/godot-haskell-plugin && make run && cd -
Run Code Online (Sandbox Code Playgroud)

我想做的是

  1. 检查是否ENV_VAR定义了shell 变量。
  2. 如果是,那么像往常一样运行 Makefile(即,ENV_VAR=1 make all应该完全按照make all上面的方式运行)。
  3. 如果不是,则提示用户一条消息“警告:ENV_VAR 未定义;继续?[Y/n]”,其中“Y”的输入make allmake run往常一样通过,“n”的输入简单地回显一条消息并退出。

我知道要在 bash 中执行此操作,您将使用echoread函数的组合。但目前尚不清楚如何在 Make 中做到这一点。

Bet*_*eta 6

Make 并不是真正打算进行交互,但您可以将其混为一谈。

有不止一种方法可以做到这一点,但由于您似乎希望此行为特定于某些目标(allrun),我将添加一个与用户交互的 PHONY 目标,并且可能会中止 Make:

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
Run Code Online (Sandbox Code Playgroud)

请注意,我对一个变量使用 Make 条件,对另一个变量使用 bash 条件。您可以使用任何一个,但在这种情况下,这是最干净的方法。