2016-09-01 6 views
3

私は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 
+1

あなたは端末からしかビルドできません。あなたのユーザーを考慮してください。ジェンキンスや「M-x compile」などから、彼らが必要とするものを、インタラクションのために邪魔されることなく構築することができます。とにかく、シリアル化(シングルCPU)ビルドを強制するつもりですか?それは私が数年で見た最悪のアイデアです^ Wweeks(私は最近ではあまりにも多くの時間を費やしています)。 –

+0

これは助けになるかもしれないhttp://stackoverflow.com/a/20671804/5291015あなたはyes/noプロンプトに対して同じものを変更できます – Inian

+0

@ Tobi:シリアル化された(シングルCPU)ビルドを強制しません。恐らく、 'clean'コマンドはシングルCPUでなければならない(プロンプトがあるので)。しかしそれは大きな問題ではない。 'build'コマンドは望みの数のコアを使うことができます。私は通常フラグを '-j8'に設定します。 –

答えて

1

:-)マルチスレッドで実行することができるので、概念的には1つの目的とした非常に単純なアプリケーションであることを確認、build機能に何のためにユーザに要求するつもりはありません新しい祖先を持つものをリメイクします。インタラクションは要素ではないので、makeはそれをネイティブに提供しません。理想的には、必要なすべての情報を既に持っている必要があります。あなたが本当に必要とする場合は、shell!=でこれを回避するか、guileまたはloadを使用して独自の内線番号を提供することもできます。

cleanルールには当てはまりませんが、cleanは最初に何かをリメイクしないので、make構文を使用して非メイク操作を便利に表現できるようにするのが簡単です。

個人的には、自分自身の反パターンである責任を負わないものを削除しようとしているのでなければ、ファイルの削除を求めるメッセージが表示されません。

これが必要な場合は、cleanレシピをスクリプトに入れて、bashとwindowsの2つのバージョンを用意してください。また、Windows上でGNU makeを実行している人は、すでにMSYS2、Cygwin、またはMSの承認済みリリースbash for Windows 10を使用していて、cmd/powershellスクリプトを完全に使用していると仮定することもできます。

+0

makeはシンプルに保つべきであり、ユーザの入力に依存しないことに同意します。私はまだGnu Makeを試している限り、確認のためのプロンプトを出します。プロンプトを別の.batスクリプトに入れて、そのスクリプトをレシピ・ラインで呼び出そうとしました。残念ながら、Gnu makeが入力ストリームを延期するように見えるので、プロンプトが端末に表示されません。どのようにそれを解決するための任意のアイデアですか? –

+0

'set/p yn =" Y/N: "'でスクリプトを試してみましたが、うまくいくように思えますが、スクリプトでは何をしていますか? – user657267

+0

はい、そうです。 'set/p yn =" Y/N: 'は' .bat'スクリプトに入れば完全に動作します。 –

関連する問題