使用SCons从两个目录构建Java类

时间:2017-08-02 22:08:08

标签: java build scons

我有一个项目,它有一些特定于Android的代码和桌面特定的代码。由于Java没有类似#ifdef的东西,我将os特定代码放在它自己的目录中。像这样的东西

project
+-- common
|   +-- src
|       +-- com
|           +-- example
|               +-- common1.java
|               +-- common2.java
+-- desktop
|   +-- src
|       +-- com
|           +-- example
|               +-- platform.java
+-- android
|   +-- src
|       +-- com
|           +-- example
|               +-- platform.java

根据哪个平台,为桌面或android中的代码构建的代码包含在构建中。

但是我很难用SCons构建它

来自SCons构建脚本的

示例代码段

#target contains the platform we are building on
if target in ['windows', 'linux']:
    java_class_out = env.Java(target='classes', source=['desktop/src', 'common/src'])
    jar_out = env.Jar(target='myOutput.jar', source=java_class_out);

运行时,它将类似于以下内容:

javac -d classes -sourcepath common/src common/src/com/example/common1.java common/src/com/example/common2.java
javac -d classes -sourcepath desktop/src desktop/src/com/example/platform.java
desktop/src/com/example/platform.java:42: error: cannot find symbol

对于来自common1.javacommon2.java

的平台中的每个符号,都会重复找不到符号错误

我试图传入所有java文件的数组:
来自SCons构建脚本的更新片段。

#target contains the platform we are building on
if target in ['windows', 'linux']:
    java_files = ['desktop/src/com/example/platform.java',
                  'common/src/com/example/common1.java',
                  'common/src/com/example/common2.java']
    java_class_out = env.Java(target='classes', source=java_files)
    jar_out = env.Jar(target='myOutput.jar', source=java_class_out);

这导致输出类似于:

javac -d classes -sourcepath common/src/com/example common/src/com/example/common1.java
javac -d classes -sourcepath common/src/com/example common/src/com/example/common2.java
javac -d classes -sourcepath desktop/src desktop/src/com/example/platform.java
desktop/src/com/example/platform.java:42: error: cannot find symbol

我希望SCons做的是输出与此类似的东西:

javac -d classes -sourcepath common/src -sourcepath desktop/src common/src/com/example/common1.java common/src/com/example/common2.java desktop/src/com/example/platform.java

Scons-users邮件列表上有一个帖子询问了几乎这个确切的问题,但没有给出解决方案。

我可以通过谷歌找到完整的电子邮件链:

https://pairlist4.pair.net/pipermail/scons-users/2016-February/004609.html

任何人都知道如何让Scons做我需要的事情?不幸的是,我坚持使用SCons进行构建。

1 个答案:

答案 0 :(得分:1)

SCons 非常聪明,可以将您Java()方法调用的源文件夹添加为-sourcepath选项的默认参数。但如果你只是说

env.Java(target='classes', source=['desktop/src', 'common/src'])

这将在内部产生两个单独的调用,具有以下效果:

env.Java(target='classes', source=['desktop/src'])
env.Java(target='classes', source=['common/src'])

。这就是为什么你总是得到一条路,而不是另一条路。

相反,您必须使用提供的JAVASOURCEPATH变量(请搜索我们的User Guide,只有一次出现)来指定应搜索类的文件夹列表接口定义。

无论

env.Append(JAVASOURCEPATH=['desktop/src', 'common/src'])
env.Java(target='classes', source=['desktop/src', 'common/src'])

env.Java('classes', 'desktop/src', JAVASOURCEPATH=['common/src'])
env.Java('classes', 'common/src', JAVASOURCEPATH=['desktop/src'])

应该做的伎俩。请注意,为简洁起见,我如何省略最后一个代码段中的源/目标说明符,但显式命名参数也应该有用。