このコードの抜粋は、GNU makefileマニュアルの第8.6章からのものです。
makefileのファイル関数argの@ $ @。inはどういう意味ですか?rmのようなシェルコマンドの前に「@」記号が付いている理由
program: $(OBJECTS)
$(file >$@.in,$^)
$(CMD) $(CMDFLAGS) @$@.in
@rm $@.in
ファイル関数の構文は
$(file op filename[,text])
このコードの抜粋は、GNU makefileマニュアルの第8.6章からのものです。
makefileのファイル関数argの@ $ @。inはどういう意味ですか?rmのようなシェルコマンドの前に「@」記号が付いている理由
program: $(OBJECTS)
$(file >$@.in,$^)
$(CMD) $(CMDFLAGS) @$@.in
@rm $@.in
ファイル関数の構文は
$(file op filename[,text])
回答:
ここには3つの無関係な用途があり@ます。
では$@、文字@はルールで使用できる自動変数の名前です。その変数の値は、ルールが構築するターゲットです。
ときに@非常にだけでタブ文字の後に、レシピ(コマンド)行の先頭で使用されている、それはコマンドが原因と印刷されていない、それが実行されようとしていたとき。
@他の場所のキャラクターは特別ではありません。
したがって、あなたの例では、ビルドするにはprogram:
file関数が呼び出されます。ターゲット($^自動変数)の依存関係をファイルに書き込みますprogram.in。変数に格納されているコマンドに加えてCMD、変数CMDFLAGSに格納されているパラメーターと追加のパラメーターが実行されます@program.in。これが何をするかCMDは何に依存します。
コマンドrm program.inは、最初に印刷せずに実行されます。
いくつかのコマンドは、で始まるパラメーター@を、より多くのパラメーターを読み取るファイルを示すものとして扱います。これはDOSの慣例です。DOSはコマンドラインの長さに厳しい制限があり、コマンドの出力をコマンドラインに補間する方法がないためです。Unixにはこれらの制限がないため、Unixの世界では一般的ではありません。したがって、レシピの効果は次のようになります。
$(CMD) $(CMDFLAGS) $(OBJECTS)
行の@接頭辞は、行のエコーを抑制します。
デフォルトでは、実行前のmake各行を出力しますMakefile。行がで始まる場合@、それらの行は印刷されません。
なし@:
$ cat > Makefile
hello:
echo hello world
$ make hello
echo hello world
hello world
と@:
$ cat > Makefile
hello:
@echo hello world
$ make hello
hello world
行頭でのみエコー@が抑制されることに注意してください。または通常の文字列であり、その中で展開されます:>$@.in@$@.in$@
$ cat hello
hello:
@echo @$@.in
$make hello
@hello.in
>$@.in、ファイルモードとして使用される理由は含まれていませんが、独自の方法で有用です。おかげでcuonglm ...