0

1 つのヘッダー ファイルを含む 2 つのソース ファイルがあるとします。交流:

#include "ab.h"

int a() {
    return RETURN_VAL;
}

紀元前:

#include "ab.h"

int b() {
    return !RETURN_VAL;
}

ab.h:

#define RETURN_VAL (0)

ac と bc の 1 回の呼び出しでコンパイルできる makefile が必要です ab.h が新しいか、ac と bc が両方とも新しい場合は、次のようにします: gcc -c ac bc touch ab.timestamp そうでない場合は、古いものだけを再コンパイルしますファイル。

これは小さな例です。スケーリングできるものが必要です。これを解決しようとしましたが、方法がわかりません。

これは C を使用した例ですが、実際の使用は大規模な HDL プロジェクトのコンパイルです。HDL コンパイラの呼び出しには高いオーバーヘッドがあるため、ツールをファイルごとに個別に呼び出すよりも、多くのファイルに対して 1 回呼び出す方がはるかに優れています。

私が試したことは次のようなものです:

a.c: ab.h ;
b.c: ab.h ;

ab.timestamp: a.c b.c
  gcc -c $?
  touch ab.timestamp

これは機能しません。代わりに、次のようなものが必要です。

ab.timestamp: a.c b.c ab.h
  gcc -c a.c b.c
  touch ab.timestamp

これは私が望んでいないことです。$? 再コンパイルする必要がある正しいファイルを示します。$(if および $(filter 関数を使用してこれを把握できることはわかっていますが、もっとシームレスなものを望んでいました。

私はGNU Makeを使用しています。

ありがとう、ナチュム

4

2 に答える 2

1

これはトリックですが、うまくいくかもしれません:

all: ab.timestamp

SOURCES = a.c b.c ab.h
a.o: a.c ab.h
b.o: b.c ab.h

CHANGED :=
%.o: %.c ; $(eval CHANGED += $<)

ab.timestamp: $(SOURCES) $(patsubst %.c,%.o,$(filter %.c,$(SOURCES)))
        gcc -c $(CHANGED)
        touch $@
于 2013-06-20T01:51:02.273 に答える
0

これはクラッジですが、うまくいくようです。ソース ファイルをタッチして、ヘッダーで最新の状態にします。

a.c b.c: ab.h
    @touch $@

ab.timestamp: a.c b.c
    gcc -c $?
    touch ab.timestamp
于 2013-06-20T04:42:01.240 に答える