3

「ビルド」のディレクトリを含むファイル システムがあり、各ディレクトリには「build-info.xml」というファイルが含まれています。ただし、ビルドスクリプトが「build-info.xml」を生成する前にビルドの一部が発生したため、その場合、スケルトン build-info.xml を生成するために使用されるやや自明ではない SCons SConstruct があり、それを次のように使用できます。さらなるルールへの依存。

すなわち:各ディレクトリについて:

  • build-info.xml が既に存在する場合は、何もしません。さらに重要なことは、「scons --clean」で削除しないことです。
  • build-info.xml が存在しない場合は、代わりにスケルトンを生成します - build-info.xml は他のファイルに依存しません - スケルトンは本質的に最小限のデフォルトです。
  • --clean 中に、build-info.xml が生成された場合は削除し、そうでない場合はそのままにしておきます。

私の SConstruct は次のようになります。

def generate_actions_BuildInfoXML(source, target, env, for_signature):
    cmd = "python '%s/bin/create-build-info-xml.py' --version $VERSION --path . --output ${TARGET.file}" % (Dir('#').abspath,)
    return cmd

bld = Builder(generator = generate_actions_BuildInfoXML, chdir = 1)
env.Append(BUILDERS = { "BuildInfoXML" : bld })

...

# VERSION = some arbitrary string, not important here
# path = filesystem path, set elsewhere
build_info_xml = "%s/build-info.xml" % (path,)
if not os.path.exists(build_info_xml):
    env.BuildInfoXML(build_info_xml, None, VERSION = build)

私の問題は、「scons --clean」が生成された build-info.xml ファイルを削除しないことです。

「if」内でenv.Clean(t、build_info_xml)をいじりましたが、これを機能させることができませんでした-主に「t」に何を割り当てるかを理解できなかったためです-生成されたビルド情報が必要です。 xml は、別のターゲットのクリーニングに基づくのではなく、無条件にクリーニングする必要がありましたが、これを機能させることができませんでした。

「if」の後で単純な env.Clean(None, "build_info_xml") を試してみると、生成されなかったものを含むすべての build-info.xml ファイルが SCons によって消去されることがわかりました。どちらも良くありません。

私が知りたいのは、SCons がどのファイルをクリーニングする必要があり、どのファイルをクリーニングしないかを決定する方法です。SCons がこのターゲットを Clean 候補として記録するのを防ぐジェネレーター関数の使用方法について何かおかしいことはありますか?

4

1 に答える 1

8

さて、私は何が起こっているのかを理解したと思います-SConsが作成したファイルを(ターゲットとして)記録し、その後の「クリーン」中にこの記録されたリストを使用するという誤った仮定をしました。もちろん、これは意味がありません。

SConsが実際に行うことは、すべての依存関係ルールを再実行し、新しい依存関係ツリーを作成することです。これを使用して、クリーンアップするファイルを決定します。os.path.exists()条件があったため、build-info.xmlは--cleanの実行時に常に存在するため、Cleanリストに追加されなかったことを意味します。

env.Clean()適切に機能しており、そのようなファイルはすべて削除されます。これは、2回目の実行時に(--cleanを使用して)SConsが特定のビルド情報を知る方法がないためです。 .xmlファイルは、すでに存在するのではなく生成されました。

これを回避する方法は、生成されたファイルと一緒にセンチネルファイルを作成することです。しかし今のところ、SConsのクリーンな振る舞いについての私の新しい理解で十分です。

于 2010-03-19T02:37:14.123 に答える