2

我正在使用 ant 来构建 Java 和 C++ (JNI) 代码的混合体,这些代码在这里构成了一个客户端项目。我最近将构建的 C++ 部分切换为使用带有 cpptasks 的 ant 来构建 C++ 代码,而不是让 ant 调用构建代码所需的各种版本的 Visual Studio。

为了让它工作,有必要使用 ant 的 exec 任务生成一个 shell,在其中执行 shell 脚本或批处理文件以设置编译器环境,然后触发另一个执行基于 cpptasks 的 C++ 构建的 ant。本质上,在 Windows 的主 ant 构建文件中与 C++ 相关的构建任务如下所示:

<target name="blah">
    <exec executable="cmd" failonerror="true">
      <arg value="/C"/>
      <arg line="&quot;${cpp.compiler.path}/vsvars32.bat&quot; &amp;&amp; %ANT_HOME%/bin/ant -f cpp-build.xml make-cpp-stuff" />
    </exec>
</target>

没有办法摆脱 vsvars32.bat 调用,因为代码必须使用多个 VS 版本以及在 Visual Studio 设置都不能成为构建用户环境的一部分的构建机器上构建。

以上工作,但我遇到的问题是,如果某些命令行选项(如-verbose、-quiet、-emacs)已传递给父蚂蚁,我想将它们传递给子蚂蚁。是否可以通过提供给父蚂蚁的命令行选项进行访问?请注意,我不是在谈论通常的属性定义,而是在谈论 ant-internal 选项。

4

2 回答 2

2
<target name="blah">
    <property environment="env"/>
    <exec executable="cmd" failonerror="true">
      <arg value="/C"/>
      <arg value="${cpp.compiler.path}/vsvars32.bat"/>
      <arg value="&amp;&amp;"/>
      <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,然后您将只需要创建一个进程。我相信 && 没有像你期望的那样工作:

run-ant-vs.bat:

....\vsvars32.bat
%ANT_HOME\bin\ant.bat -f cpp-build.xml make-cpp-stuff
于 2009-09-21T12:30:03.773 回答
1

我不确定这是否可以帮助你。Java客户端执行是否使用你执行ant build时传递的参数,你可以尝试改编这个例子(exec比java task更通用,但是是一个类似的概念)

蚂蚁任务示例:

<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
于 2009-09-21T15:51:32.133 回答