2011-11-13 6 views
11

Estoy tratando de proporcionar todos los archivos * .cpp en una carpeta al compilador de C++ a través de hormiga. Pero no hago más que darle a gpp una cadena gigante que contiene todos los archivos. Traté de demostrarlo mediante el uso de una pequeña aplicación de prueba:¿Cómo agregar todos los archivos en un conjunto de archivos como un argumento para la tarea ejecutiva?

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

Con el guión de hormigas como esto:

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

salida de mi a.exe es la siguiente:

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

Ahora esta es la pregunta: cómo ¿Proporciono todos los archivos en el conjunto de archivos de forma individual como un argumento para el ejecutable?

Respuesta

12

Esto es lo que la tarea de apply ANT fue diseñado para soportar.

Por ejemplo:

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

El paralelo argumento es el programa una vez usando todos los archivos como argumentos.

+0

ahora _eso_ es lo que estaba buscando! ¡Gracias! – xtofl

5

Found it: la diferencia parece estar en arg value frente a arg line.

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

dio lugar a la salida esperada:

[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 
+0

small confusion ... ¿Olvidaste cambiar '' por '' en tu propia respuesta? –

+0

@PulakAgrawal: sí ... Demasiado emocionado :) – xtofl

0

¿Ha mirado el ant cpptasks? Esto le permitiría integrar la compilación de C++ en su compilación Ant de una forma más centrada en Ant. Por ejemplo, especificar los archivos que se compilarán utilizando un conjunto de archivos.

Aquí está el ejemplo (compatible con Ant 1.6 o posterior) ::

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

Tengo; o está en rigor mortis, o está muerto. (es decir, parece que ya no se mantiene).¿Tienes experiencia con eso? – xtofl

+0

Trabajé en un proyecto principalmente Java donde se usó para construir código C usando gcc para algunos módulos. Todavía está en uso allí. Tenga en cuenta que es ant-contrib en su conjunto (en lugar de cpptasks en particular) que no ha visto un nuevo lanzamiento desde 2008. Si estaba revisando ant-contrib ahora que no lo había usado antes, supongo que compartiría su preocupación. Sin embargo, creo que ant-contrib todavía se usa ampliamente. – sudocode

0

Basado en this article, aquí está el código completo que ilustra el uso de la tarea 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> 

Por encima de código asume que no hay espacios en las rutas.

Para apoyar espacios en los caminos, el cambio por encima de la línea de pathconvert:

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

y arg línea a:

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

Fuente: Converting an Ant fileset to multiple apply args.

Cuestiones relacionadas