2011-11-13 10 views
11

Sto provando a fornire tutti i file * .cpp in una cartella al compilatore C++ tramite form. Ma non ho altro da fare che dare a gpp una stringa gigante contenente tutti i file. Ho cercato di dimostrare che utilizzando una piccola applicazione di prova:Come aggiungere tutti i file in un set di file come argomento per l'attività exec?

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

Con lo script ant in questo modo:

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

uscita del mio a.exe è questo:

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

Ora ecco la domanda: come faccio a fornire tutti i file nel set di file singolarmente come argomento per l'eseguibile?

risposta

12

Questo è ciò che il compito apply in ANT è stato progettato per supportare.

Ad esempio:

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

Il parallelo argomento corre il programma una volta sola utilizzando tutti i file come argomenti.

+0

ora _that_ è quello che stavo cercando! Grazie! – xtofl

5

Found it: la differenza sembra essere compresa tra arg value e arg line.

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

ha provocato l'uscita prevista:

[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

piccola confusione .. hai dimenticato di cambiare '' in '' nella tua risposta? –

+0

@PulakAgrawal: sì ... Troppo eccitato :) – xtofl

0

Avete guardato il ant cpptasks? Questo ti permetterebbe di integrare la compilazione C++ nella tua build Ant in modo più Ant-centric. Ad esempio, specificando i file da compilare usando un set di file.

Ecco l'esempio (compatibile con Ant 1.6 o versioni successive) ::

<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

Ho; o è in rigor mortis, o è morto. (cioè non sembra più essere mantenuto).Hai esperienza con esso? – xtofl

+0

Ho lavorato a un progetto principalmente Java in cui è stato utilizzato per creare il codice C utilizzando gcc per alcuni moduli. È ancora in uso lì. Si noti che è ant-contrib come un intero (piuttosto che cpptasks in particolare) che non ha visto una nuova release dal 2008. Se stavo rivedendo ant-contrib ora non averlo usato prima, credo che condividerei la vostra preoccupazione. Tuttavia, penso che ant-contrib sia ancora ampiamente usato. – sudocode

0

Sulla base di this article, ecco il codice completo che illustra l'uso del compito 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> 

Sopra codice presuppone non ci sono spazi nei percorsi.

Per sostenere gli spazi nei percorsi, il cambiamento sopra pathconvert linea:

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

e arg linea:

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

Fonte: Converting an Ant fileset to multiple apply args.

Problemi correlati