2017-10-14 7 views
0

あなたがマニュアルを作るGNUのCatalog of Rulesセクションを読めば、それが認識接尾辞の一つが.outで、組み込みのルールがあることが判明:GNU Makeはファイルからfile.outを作成するデフォルトルールを持っているのはなぜですか?

%.out: % 
# commands to execute (built-in): 
    @rm -f [email protected] 
    cp $< [email protected] 

これはあなたが持っている場合ことを意味しディレクトリにxyzというファイルがある場合は、単にmake xyz.outと入力してxyz.outを作成できます。

私の質問は、(同じ質問の二つの変種)である:

  • このルールから利益を得ますか?
  • これはどのような場合に使用されますか?私は、ルールのファウルを実行するために管理しているため

もちろん、私は聞いていますのよ。

名前 test.01は偽のターゲットであるが、依存関係の1つが test.01.outある
test.01: ${PROGRAM} ${DRIVER} test.01.tst test.01.out ${DATA.01} 
    ${DRIVER} ${D_FLAGS} [email protected] 

:私のようないくつかのルールを持っていました。

make[1]: Circular test.01 <- test.01.out dependency dropped. 
私もで .out接尾辞をドロップしようとした

.SUFFIXES: 
.SUFFIXES: .sh 

、それはいないようでした。積極的に(make -nを使用していない正常に動作している)を実行すると、これは私のようなエラーの多くを提供します私が期待したように.outのルールを中和する。それはGNU Makeの期待される機能ですか?

は、私はGNUの機能が.reqまたは類似した何かに私のサフィックスを変更してくださいこのバグを回避する必要がありますするつもりだと思いますが、それは迷惑であり、私は.outルールがある理由について困惑残っています標準のGNU Makeルールセットの一部。

答えて

1

このルールの使用に関するご質問に対する回答はわかりません。私が言うことができるのは、1992年1月にGNU makeがソースコントロールに最初にチェックインされたときに、このルールがすでに存在していたということだけです。これはChangeLogには言及されていないので、

実際のルールはパターンルールとして定義されているため、.SUFFIXESを変更することは役に立ちません。それを取り除くには:

%.out : % 

(レシピなし)パターンルールを削除します。

+0

ありがとうございました。だから、答えは(もしあれば)時間の霧の中で失われている - 私は私が驚いていると言えるだろうと思うが、私はそうではない。パターンルールを抑制する方法に関する情報は役立ちます。有難うございます。 '.SUFFIXES'でフーチングすることがパターンルールを抑制するのに役立たないことの確認も役立ちます。 (そして、推測では、あなた自身がファイルを作成するためにルールを使用しないので、そこには驚くことはありません!) –

+0

私は個人的に私のmakefileにbuit-inルールを使用しません。私の経験では、彼らは最も単純な環境にのみ役立ちます。私はいつも新しい変数を追加するためにコンパイルパターンを再定義する必要があることを常に知っており、他は時間を無駄にするだけです。だから、私のmakefileは、通常、すべての組み込みルールを削除するためにスタンザを含んでいます。 – MadScientist

+1

'の理由を知りたければ。Roland McGrathまたはRMS :) – MadScientist

関連する問題