我正在使用ant构建混合的Java和C ++(JNI)代码,这些代码组成了一个客户端项目。我最近将构建的C ++部分切换为使用带有cpptasks的ant来构建C ++代码,而不是让ant调用构建代码所需的各种版本的Visual Studio。
为了使其工作,有必要使用ant的exec任务来生成一个shell,在该shell中执行shell脚本或批处理文件以设置编译器环境,然后再触发执行基于cpptasks的另一个ant C ++构建。从本质上讲,主ant构建文件中与C ++相关的构建任务对于Windows来说是这样的:
<target name="blah">
<exec executable="cmd" failonerror="true">
<arg value="/C"/>
<arg line=""${cpp.compiler.path}/vsvars32.bat" && %ANT_HOME%/bin/ant -f cpp-build.xml make-cpp-stuff" />
</exec>
</target>
没有办法摆脱vsvars32.bat调用,因为代码必须使用多个VS版本构建,并且在构建机器上,Visual Studio安装程序都不能构建构建用户的环境。
上面的工作,但我遇到的问题是我想将某些命令行选项(如-verbose,-quiet,-emacs)传递给子蚂蚁,如果它们已经传递给父蚂蚁蚂蚁。是否有可能在父蚂蚁的命令行选项中获得访问权限?请注意我不是在讨论通常的属性定义,而是讨论ant-internal选项。
答案 0 :(得分:2)
<target name="blah">
<property environment="env"/>
<exec executable="cmd" failonerror="true">
<arg value="/C"/>
<arg value="${cpp.compiler.path}/vsvars32.bat"/>
<arg value="&&"/>
<arg value="${env.ANT_HOME}/bin/ant.bat"/>
<arg value="-f" />
<arg value="cpp-build.xml" />
<arg value="make-cpp-stuff" />
</exec>
</target>
<强>加成强>
您可以创建将运行vsvars和ant的外部批处理文件,然后您将只创建一个进程。我相信&amp;&amp;没有像你期望的那样工作:
run-ant-vs.bat:
....\vsvars32.bat
%ANT_HOME\bin\ant.bat -f cpp-build.xml make-cpp-stuff
答案 1 :(得分:1)
我不确定这是否可以帮到你。使用您在执行ant build时传递的参数执行Java客户端,您可以尝试调整此示例(exec比java任务更通用,但是是类似的概念)
Ant任务示例:
<target name="run">
<java classname="my.package.Client" fork="true" failonerror="true">
<arg line="-file ${specific.file}"/>
</java>
</target>
调用示例:
ant run -Dspecific.file=/tmp/foo.txt