Как добавить все файлы в набор файлов в качестве аргумента для задачи exec?

Я пытаюсь предоставить все файлы *.cpp в папке компилятору С++ через ant. Но дальше ant я не продвинулся, отдав gpp гигантскую строку, содержащую все файлы. Я попытался доказать это с помощью небольшого тестового приложения:

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

С таким муравьиным скриптом:

    <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] аргумент [1]: .a.cpp.swp .build.xml.swp a.cpp a.exe build.xml

Теперь вот вопрос: как мне предоставить все файлы в наборе файлов по отдельности в качестве аргумента для исполняемого файла?


person xtofl    schedule 13.11.2011    source источник


Ответы (4)


Именно для этого была разработана задача apply в ANT.

Например:

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

Аргумент parallel запускает программу один раз, используя все файлы в качестве аргументов.

person Mark O'Connor    schedule 15.11.2011

Нашел: похоже, разница заключается в 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
person xtofl    schedule 13.11.2011
comment
небольшая путаница .. вы забыли изменить <arg value> на <arg line> в своем собственном ответе? - person Pulak Agrawal; 14.11.2011
comment
@PulakAgrawal: да... Слишком взволнован :) - person xtofl; 14.11.2011

Основываясь на этой статье, вот полный код, иллюстрирующий использование задачи 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 в несколько аргументов применения.

person kenorb    schedule 23.01.2018

Вы смотрели ant cpptasks? Это позволит вам интегрировать компиляцию C++ в вашу сборку Ant более ориентированным на 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>
person sudocode    schedule 14.11.2011
comment
У меня есть; либо трупное окоченение, либо он мертв. (т. е. похоже, что он больше не поддерживается). У вас есть опыт? - person xtofl; 14.11.2011
comment
Я работал над проектом в основном на Java, где он использовался для сборки кода C с использованием gcc для нескольких модулей. Там он используется до сих пор. Обратите внимание, что это ant-contrib в целом (а не cpptasks в частности), который не видел новых выпусков с 2008 года. Если бы я просматривал ant-contrib сейчас, не используя его раньше, я думаю, что разделил бы ваше беспокойство. Тем не менее, я думаю, что ant-contrib все еще широко используется. - person sudocode; 14.11.2011