1

ファイルから以前のバージョン番号を読み取り、新しいバージョン番号と現在の日付でソース ファイルを更新し、次のビルドの準備ができている元のファイルに番号を書き戻すように scons を取得したいと思います。

これは、ターゲットが古い場合にのみ発生する必要があります。IOW ビルドが行われない場合、バージョン番号は変更されません。元のファイルはソース管理されており、ソース ファイルではありません。それ以外の場合は、チェックイン時に別のビルドをトリガーする可能性があります (CI による)。明確化sconsの観点からは、ソース ファイルが自動生成されるため、コードは常に最新ではありませんが、scons は、SCM の変更が検出された場合に継続的インテグレーション ジョブ (Jenkins) からのみ実行されます。

を調べましたAddPostMethodが、これはソース ファイルのリスト内のすべてのファイルに対して発生するようです。
CommandおよびBuilderメソッドは を使用するVARIANT_DIRため、これらのファイルを編集できず、リポジトリにマップされなくなったため、再度チェックインできません。

私はアイデアが不足している他のsconsの詳細のいくつかを誤解しているだけだと思っています!

更新 これをもう少し考えてみると、トムのコメントは正しいです。バージョン管理されたテキスト ファイル (非ソース コード) とソース管理されていないソース ファイルの 2 つのファイルがありますが、1 つのファイルをチェックインしてビルド/チェックインの連続サイクルを防ぐ方法はありません。Jenkins は新しいテキスト ファイルを確認してビルドをスピンオフし、scons は新しく生成されたファイルを確認します。したがって、生成されたファイルをある時点で削除しない限り、これは両方のツールのワークフローに反するようです。

これを達成する方法はありますか?それはかなり簡単に思えます。最終的には、ビルドが開始されるたびにビルド番号を生成したいだけです。

4

1 に答える 1

1

SCons User Guide セクション 8, Order-Only Dependenciesから、次のRequires方法を使用できます。

import time

# put whatever text you want in your version.c; this is just regular python
version_c_text = """
char *date = "%s";
""" % time.ctime(time.time())
open('version.c', 'w').write(version_c_text)

version_obj = Object('version.c')

hello = Program('hello.c',
                LINKFLAGS = str(version_obj[0]))

Requires(hello, version_obj)

注意すべき 2 つの点: まず、明示的なRequires依存関係を追加する必要があります。第 2 に、version_obj を Program builder のソースにすることはできません。ごまかす必要があります (ここでは linkflag として渡します)。

これにより、常に version.c が更新されますが、version.c が変更されたという理由だけで再構築されることはありません。

于 2014-06-11T22:27:03.413 に答える