如何在我的makefile中提示用户输入[y / n](使用纯make语法)?

K.M*_*ier 5 shell makefile gnu-make

我正在编写一个在Windows和Linux上都可以使用的makefile。因此,我尽可能避免使用特定于OS的Shell命令。

这是我的makefile中的片段,clean最后是函数:

# OS specific part
# -----------------
ifeq ($(OS),Windows_NT)
    RM = del /F /Q
    RMDIR = -RMDIR /S /Q
    MKDIR = -mkdir
    ERRIGNORE = 2>NUL || (exit 0)
    SEP=\\
else
    RM = rm -rf 
    RMDIR = rm -rf 
    MKDIR = mkdir -p
    ERRIGNORE = 2>/dev/null
    SEP=/
endif
PSEP = $(strip $(SEP))

# Definitions for nullstring and space
# -------------------------------------
nullstring :=
space := $(nullstring) #End

# Lists of all files and folders to keep or remove
# -------------------------------------------------
buildFiles_toKeep := ...    # I wrote some scripts to
buildDirs_toKeep := ...     # automatically generate
buildFiles_toRemove := ...  # these lists. But that would lead
buildDirs_toRemove := ...   # us too far here.


.PHONY: clean
clean:
    @echo.
    @echo ----------------------------------------------------------
    @echo.$(space)        __         **************    $(space)
    @echo.$(space)      __\ \___     * make clean *    $(space)
    @echo.$(space)      \ _ _ _ \    **************    $(space)
    @echo.$(space)       \_`_`_`_\                     $(space)
    @echo.$(space)                                     $(space)
    @echo.$(space)Keep these files:
    @echo.$(space)  $(buildFiles_toKeep)
    @echo.$(space)
    @echo $(space)Keep these directories:
    @echo.$(space)  $(buildDirs_toKeep)
    @echo.$(space)
    @echo.$(space)Remove these files:
    @echo.$(space)  $(buildFiles_toRemove)
    $(RM) $(buildFiles_toRemove)
    @echo.
    @echo.$(space)Remove these directories:
    @echo.$(space)  $(buildDirs_toRemove)
    $(RMDIR) $(buildDirs_toRemove)
    @echo.
@echo ----------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

这个makefile很好用。在Windows和Linux上,它都可以替换$(RM)并$(RMDIR)使用适当的Shell命令删除文件和文件夹。但是我想提示用户,让他/她可以按Y或N。我不想删除他/她想要保留的文件。我尝试将一些批处理命令插入clean目标用户的配方中,以提示用户输入。但是没有显示提示。也许是因为GNU make延迟了输入流。

我想知道是否可以使用“ pure” make语法生成[Y / N]提示符(没有特定于OS的Shell命令)。我知道make语言有其局限性。聪明的解决方案也许可以在一个操作系统(例如Linux)上运行,并以最小的开销移植到另一个操作系统(例如Windows)。

有人知道吗?


编辑:

我得到了以下链接:如何获取`make`来提示用户输入密码并将其存储在Makefile变量中?

Gnu make将PASSWORD通过提示用户来创建变量:

$ cat Makefile 
PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd')
Run Code Online (Sandbox Code Playgroud)

只要您希望在解析 makefile时出现提示,这种提示用户输入的方法就可以正常工作。但是我的情况不同。我想在makefile 已经运行时(即,makefile中的配方正在执行时)提示用户。


编辑:

当您运行make多线程时,将不会提示用户。所以我完全可以调用clean单线程函数:

    >> make clean -j1
Run Code Online (Sandbox Code Playgroud)

毕竟,该clean功能用不了多长时间即可完成。我不打算在build功能中提示用户输入任何内容,因此可以执行多线程:-)

    >> make all -j8 --output-sync=target
Run Code Online (Sandbox Code Playgroud)

use*_*267 1

从概念上讲,make 是一个非常简单的应用程序,只有一个目的 - 构建一棵依赖关系树,并重新制作具有更新祖先的东西。交互不应该成为一个因素,因此 make 本身不会提供交互,理想情况下 make 应该已经拥有它所需的所有信息。如果您确实需要,您可以使用shell,来解决这个问题!=,甚至可以使用 guile 或 提供您自己的扩展load。

但这并不真正适用于该clean规则,因为clean首先不会重新制作任何内容,这只是一个快速技巧,可让您使用 make 语法方便地表达非 make 操作。

就我个人而言,我不认为提示用户删除文件有什么价值,除非您要删除不由您负责的内容,这本身就已经是一种反模式。

如果你绝对确定你需要这个,那么将配方包装clean在一个脚本中,并为 bash 和 windows 提供两个版本。您还可以假设在 Windows 上运行 GNU make 的任何人都已经在使用 MSYS2、Cygwin 或 MS 批准的Windows 10 bash版本,并完全放弃 cmd / powershell 脚本。