2016-11-14 20 views
0

私のMakefileの一部:Makefileの静的なパターンルール

CFLAGS = -I ../headers -Wall 
EXECUTABLES = testPattern testPatterns 

$(EXECUTABLES): %Pattern: %.c pattern.o 
     g++ $(CFLAGS) [email protected] pattern.o -o [email protected] 

それは無関係ですので、私は、オブジェクトのコンパイルが含まれていませんでした。

このコードで問題があるのは、パターンが 'Pattern'で終わるため、パターンは最初の実行可能ファイルと一致し、2番目の実行可能ファイルはスクリプトを終了させる末尾に 's'が追加されていることです。 2番目の実行可能ファイルの名前を変更せずに動作させる方法はありますか?

おかげ

答えて

1

パターンは、前提条件のリストに表示されていないので、ここでは静的なパターンルールを使用してポイントはありません。ただし、ここでは.cファイルを前提条件として含めることも考えています。

なぜパターン一致にPatternを含めますか?

あなただけ書くことができます:それはこのようなものになるだろうあなたが直面している現実の問題を示すだろうより良い例を表示さ

CFLAGS = -I ../headers -Wall 
EXECUTABLES = testPattern testPatterns 

$(EXECUTABLES): % : %.c pattern.o 
     g++ $(CFLAGS) $^ -o [email protected] 

ETA:あなたが欲しい

EXECUTABLES = someThing somePattern morePatterns 

Patternを含む2つのバイナリにマッチする静的パターンルールですが、他は含まれません。

私が下の私のコメントで言ったように、あなたは静的パターンルールの目標部分でそれを行うことができないということを意味する単一のパターンでこれを行うことはできません。

しかし、あなたはこのようにそれを行うことができます:

$(foreach E,$(EXECUTABLES),$(if $(findstring Pattern,$E),$E)): % : %.c pattern.o 
     g++ $(CFLAGS) $^ -o [email protected] 

を。これは、基本的には文字列Patternが含まれているかどうかを確認するためにEXECUTABLESやテスト内の各エントリをループし、そのための文字列に展開された場合に何もないように展開します。

+0

こんにちは、私はうんざりしましたが、すでにそれを修正しました。ファイル名は前提条件に含まれています。パターンが必要なのは、名前とパターンがまったく違っていて、それらをすべて1つの変数に格納したいという実行可能ファイルがもう少しあるからです。私は、省略または偽の依存関係は望んでいません。私はそれらのための新しいルールを作るだろうが、私はそれらをすべて1つの変数に入れてほしい。 – Joe

+0

あなたの例は、接頭辞 'test'が同一であるため、あまり良くありません。 'EXECUTABLES = fooPattern barPatterns'を使用した方が良い例になります。連続していない複数の不変部分に一致する単一のパターンを書くことはできません。上記の例では、 'Pattern'の前の接頭辞と' Pattern'の後の接尾辞の両方に一致する単一のパターンを書くことはできません。単語ごとに1つの '% 'しか指定できないので、片方または両方に一致させることができます。 – MadScientist

+0

よろしくお願いします。迅速で明確な説明に感謝します。 – Joe

関連する問題