Ich schreibe ein Makefile, das sowohl unter Windows als auch unter Linux funktionieren sollte. Wo immer es möglich ist, vermeide ich OS-spezifische Shell-Befehle.Wie Benutzer in meinem Makefile (mit pure make syntaxis) zur Eingabe von [y/n] aufgefordert werden?
Hier ist ein Ausschnitt aus meiner Make-Datei mit der clean
Funktion am Ende:
# 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 ----------------------------------------------------------
Diese Make-Datei funktioniert super. Sowohl unter Windows als auch unter Linux ersetzt es $(RM)
und $(RMDIR)
durch die richtigen Shell-Befehle zum Löschen von Dateien und Ordnern. Aber ich möchte den Benutzer darauf hinweisen, dass er Y oder N drücken kann. Ich möchte keine Dateien löschen, die er behalten möchte. Ich habe versucht, einige Batch-Befehle in die Rezepte des clean
Ziels einzufügen, die den Benutzer zur Eingabe auffordern. Aber die Aufforderung wird nicht angezeigt. Vielleicht, weil GNU make den Eingabestrom verzögert.
Ich frage mich, ob es möglich ist, eine Eingabeaufforderung [Y/N] mit 'pure' make Syntaxis (keine OS-spezifische Shell-Befehle) zu generieren. Ich weiß, dass die Markensprache ihre Grenzen hat. Vielleicht kann eine clevere Lösung auf einem Betriebssystem (zB Linux) funktionieren und mit minimalem Overhead auf einen anderen (zB Windows) portiert werden.
Wer eine Idee?
EDIT:
ich zu diesem Link verwiesen wurde: How do I get `make` to prompt the user for a password and store it in a Makefile variable?
Gnu die Variable PASSWORD
durch den Benutzer auffordert, machen erstellen:
$ cat Makefile
PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd')
Diese Art der Aufforderung Der Benutzer für die Eingabe funktioniert gut, solange Sie die Eingabeaufforderung im Moment Ihrer Mak erscheinen soll efile ist geparst. Aber mein Fall ist anders. Ich möchte den Benutzer auffordern, wenn das Makefile bereits ausgeführt wird, mit anderen Worten, wenn die Rezepte im Makefile ausgeführt werden.
EDIT:
Auffordern des Benutzers nicht möglich sein wird, wenn Sie mit mehreren Threads laufen lassen. So bin ich völlig in Ordnung mit dem Aufruf der Funktion clean
Single-Threaded:
>> make clean -j1
Denn die clean
Funktion nicht zu beenden dauert lange. Ich beabsichtige nicht, den Benutzer für etwas in der build
Funktion zu veranlassen, so dass Multi-Threaded :-)
>> make all -j8 --output-sync=target
Was, also können Sie nur von einem Terminal bauen? Bitte beachten Sie Ihre Benutzer; Lass sie aus Jenkins oder 'M-x kompilieren' oder was auch immer sie brauchen, bauen, ohne für die Interaktion geärgert zu werden. Wie wollen Sie sicherstellen, dass die Eingaben ohnehin an den richtigen Prozess gehen - werden Sie eine serialisierte (Single-CPU) Build erzwingen? Das ist die schlechteste Idee, die ich seit Jahren gesehen habe^Wweeks (ich verbringe zu viel Zeit mit SO in diesen Tagen). –
Dies könnte hilfreich sein http://stackoverflow.com/a/20671804/5291015. Sie können das gleiche für Ihre Ja/Nein-Eingabe ändern – Inian
@Tobi: Ich erzwinge keine serialisierte (Single-CPU) Build. Vielleicht sollte der 'clean'-Befehl Single-CPU sein (weil es eine Eingabeaufforderung gibt). Aber das ist keine große Sache. Der Befehl 'build' kann beliebig viele Kerne verwenden. Normalerweise setze ich die Flagge auf "-j8". –