BUILT_SOURCES = version.h
として言及されているすべてのファイルBUILT_SOURCES
は、通常のコンパイル規則が実行される前にビルドされます。
ただし、これにより、わずかな問題が発生します。呼び出しのversion.h
たびに再構築する必要があるため、すべてのファイルの再コンパイルが実行のたびに再度トリガーされます。実際に何かが変更された場合にのみ再コンパイルが行われるようにすることをお勧めします。make
foo.c
#include
version.h
make
この問題を回避するには、BUILT_SOURCES
毎回「作成」されるスタンプ ファイルへの依存関係を使用します (実際には作成されないため、ビルド ルールは毎回実行されます)。そのスタンプ ファイルのビルド ルールは、新しいversion.h
ファイルを として作成し、が実際に異なる場合version.h.tmp
にのみコピーversion.h.tmp
します (ルールと同様)。したがって、 で何も変更されていない場合、そのタイムスタンプ (mtime) は同じままであり、依存するオブジェクトのビルドはトリガーされません。version.h
version.h.tmp
version.h
version.h
version.h
version.h
BUILT_SOURCES = version.stamp
version.stamp:
echo '#define VERSION "'`hg id`'"' > version.h.tmp
cmp version.h.tmp version.h || mv version.h.tmp version.h
このソリューションは、あなたが求めていることを行います。
残念ながら、dist tarball からビルドする場合、ちょっとした問題があります:hg id
偽の情報が表示されますが、おそらくversion.h
tarball には何もないため、ビルドは失敗するか、偽のバージョン情報が含まれます。
を使用しているxf86-video-radeonhdプロジェクトでこの問題を解決しましたgit
。このgit-version.h
ソリューションで生成されたファイルには、単一のバージョン番号だけでなく、いくつかのバージョン情報が含まれています。RadeonHD.amのgit_version.shとフックアップ (できればすべてのソースツリー外およびfrom-dist-tarballビルドケースの処理を含む) の最後に、私のこの更新のみの場合に異なるソリューションを確認できます。もし興味があれば。BUILT_SOURCES