2016-07-11 1 views
0

Makefileのdefineディレクティブ内の1つまたは複数の行をコメントしたいので、ディレクティブが展開されたときにその行が無視されるようにします。目標は、Makefileのユーザーにとって、コメント行をヒントとして配置し、defineディレクティブに含めることのできる例を示すことです。ディレクティブはターゲットに展開されます。言い換えればMakefile defineディレクティブ内の行をコメントする方法は?

、私はMakefileの

define ECHO_FOO = 
# @echo foo 
endef 

all: 
    @echo Before call 
    $(ECHO_FOO) 
    @echo After call 

.PHONY: all 

はこの1つ以上同じ動作を持っていることを望む:

define ECHO_FOO = 
endef 

all: 
    @echo Before call 
    $(ECHO_FOO) 
    @echo After call 

.PHONY: all 

問題は、最初のMakefileは私に次のエラーを与えることである。

process_begin:のCreateProcess(NULL、#@エコーfooという、...)が失敗しました。 make(e = 2):指定されたファイルが見つかりません。 のMakefile:6: 'すべて' の目標のためのレシピは メイクを失敗しました:*** [すべて]エラー2

GNU make:Makefile contentsページ状態:定義ディレクティブ内

が、コメントは無視されていません変数の定義中に、変数の値にそのまま残っていました。変数が展開されると、変数が評価されるコンテキストに応じて、コメントを作成するかレシピテキストとして扱われます。

しかし、この特定のケースでは、#シンボルがメイクコメントまたはレシピテキスト(これは私が会う問題のようです)として扱われています。

#シンボルをdefine関数のコメントマークとして扱う方法を教えてもらえますか?私はMinGWのは上の3.82を作る実行している

#@echo foo 
    #@echo foo 
##@echo foo 
    ##@echo foo 
\#@echo foo 
    \#@echo foo 
/#@echo foo 
    /#@echo foo 

は、私はすでに私に正しい出力を与えた #記号をエスケープするか、インデントが、それらのどれを変更する考えに以下の行をすべて試してみましたWindowsを使用していますが、すでにmake v3.82.90と4.1の他の実装を試しています。 Windowsでは

答えて

1

あなたは直接のために求めているものを行うための方法はありません。変数の内容はレシピコンテキストで展開されるので、変数が何に展開されてもレシピの一部とみなされ、そこにある文字はすべてシェルに渡されます。

:はシェルのno-op演算子であるため、:はWindowsのcommand.comと同様にUNIXシェルでも使用できます。それ以外の場合は、有効なコマンドではないコマンド:echoを実行しようとしますが、後にスペースを追加する必要があります。しかし、さらに注意してください、シェルはまだラインを拡大します!これは、バッククォートなどを使用すると、それらがまだ展開されていることを意味します。また、ステートメントなので、セミコロンはそれを停止します。ですから、例えば:

ここ
define ECHO_FOO 
: echo hi `echo there 1>&2` ; echo bye 
endef 

all: ; @$(ECHO_FOO) 

、echoコマンドが実行されていないためhiが印刷されませんが、バッククォートはまだそれほど展開されthereは(stderrに)印刷され、セミコロンは「ノー終了-op "コマンドのようにbyeも印刷されます。彼らはあなたがdefineを使用している理由は単純なものが疑問に思うことをしている場合、あなたのコマンドは、その後:が動作する十分に単純ですが、場合

...

別のオプションは、単に変数を上書きするのではなく、それをコメントすることですアウト:

define ECHO_FOO = 
    @echo foo 
endef 

ECHO_FOO = 

ETA:あなたはコマンドがシンプルであることを断言したコメントでが最終ユーザーによって拡張される可能性があること、またはそれが違いを生む理由がわかりません。

しかし、私はをほのめかしたことは、あなたが簡単なコマンドを持っている場合は、単に書くことができるということです。

ECHO_FOO = echo hi 

defineを使用していません。 defineは、複雑なコマンドにのみ必要です。実際には、エスケープされていない改行を含むコマンドにのみ必要です。

そして、あなたが書く場合:
ECHO_FOO =# echo hi 

は、あなたはコメントをシェルではない、コメントを作る使用して変数の内容をコメントアウトされているので、それはどこでも動作します。

+0

ありがとう、それはうまく動作し、私はそれが両方のシステムで動作することを知ってうれしいです。実際、コマンドはシンプルですが、最終的なユーザーによって拡張される可能性があります。私は最終的なユーザーが自分のメイクファイルの知識を持っていてはいけないので、何か簡単なものを探していました。少なくともそれは私の目標だった。 – Tim

+0

回答が更新されました。 – MadScientist

+0

これは本当に複雑ではありません。ビルド後のすべてのスクリプト呼び出しを含むディレクティブです。つまり、0(コメント付きのデフォルト)から多くのものまでです。 defineディレクティブは最良の解決策であるように見えましたが、おそらくそれは貧しい選択でした。 – Tim

1

、あなたはコメント文字として:を使用することができます。 MS-DOSの従来のコメントキーワードはREM(「発言」のように)です。

+0

ありがとう、 '@ rem'を使って動作しますが、私はOSに依存しないソリューションを好むでしょう。私は待って、別の解決策が来るかどうかを見て、解決策がなければ私はあなたを受け入れます。 – Tim

関連する問題