2011-11-13 6 views
11

Próbuję dostarczyć wszystkie pliki * .cpp w folderze do kompilatora C++ za pośrednictwem ant. Ale nie dostaję nic poza dostarczeniem gpp gigantycznej struny zawierającej wszystkie pliki z. Starałem się udowodnić za pomocą małej aplikację testową:Jak dodać wszystkie pliki w zestawie plików jako argument do zadania exec?

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

Z Mrówka skryptu jak ten:

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

wyjście mojego a.exe jest to:

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

Oto pytanie: jak przekazać wszystkie pliki w zestawie plików indywidualnie jako argument do pliku wykonywalnego?

Odpowiedz

12

To właśnie zadanie w ANT apply został zaprojektowany, aby wspierać.

Na przykład:

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

równolegle argumentem uruchamia program raz używając wszystkich plików jako argumenty.

+0

teraz _ to jest to, czego szukałem! Dzięki! – xtofl

5

Found it: różnica wydaje się leżeć w arg value w stosunku do arg line.

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

spowodowały oczekiwanego wyjścia:

[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

małe zamieszanie .. czy zapomniałeś zmienić '' na '' w swojej własnej odpowiedzi? –

+0

@PulakAgrawal: tak ... Zbyt podekscytowany :) – xtofl

0

Pan spojrzał na ant cpptasks? Umożliwiłoby to zintegrowanie kompilacji C++ z kompilacją Ant w bardziej anty-centryczny sposób. Na przykład, określając pliki do kompilacji przy użyciu zestawu plików.

Oto przykład (kompatybilny z Ant 1.6 lub nowszej) ::

<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

Mam; albo w rygor mortis, albo jest martwy. (tzn. nie wydaje się już być utrzymywany).Czy masz z tym doświadczenie? – xtofl

+0

Pracowałem nad projektem głównie Java, w którym został użyty do zbudowania kodu C za pomocą gcc dla kilku modułów. Jest nadal w użyciu. Zauważ, że jest to antis contrib jako całość (a nie na przykład cpptasks), która nie widziała nowego wydania od 2008 roku. Gdybym przeglądał ant-contrib teraz, nie używając go wcześniej, myślę, że podzieliłbym twoją troskę. Jednak myślę, że ant-contrib jest nadal szeroko stosowany. – sudocode

0

podstawie this article tu jest kompletny kod ilustrujący wykorzystanie zadania 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> 

Powyższy kod zakłada nie ma spacji w ścieżkach.

Wspieranie spacji w ścieżkach, zmiany powyżej pathconvert linii do:

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

i arg linia do:

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

Źródło: Converting an Ant fileset to multiple apply args.

Powiązane problemy