#ant #fileset
#ant #набор файлов
Вопрос:
Я пытаюсь предоставить все файлы *.cpp в папке компилятору c через ant. Но я не получаю ничего, кроме того, что ant выдает gpp гигантскую строку, содержащую все файлы. Я попытался доказать это с помощью небольшого тестового приложения:
int main( int argc, char**args ){
for( --argc; argc != 0; --argc ) printf("arg[%d]: %sn",argc,args[argc]);
}
С помощью ant-скрипта, подобного этому:
<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:
Это то, для поддержки чего была разработана задача применить в ANT.
Например:
<target name="cmdline">
<apply executable="a.exe" parallel="true">
<srcfile/>
<fileset dir="." includes="*.cpp"/>
</apply>
</target>
Аргумент parallel запускает программу один раз, используя все файлы в качестве аргументов.
Ответ №2:
Нашел это: разница, похоже, заключается в arg value
vs. arg line
.
<arg line="${converted}"/>
результат ожидаемый:
[exec] arg[5]: C:cygwinhomextofl_2antesbuild.xml
[exec] arg[4]: C:cygwinhomextofl_2antesa.exe
[exec] arg[3]: C:cygwinhomextofl_2antesa.cpp
[exec] arg[2]: C:cygwinhomextofl_2antes.build.xml.swp
[exec] arg[1]: C:cygwinhomextofl_2antes.a.cpp.swp
Комментарии:
1. небольшая путаница.. вы забыли изменить
<arg value>
на<arg line>
в своем собственном ответе ?2. @PulakAgrawal: да… Слишком взволнован 🙂
Ответ №3:
Основываясь на этой статье, вот полный код, иллюстрирующий использование 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 в несколько аргументов apply.
Ответ №4:
Вы смотрели на 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>
Комментарии:
1. У меня есть; либо он в трупном окоченении, либо он мертв. (т. Е., похоже, он больше не поддерживается). У вас есть опыт работы с этим?
2. Я работал над проектом, основанным в основном на Java, где он использовался для сборки кода C с использованием gcc для нескольких модулей. Он все еще используется там. Обратите внимание, что это ant-contrib в целом (а не cpptasks в частности), который не видел нового выпуска с 2008 года. Если бы я сейчас просматривал ant-contrib, не используя его раньше, я думаю, я бы разделил ваше беспокойство. Тем не менее, я думаю, что ant-contrib все еще широко используется.