1

かなり複雑なクロスプラットフォーム ビルドの一部として、SCons Java ビルダーを呼び出します。.java ファイルは * テンプレートから自動生成されます。これらにはパッケージ情報が含まpackage com.example.package;れており、それに応じてディレクトリに配置されます。src/com/example/package/MyClass.java

SConscript:

# javaSources is the absolute path to each java file i.e src/com/example/package/MyClass.java
# outputClassesPath is classes/
JavaArtifacts = env.Java(target = outputClassesPath, source = javaSources)

scons への最初の呼び出しにより、MyClass.java が正しくビルドされ、出力がclasses/com/example/package/MyClass.class

変更せずに scons を再度呼び出すと、javac コマンドが再度実行されます。私が得る使用scons --debug=explain

scons: building 'classes/MyClass.class' because it doesn't exist

これは本当ですが、classes/com/example/package/MyClass.class存在します!

これは私には SCons のバグのように見えます。SCons は適切な場所に .class ファイルを正しく作成しているようですが、最初のパスはこの適切な場所がどこにあるかを認識していないようです。

更新: Java ファイルはテンプレート エンジン (env.Commandパターンを使用して呼び出されます) によって作成されます。テンプレート エンジンによって返されるアーティファクトは、 に対して True をテストし.is_derived()ます。これにより、パッケージのディレクトリ構造が Java エミッターによって無視されるように見えますが、その理由はわかりません。たぶん、テンプレート用の完全なビルダーを作成し、 の使用をやめCommand、 のデフォルトをオーバーライドする必要があります.is_derived()。または、エミッターでこのチェックを行わずに、(提供されたものに基づいて) 新しい Java ビルダーを作成することもできます。

4

0 に答える 0