2017-10-26 8 views
0

私は、オブジェクトファイルにCファイルをコンパイルするための既存の%.c%.oのメイクファイルを持っています。暗黙ルールのすべての使用に依存関係を追加する

しかし、この暗黙のルールを使用して作成された.oファイルはすべて、追加のヘッダーfoo.hに依存していることをお勧めします。

は、私は、個々の.oファイルは次のように、foo.hに依存するために追加のワンオフルールを追加することができます知っている:

bar.o : foo.h 

...しかし、私はすべての依存関係としてfoo.hを追加したいです.oファイルは.c個のファイルから生成されます。私は依存関係を「追加」が、暗黙のルールを守ることができるかどうかを確認するために

%.o : foo.h 

%.o : %.c foo.h 

と、この:私はこれを試してみまし上記と同様

動作しませんでした。私は確かにちょうどように私のパターンルールに暗黙のルールからレシピをコピー&ペーストすることができます

%.o : %.c foo.h 
    $(CC) -c $(CPPFLAGS) $(CFLAGS) $< 

しかし、私は可能であればそれを複製しないたいと思います。

答えて

2

あなたの難しさは、makeがパターンルールをどのように扱うかによるものです。すべてのオブジェクトファイルの前提条件として、foo.hを使用するように強制するには、パターンルールに依存せず、オブジェクトファイルを明示的にリストする必要があります。しかし、makeはこれを行う方法を提供しています。スタティックパターンルールは、パターンルールのように見えますが、類似したルールのセットのコンパクトなフォームに似ています。例:

OBJS := $(patsubst %.c,%.o,$(wildcard *.c)) 

$(OBJS): %.o: foo.h 

唯一の制約は、すべてのオブジェクトファイルを列挙する方法を見つける必要があるということです。これはしばしば実際の問題ではありません。

具体的には、パターンの機能は、すべてのターゲットで前提条件が同じであるため、必要でもありません。

OBJS := $(patsubst %.c,%.o,$(wildcard *.c)) 

$(OBJS): foo.h 
+0

ありがとうございました。私は暗黙のルールを複製することとほぼ同じだと思います。 – BeeOnRope

+0

@BeeOnRope私は[Implicit Rule Search Algorithm](https://www.gnu.org/software/make/manual/make.html#Implicit-Rule-Search)に関連していると思います。ステップ4を参照してください... –

+0

マニュアルを引用する: "複数のターゲットを持つ通常のルールよりも一般的です。なぜなら、ターゲットは同じ前提条件を持つ必要がないからです。" ...しかし、この場合の前提条件は同じですから、通常の '$(OBJS):foo.h'より静的パターン規則を使用する利点はありません。私は何かが恋しいですか? – Vroomfondel

関連する問題