shell 在Makefile脚本中阅读用户输入

uxhixvfz  于 2023-05-01  发布在  Shell
关注(0)|答案(2)|浏览(104)

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

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

我想做的是
1.检查是否定义了shell变量ENV_VAR
1.如果是,则照常运行Makefile(i.即,ENV_VAR=1 make all应与上述make all完全相同)。
1.如果不是,则提示用户一条消息“Warning:ENV_VAR未定义;continue?[Y/n]",其中输入“Y”像往常一样传递make allmake run,输入“n”简单地回应消息并退出。
我知道要在bash中做到这一点,你需要使用echoread函数的组合。但目前还不清楚如何在Make中做到这一点。

mfpqipee

mfpqipee1#

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

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

8fq7wneg

8fq7wneg2#

这实际上可能与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年的情况不是这样,请纠正我,对于目前广泛使用的任何操作系统。*

最好避免在Makefile中使用read,因为提到了here的原因,但我非常喜欢make target VAR=value的方法,因为它在硬编码所有内容和用大量粗糙的shell脚本提示所有内容之间找到了中间地带。
希望能帮助到******************************************************************************************************************************************************************************************************************************************************

相关问题