6

Makefile.amファイルに記載されている 1 つのヘッダー ファイルを生成するファイルを作成したいと思いxxx.cます。

含まれているとしましょうxxx.c

#include <version.h>
...

の最後にそれを作成するルールがあることMakefile.am:

version.h:
       echo '#define VERSION "'`hg id`'"' > version.h.tmp
       cmp version.h.tmp version.h || mv version.h.tmp version.h

xxx.cコンパイルを依存させるには何を変更する必要がありversion.hますか? してみnodist_progname_SOURCES=version.hましたが、うまくいかないようです。

4

1 に答える 1

11
BUILT_SOURCES = version.h

として言及されているすべてのファイルBUILT_SOURCESは、通常のコンパイル規則が実行される前にビルドされます。

ただし、これにより、わずかな問題が発生します。呼び出しのversion.hたびに再構築する必要があるため、すべてのファイルの再コンパイルが実行のたびに再度トリガーされます。実際に何かが変更された場合にのみ再コンパイルが行われるようにすることをお勧めします。makefoo.c#includeversion.hmake

この問題を回避するには、BUILT_SOURCES毎回「作成」されるスタンプ ファイルへの依存関係を使用します (実際には作成されないため、ビルド ルールは毎回実行されます)。そのスタンプ ファイルのビルド ルールは、新しいversion.hファイルを として作成し、が実際に異なる場合version.h.tmpにのみコピーversion.h.tmpします (ルールと同様)。したがって、 で何も変更されていない場合、そのタイムスタンプ (mtime) は同じままであり、依存するオブジェクトのビルドはトリガーされません。version.hversion.h.tmpversion.hversion.hversion.hversion.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.htarball には何もないため、ビルドは失敗するか、偽のバージョン情報が含まれます。

を使用しているxf86-video-radeonhdプロジェクトでこの問題を解決しましたgit。このgit-version.hソリューションで生成されたファイルには、単一のバージョン番号だけでなく、いくつかのバージョン情報が含まれています。RadeonHD.amのgit_version.shとフックアップ (できればすべてのソースツリー外およびfrom-dist-tarballビルドケースの処理を含む) の最後に、私のこの更新のみの場合に異なるソリューションを確認できます。もし興味があれば。BUILT_SOURCES

于 2009-11-22T21:03:28.073 に答える