我有一个项目,它有一些特定于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.java
或common2.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进行构建。
答案 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'])
应该做的伎俩。请注意,为简洁起见,我如何省略最后一个代码段中的源/目标说明符,但显式命名参数也应该有用。