このコードの抜粋は、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 ...