3

約 100 個のソース ファイルで構成されるライブラリがあります。他のファイルのいずれかがコンパイルされている場合、ソースの 1 つを常に再構築したいのですが、make/build を実行するたびにそれを構築したくありません。

基本的に、このファイルには最終ビルドの日付/時刻が組み込まれているため、ライブラリにリンクしているアプリケーションは最終ビルドの時刻/日付を確認できます。これを行う他の方法はありますか?

4

2 に答える 2

8

ビルド タイムスタンプを含むオブジェクト ファイルが他のすべてのオブジェクト ファイルに依存するようにします。

version.o: $(OBJECTS)
于 2008-11-26T12:59:42.037 に答える
4

JesperEのソリューションを少し拡張します。

オブジェクトファイルを、実行可能ファイルが依存するすべてのターゲット(それ自体を除く)に依存させます。

したがって、実行可能ファイルがすべてオブジェクトに依存している場合、JesperEは完全に正しいです。

それ以外の場合、他の依存関係の1つが変更されても、オブジェクトファイルが変更されない場合は、タイムスタンプを更新せずに実行可能ファイルを再構築できます。したがって、質問で言及されている2つのこと、「最後のビルド日時がある」と「ソースのいずれかがコンパイルされている場合は再ビルドされる」は、実際には同じものではないため、どちらが必要かによって異なります。

例としては、静的にリンクするライブラリや、リンクを実行するために使用され、開発者の便宜のために依存関係になっているために大幅に変更されるスクリプトが含まれる場合があります。

実行可能ファイルを削除して再構築しただけでは、タイムスタンプは更新されません(おそらく、リンカの最新バージョンを取得した、または変更したなど、関連性はあるが依存関係ではない何かが変更されたためです)リンカやメイクファイルに影響を与える環境内の何か)。したがって、最善の方法は、次のように、実行可能ファイルをビルドするためのルールの一部としてオブジェクトをコンパイルすることです。

blah.exe : whatever
    rm -f version.o
    $(CC) $(CFLAGS) -c version.c
    $(CC) $(CFLAGS) $(OBJFILES) version.o -o blah.exe

または何でも(makeを使用している場合はおそらく.exeではありませんが、わかりません)。最後の行が失敗してもversion.oは削除されないため、実際にはエラー処理は少し危険です。

また、ユーザーに何かをリリースする場合(つまり、基本的に机から10フィート以上離れている人)は、make to updateを実行するだけでなく、とにかくゼロから構築することをお勧めします。そしてそれを出荷します。それ以外の場合は、makefileを台無しにして、依存関係を見逃し、誤って「混合バージョン」を作成し、出荷したものを再現する方法がないようにするのは非常に簡単です。

私は以前にmakefileをジグザグして、バージョン番号が開発者によってビルドされた場合に意図的に妨害された(「0.0プライベートビルド」に設定)ようにしました。ビルドサーバーのみが、適切なバージョン番号を有効にするために使用されるオプションを設定しました。そのプロジェクトでは、タグによってソース管理からチェックアウトされておらず、そこから構築されていないものに番号を付けることは意味がありませんでした。

于 2008-11-26T13:32:42.143 に答える