2012-10-29 35 views
7

Tôi có thư mục chứa các tệp thuộc về tập hợp tạo thành dự án Qt và các tệp khác không có. Nghĩa là, các tệp A.cxx, ADriver.cxx và A.ui đều thuộc về một tập hợp cần được biên dịch với các tùy chọn Qt. Sau đó tôi có một tệp B.cxx không phải là qt. Sau đó, C.cxx, CDriver, và C.ui là một bộ Qt khác. Có hàng chục trong số này, vì vậy tôi muốn sử dụng globs thay vì viết mỗi add_executable bằng tay. Tôi đã nghĩ đến việc làm một cái gì đó giống nhưXóa tệp khỏi tập hợp

for(all ui files) 
    create an executable from the ui and its matching .cxx and *Driver.cxx" 
end 

Sau đó, tất cả các file cxx rằng "vẫn còn" (không được sử dụng trong vòng lặp ở trên) đều là phòng không Qt, và cần phải được biên soạn bởi bản thân họ. Câu hỏi của tôi là làm thế nào để "trừ" các tập tin từ một "bộ". Tức là, để sử dụng phương pháp được mô tả ở trên, tôi phải có một tập hợp tất cả các tệp cxx và loại bỏ các tệp được sử dụng trong vòng lặp tệp .ui. Điều này có thể không? Có cách nào tốt hơn để làm một cái gì đó như thế này?

Trả lời

8

Thứ nhất, thu thập tất cả các file với một glob:

file(GLOB ALL_SRCS *) 

Sau đó chọn file ui và tạo mục tiêu Qt cho họ, trừ đi chúng ra khỏi danh sách ALL_SRCS cùng một lúc:

file(GLOB UIS *.ui) 

foreach(ui ${UIS}) 
get_filename_component(f ${ui} NAME_WE) 

# Do Qt stuff 
qt4_wrap_ui(${f}uis ${ui}) 
qt4_wrap_cpp(${f}srcs ${f}.cpp ${f}Driver.cpp) 
add_executable(${f} ${f}uis ${f}srcs) 

list(REMOVE_ITEM ALL_SRCS ${ui} ${f}.cpp ${f}Driver.cpp) 
endforeach() 

Sau điều này bạn sẽ có tất cả các nguồn không phải qt trong ALL_SRCS.

+0

@arrowdodget Ah, tôi nghĩ REMOVE_ITEM chính xác là những gì tôi đang tìm kiếm. Khi tôi thử nó, tôi sẽ chấp nhận câu trả lời - cảm ơn! –

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