我正在尝试通过ant将文件夹中的所有* .cpp文件提供给c ++编译器。但我得到的只是蚂蚁给gpp一个巨大的字符串包含所有文件。我试图通过使用一个小的测试应用程序来证明它:
int main( int argc, char**args ){
for( --argc; argc != 0; --argc ) printf("arg[%d]: %s\n",argc,args[argc]);
}
使用这样的ant脚本:
<target name="cmdline">
<fileset id="fileset" dir=".">
<include name="*"/>
</fileset>
<pathconvert refid="fileset" property="converted"/>
<exec executable="a.exe">
<arg value="${converted}"/>
</exec>
</target>
我的a.exe输出是这样的:
[exec] arg [1]:。a.cpp.swp .build.xml.swp a.cpp a.exe build.xml
现在问题是:如何将文件集中的所有文件作为可执行文件的参数单独提供?
答案 0 :(得分:14)
这是ANT中apply任务旨在支持的任务。
例如:
<target name="cmdline">
<apply executable="a.exe" parallel="true">
<srcfile/>
<fileset dir="." includes="*.cpp"/>
</apply>
</target>
parallel 参数使用所有文件作为参数运行程序一次。
答案 1 :(得分:5)
Found it:差异似乎在于arg value
与arg line
。
<arg line="${converted}"/>
产生了预期的输出:
[exec] arg[5]: C:\cygwin\home\xtofl_2\antes\build.xml
[exec] arg[4]: C:\cygwin\home\xtofl_2\antes\a.exe
[exec] arg[3]: C:\cygwin\home\xtofl_2\antes\a.cpp
[exec] arg[2]: C:\cygwin\home\xtofl_2\antes\.build.xml.swp
[exec] arg[1]: C:\cygwin\home\xtofl_2\antes\.a.cpp.swp
答案 2 :(得分:0)
你看过ant cpptasks
了吗?这将允许您以更加以Ant为中心的方式将C ++编译集成到Ant构建中。例如,指定要使用文件集编译的文件。
以下是示例(与Ant 1.6或更高版本兼容)::
<project name="hello" default="compile" xmlns:cpptasks="antlib:net.sf.antcontrib.cpptasks">
<target name="compile">
<mkdir dir="target/main/obj"/>
<cpptasks:cc outtype="executable" subsystem="console" outfile="target/hello" objdir="target/main/obj">
<fileset dir="src/main/c" includes="*.c"/>
</cpptasks:cc>
</target>
</project>
答案 3 :(得分:0)
基于this article,以下是说明使用pathconvert
任务的完整代码:
<target name="atask">
<fileset dir="dir" id="myTxts">
<include name="*.txt" />
</fileset>
<pathconvert property="cmdTxts" refid="myTxts" pathsep=" " />
<apply executable="${cmd}" parallel="false" verbose="true">
<arg value="-in" />
<srcfile />
<arg line="${cmdTxts}" />
<fileset dir="${list.dir}" includes="*.list" />
</apply>
</target>
上面的代码假设路径中没有空格。
要支持路径中的空格,请将pathconvert
行更改为:
<pathconvert property="cmdTxts" refid="myTxts" pathsep="' '" />
和arg
行到:
<arg line="'${cmdTxts}'"/>