如何将文件集中的所有文件作为参数添加到 exec 任务?

发布于 2024-12-15 13:16:28 字数 839 浏览 2 评论 0原文

我试图通过 ant 将文件夹中的所有 *.cpp 文件提供给 C++ 编译器。但我得到的只是 ant 给 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

现在的问题是:如何单独提供文件集中的所有文件作为可执行文件的参数?

I'm trying to provide all *.cpp files in a folder to the c++ compiler through ant. But I get no further than ant giving gpp a giant string containing all the files. I tried to prove it by using a small test application:

int main( int argc, char**args ){
   for( --argc; argc != 0; --argc ) printf("arg[%d]: %s\n",argc,args[argc]);
}

With the ant script like this:

    <target name="cmdline">
            <fileset id="fileset" dir=".">
                    <include name="*"/>
            </fileset>
            <pathconvert refid="fileset" property="converted"/>
            <exec executable="a.exe">
                    <arg value="${converted}"/>
            </exec>
    </target>

My a.exe's output is this:

[exec] arg[1]: .a.cpp.swp .build.xml.swp a.cpp a.exe build.xml

Now here's the question: how do I provide all files in the fileset individually as an argument to the executable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

冰葑 2024-12-22 13:16:28

这就是 ANT 中的 apply 任务旨在支持的内容。

例如:

  <target name="cmdline">
        <apply executable="a.exe" parallel="true">
            <srcfile/>               
            <fileset dir="." includes="*.cpp"/>
        </apply>
  </target>

并行参数使用所有文件作为参数运行一次程序。

This is what the apply task in ANT was designed to support.

For example:

  <target name="cmdline">
        <apply executable="a.exe" parallel="true">
            <srcfile/>               
            <fileset dir="." includes="*.cpp"/>
        </apply>
  </target>

The parallel argument runs the program once using all the files as arguments.

思慕 2024-12-22 13:16:28

找到了:差异似乎在于arg值arg 行

<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

Found it: the difference seems to lie in arg value vs. arg line.

<arg line="${converted}"/>

resulted in the expected output:

 [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
诺曦 2024-12-22 13:16:28

基于这篇文章,这里是说明如何使用 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}'"/>

来源:将 Ant 文件集转换为多个应用参数

Based on this article, here is the complete code illustrating the use of the pathconvert task:

<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>

Above code assumes there are no spaces in the paths.

To support spaces in paths, change above pathconvert line to:

<pathconvert property="cmdTxts" refid="myTxts" pathsep="' '" />

and arg line to:

<arg line="'${cmdTxts}'"/>

Source: Converting an Ant fileset to multiple apply args.

萌辣 2024-12-22 13:16:28

您看过 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>

Have you looked at the ant cpptasks? This would allow you to integrate C++ compilation into your Ant build in a more Ant-centric fashion. For example, specifying files to be compiled using a fileset.

Here is the example (compatible with Ant 1.6 or later)::

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文