と:
FILES = $(shell ls)
その下にインデントされてall
いるのは、ビルド コマンドです。これが展開$(shell ls)
され、コマンドを実行しようとしますFILES ...
。
FILES
が変数であると想定される場合make
、これらの変数はレシピ部分の外で割り当てる必要があります。たとえば、次のようになります。
FILES = $(shell ls)
all:
echo $(FILES)
もちろん、これは、.tgz ファイルを作成するコマンドを実行する前にFILES
、"output from ls
"に設定されることを意味します。( Kaz が指摘しているように、変数は毎回再展開されるため、最終的には .tgz ファイルが含まれます。一部の make バリアントでは、効率および/または正確さのために、これを回避する必要があります。1 )FILES := ...
がシェル変数であると想定されている場合FILES
は、それを設定できますが、スペースを入れずに引用符で囲んだシェル ese で行う必要があります。
all:
FILES="$(shell ls)"
ただし、各行は個別のシェルによって実行されるため、この変数は次の行まで存続しないため、すぐに使用する必要があります。
FILES="$(shell ls)"; echo $$FILES
*
そもそもシェルが(および他のシェルグロブ式を)展開するので、これはすべて少しばかげているので、次のことができます。
echo *
シェルコマンドとして。
最後に、一般的なルールとして (この例には実際には当てはまりません):エスペラントがコメントで指摘しているように、 からの出力を使用することls
は完全に信頼できるわけではありません (一部の詳細はファイル名に依存し、場合によっては のバージョンにも依存しますls
。一部のバージョンの のls
出力はサニタイズを試みます)ある場合には)。したがって、l0b0とidelic note のように、GNU make を使用している場合は、それ自体ですべてを実行するため$(wildcard)
に andを使用できます(「ファイル名の奇妙な文字」の問題を回避します)。( makefile のレシピ部分を含むスクリプトでは、別の方法を使用して、空白、改行、制御文字などのつまずきを回避します。)$(subst ...)
make
sh
find ... -print0 | xargs -0
1 GNU Make のドキュメントには、POSIX makeが 2012 年に割り当てを追加したことがさらに記されてい::=
ます。このための POSIX ドキュメントへのクイック リファレンス リンクは見つかりませんでした。また、代入をmake
サポートするバリアントがどれかをすぐに知ることもできません。::=
:=
私が知る限り、最新のすべての GNU および BSD バリアントを含む、いくつかのバリアントでVAR := $(shell command args...)
綴ることもできることに注意してください。これらの他のバリアントにはないため、使用は短く、より多くのバリアントで機能するという点で優れています。VAR != command args...
make
$(shell)
VAR != command args...