2011-11-13 27 views
11

Tôi đang cố gắng cung cấp tất cả các tệp * .cpp trong một thư mục tới trình biên dịch C++ thông qua kiến. Nhưng tôi nhận được không xa hơn kiến ​​cho gpp một chuỗi khổng lồ chứa tất cả các tập tin. Tôi cố gắng để chứng minh điều đó bằng cách sử dụng một ứng dụng thử nghiệm nhỏ:Làm thế nào để thêm tất cả các tập tin trong một tập tin như một đối số cho nhiệm vụ exec?

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

Với kịch bản kiến ​​như thế này:

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

đầu ra a.exe của tôi là thế này:

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

Bây giờ, đây là câu hỏi: làm thế nào thế nào để tôi cung cấp tất cả các tập tin trong fileset riêng lẻ như là một đối số để thực thi?

Trả lời

12

Đây là những gì nhiệm vụ apply trong ANT được thiết kế để hỗ trợ.

Ví dụ:

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

Các song song luận chạy chương trình khi sử dụng tất cả các tập tin như các đối số.

+0

bây giờ là thứ tôi đang tìm kiếm! Cảm ơn! – xtofl

5

Found it: sự khác biệt dường như nằm trong arg value so với arg line.

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

dẫn đến sản lượng dự kiến:

[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

nhầm lẫn nhỏ .. bạn có quên thay đổi ' 'thành' 'trong câu trả lời của riêng bạn không? –

+0

@PulakAgrawal: yes ... Quá vui mừng :) – xtofl

0

Bạn đã nhìn ant cpptasks? Điều này sẽ cho phép bạn tích hợp trình biên dịch C++ vào bản dựng Ant của bạn theo kiểu Ant-centric hơn. Ví dụ, chỉ định các tập tin được biên dịch bằng cách sử dụng một tập tin.

Dưới đây là ví dụ (tương thích với Ant 1.6 hoặc mới hơn) ::

<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

Tôi có; hoặc là nó nghiêm trọng, hoặc nó đã chết. (nghĩa là nó dường như không còn được duy trì nữa).Bạn có kinh nghiệm với nó? – xtofl

+0

Tôi đã làm việc trên một dự án chủ yếu-Java, nơi nó được sử dụng để xây dựng mã C bằng cách sử dụng gcc cho một vài mô-đun. Nó vẫn được sử dụng ở đó. Lưu ý rằng nó là một cái nhìn tổng thể (chứ không phải là cpptasks nói riêng) mà chưa từng thấy một bản phát hành mới kể từ năm 2008. Nếu tôi đang xem xét ant-contrib bây giờ đã không sử dụng nó trước đây, tôi đoán tôi sẽ chia sẻ mối quan tâm của bạn. Tuy nhiên, tôi nghĩ rằng ant-contrib vẫn được sử dụng rộng rãi. – sudocode

0

Dựa trên this article, đây là mã hoàn chỉnh minh họa việc sử dụng các nhiệm vụ 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> 

Trên đang giả định không có dấu cách trong các đường dẫn.

Để hỗ trợ khoảng trống trong đường dẫn, thay đổi trên pathconvert dòng:

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

arg dòng:

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

Nguồn: Converting an Ant fileset to multiple apply args.

Các vấn đề liên quan