Как добавить все файлы в набор файлов в качестве аргумента в задачу exec?
Я пытаюсь предоставить все *.cpp файлы в папке компилятору С++ через ant. Но я получаю не более ant, предоставляя gpp гигантскую строку, содержащую все файлы. Я попытался доказать это, используя небольшое тестовое приложение:
int main( int argc, char**args ){
for( --argc; argc != 0; --argc ) printf("arg[%d]: %s\n",argc,args[argc]);
}
С ant script следующим образом:
<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
Теперь вот вопрос: как я могу предоставить все файлы в наборе файлов отдельно в качестве аргумента для исполняемого файла?
Ответы
Ответ 1
Это то, что было создано apply в ANT.
Например:
<target name="cmdline">
<apply executable="a.exe" parallel="true">
<srcfile/>
<fileset dir="." includes="*.cpp"/>
</apply>
</target>
Параллельный аргумент запускает программу один раз, используя все файлы в качестве аргументов.
Ответ 2
Найдено его: разница, по-видимому, лежит в arg value
vs. 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
Ответ 3
Вы просмотрели ant cpptasks
? Это позволит вам интегрировать компиляцию С++ в вашу конструкцию 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>
Ответ 4
Основываясь на этой статье, вот полный код, иллюстрирующий использование 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 в несколько применяемых аргументов.