私はWindowsとLinuxの両方で動作するはずのmakefileを書いています。可能であれば、OS特有のシェルコマンドを避けることができます。ここで私のメイクファイルで[y/n]のプロンプトを表示するにはどうすればいいですか?
は終わり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 ----------------------------------------------------------
このメイクは素晴らしい作品。 WindowsとLinuxの両方で、$(RM)
と$(RMDIR)
を適切なシェルコマンドに置き換えてファイルとフォルダを削除します。しかし、私はY/Nを押すことができるようにユーザーに促したいと思います。私は彼/彼女が保持したいファイルを削除したくありません。私は入力を促すclean
ターゲットの受信者にバッチコマンドを挿入しようとしました。しかし、プロンプトは表示されません。おそらくGNU makeが入力ストリームを代行するからです。
「純粋な」make構文(OS特有のシェルコマンドなし)で[Y/N]プロンプトを生成することができるのだろうかと思います。私はmake言語には限界があることを知っています。おそらく、巧妙な解決策はあるオペレーティングシステム(Linuxなど)で動作し、別のオペレーティングシステム(Windowsなど)に最小のオーバーヘッドで移植することができます。
誰かアイデア?
EDIT:
私は、このリンクを参照ました:How do I get `make` to prompt the user for a password and store it in a Makefile variable?
ヌーは、ユーザを促すことで、変数PASSWORD
を作成します作る:
$ cat Makefile
PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd')
促すこの方法入力のためのユーザーは、あなたがあなたのマックの瞬間にプロンプトを表示したい限り、うまく動作しますefileはであり、解析済みです。しかし、私の場合は異なっています。メイクファイルが(すでに)で実行されているとき、つまりmakefileのレシピが実行されているときに、ユーザにプロンプトを出したいと思います。
EDIT:あなたはマルチスレッドmakeを実行したときに
ユーザに促すことはできません。だから私は、シングルスレッドclean
関数を呼び出すと完全に大丈夫だよ:
>> make clean -j1
結局のところ、clean
機能が終了する時間はかかりません。依存関係のツリーを構築し、 - 私はそれが
>> make all -j8 --output-sync=target
あなたは端末からしかビルドできません。あなたのユーザーを考慮してください。ジェンキンスや「M-x compile」などから、彼らが必要とするものを、インタラクションのために邪魔されることなく構築することができます。とにかく、シリアル化(シングルCPU)ビルドを強制するつもりですか?それは私が数年で見た最悪のアイデアです^ Wweeks(私は最近ではあまりにも多くの時間を費やしています)。 –
これは助けになるかもしれないhttp://stackoverflow.com/a/20671804/5291015あなたはyes/noプロンプトに対して同じものを変更できます – Inian
@ Tobi:シリアル化された(シングルCPU)ビルドを強制しません。恐らく、 'clean'コマンドはシングルCPUでなければならない(プロンプトがあるので)。しかしそれは大きな問題ではない。 'build'コマンドは望みの数のコアを使うことができます。私は通常フラグを '-j8'に設定します。 –