web-dev-qa-db-ja.com

GNU makefile文字列を引用する方法と時期

Makeファイルで文字列を引用する方法とタイミングを教えてください。ベストプラクティスとは何ですか?

以下は引用する方法ですか?

$(warning  $(Shell ls -ld "$(CURDIR)" ) )

私は通常、埋め込みスペースを考慮して変数を引用するBashに精通しています。あなたはメイクファイルでそのようなことをしていますか?

文字列を使用して代入ステートメントを実行するにはどうすればよいですか?

vara := "$(CURDIR)"

varb := $(CURDIR)

varc := /home/me/source

vard := "/home/me/source"

イコール後のスペースはどうですか?

29
historystamp

絶対に引用しないでくださいmakeのため。 makeは、単一引用符または二重引用符の文字を理解または解析しません。 makefileに書き込むすべての引用文字は、リテラル引用符として保持され、makeが呼び出すコマンドにそのまま渡されます。

したがって、シェルが引用された文字列を予期して解釈できる場合は、引用符を使用する必要があります。シェルが引用符付きの文字列を予期しない、または正しく解釈しない場合は、引用符を使用しないでください。

あなたの例では、引用符が受け入れられるかどうかは、それらの変数がどのようにsedであるかに依存しています。上記のように、makeは引用符で特別なことを行いません。つまり、vard(たとえば)はリテラル文字列"/home/me/source"(引用符を含む)を含みます。

シェルが引用符を処理する方法でその値を使用する場合は、問題ありません。

all: ; echo $(vard)

シェルが解釈するため、/home/me/source(引用符なし)が出力されます。しかし、たとえばターゲットや前提条件として、makeコンテキストで変数を使用する場合:

all: $(vard)
$(vard): ; echo $@

ターゲットと前提条件はリテラル文字列"/home/me/source"(引用符を含む)であるため、これはnotです。

一般的には、変数内のファイル名を引用符で囲まず、レシピのmake変数を引用符で囲むのが最善です。もちろん、変数にファイル名だけでなくシェルスクリプト全体が含まれている場合は、適切な引用符をスクリプトに追加する必要があります。

27
MadScientist