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)
从概念上讲,make 是一个非常简单的应用程序,只有一个目的 - 构建一棵依赖关系树,并重新制作具有更新祖先的东西。交互不应该成为一个因素,因此 make 本身不会提供交互,理想情况下 make 应该已经拥有它所需的所有信息。如果您确实需要,您可以使用shell,来解决这个问题!=,甚至可以使用 guile 或 提供您自己的扩展load。
但这并不真正适用于该clean规则,因为clean首先不会重新制作任何内容,这只是一个快速技巧,可让您使用 make 语法方便地表达非 make 操作。
就我个人而言,我不认为提示用户删除文件有什么价值,除非您要删除不由您负责的内容,这本身就已经是一种反模式。
如果你绝对确定你需要这个,那么将配方包装clean在一个脚本中,并为 bash 和 windows 提供两个版本。您还可以假设在 Windows 上运行 GNU make 的任何人都已经在使用 MSYS2、Cygwin 或 MS 批准的Windows 10 bash版本,并完全放弃 cmd / powershell 脚本。
| 归档时间: |
|
| 查看次数: |
4544 次 |
| 最近记录: |