makefileのファイル関数は、 '@'記号が前に付いた引数を取ります


10

このコードの抜粋は、GNU makefileマニュアルの第8.6章からのものです。

makefileのファイル関数argの@ $ @。inはどういう意味ですか?rmのようなシェルコマンドの前に「@」記号が付いている理由

program: $(OBJECTS)
     $(file >$@.in,$^)
     $(CMD) $(CMDFLAGS) @$@.in
     @rm $@.in

ファイル関数の構文は

$(file op filename[,text])
make 

回答:


9

ここには3つの無関係な用途があり@ます。

では$@、文字@はルールで使用できる自動変数の名前です。その変数の値は、ルールが構築するターゲットです。

ときに@非常にだけでタブ文字の後に、レシピ(コマンド)行の先頭で使用されている、それはコマンドが原因と印刷されていない、それが実行されようとしていたとき。

@他の場所のキャラクターは特別ではありません。

したがって、あなたの例では、ビルドするにはprogram

  1. file関数が呼び出されます。ターゲット($^自動変数)の依存関係をファイルに書き込みますprogram.in
  2. 変数に格納されているコマンドに加えてCMD、変数CMDFLAGSに格納されているパラメーターと追加のパラメーターが実行されます@program.in。これが何をするかCMDは何に依存します。

  3. コマンドrm program.inは、最初に印刷せずに実行されます。

いくつかのコマンドは、で始まるパラメーター@を、より多くのパラメーターを読み取るファイルを示すものとして扱います。これはDOSの慣例です。DOSはコマンドラインの長さに厳しい制限があり、コマンドの出力をコマンドラインに補間する方法がないためです。Unixにはこれらの制限がないため、Unixの世界では一般的ではありません。したがって、レシピの効果は次のようになります。

$(CMD) $(CMDFLAGS) $(OBJECTS)

2

行の@接頭辞は、行のエコーを抑制ます。

デフォルトでは、実行前の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 ...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.