作为一个相当复杂的跨平台构建的一部分,我调用了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
模式调用)。模板引擎返回的工件测试为.is_derived()
的True。看起来这会导致java发射器忽略包目录结构,但我想不出原因。也许我需要为模板创建完整的构建器,停止使用Command
,并覆盖.is_derived()
的默认值。或者我可以创建一个新的Java构建器(基于提供的构建器),而不检查发射器。