gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:47:05 33 4
gpt4 key购买 nike

我正在编写一个可以在 Windows 和 Linux 上运行的 makefile。因此,只要有可能,我都会避免特定于操作系统的 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 ----------------------------------------------------------

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

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

有人有想法吗?

<小时/>

编辑:

我引用了此链接:How do I get `make` to prompt the user for a password and store it in a Makefile variable?

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

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

只要您希望在 解析 makefile 时出现提示,这种提示用户输入的方式就可以正常工作。但我的情况有所不同。我想在 makefile 已经运行时提示用户,换句话说,当 makefile 中的配方正在执行时。

<小时/>

编辑:

运行 make multi-threaded 时无法提示用户。所以我完全可以单线程调用 clean 函数:

    >> make clean -j1

毕竟,clean 函数不需要很长时间就能完成。我不打算在 build 函数中提示用户输入任何内容,以便可以多线程执行:-)

    >> make all -j8 --output-sync=target

最佳答案

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

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

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

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

关于shell - 如何在我的 makefile 中提示用户输入 [y/n](使用纯 make 语法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39272954/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com