在 Makefile 脚本中读取用户输入

问题描述 投票:0回答:2

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

all:
    cd addons/godot-haskell-plugin && make && cd -
run:
    cd addons/godot-haskell-plugin && make run && cd -

我想做的是

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

我知道要在 bash 中执行此操作,您需要结合使用

echo
read
函数。但不清楚如何在 Make 中执行此操作。

shell makefile
2个回答
8
投票

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 条件。您可以使用其中任何一种,但在这种情况下,这是最干净的方法。


0
投票

这实际上可能是 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 中使用 reading,但我非常喜欢
make target VAR=value
的方法,因为它在硬编码所有内容和提示所有内容之间找到了中间地带shell脚本。

希望能帮助某人.

© www.soinside.com 2019 - 2024. All rights reserved.