2013-03-22 45 views
5

Vì vậy, tôi có danh sách các file (hoặc giá trị) như thế nàyCMake regex trận đấu trong danh sách

set(HEADER_FILES DirA/header1.h DirA/header2.hpp 
       DirB/header3.h DirB/stuff.hpp) 

Sau đó, làm thế nào để tôi nhận được danh sách phụ các tập tin chỉ trong dira? Tôi đang sử dụng CMake 2.8.x và tôi mệt mỏi trận đấu regex:

string(REGEX MATCHALL "DirA/(.+)" DirA_FILES ${HEADER_FILES}) 

Nhưng kết quả chỉ là sao chép của chuỗi ban đầu như: "dira/header1.h dira/header2.hpp DirB/header3.h DirB/stuff.hpp "hoặc không có gì.

Vâng một lần nữa như mọi khi, khi viết câu hỏi này tôi giải quyết nó:

set(SubListMatch) 
foreach(ITR ${HEADER_FILES}) 
    if(ITR MATCHES "(.*)DirA/(.*)") 
     list(APPEND SubListMatch ${ITR}) 
    endif() 
endforeach() 

Nhưng CMake là điều khá mới mẻ với tôi vậy làm thế nào để tôi quấn mã vào chức năng? Tôi chưa bao giờ viết bất kỳ chức năng CMake cho đến nay.

Trả lời

4

Bạn có thể biến nó thành một chức năng như thế này:

# Define function 
function(GetSubList resultVar) 
    set(result) 
    foreach(ITR ${ARGN}) # ARGN holds all arguments to function after last named one 
    if(ITR MATCHES "(.*)DirA/(.*)") 
     list(APPEND result ${ITR}) 
    endif() 
    endforeach() 
    set(${resultVar} ${result} PARENT_SCOPE) 
endfunction() 

# Call it 
GetSubList(SubListMatch ${HEADER_FILES}) 

Khi mã này chạy, SubListMatch sẽ tổ chức các yếu tố phù hợp.

Bạn có thể cải thiện chức năng bằng ví dụ: cung cấp cho nó thông số bổ sung cho tên thư mục để những người khác có thể xuất hiện trên DirA cho:

function(GetSubList resultVar dirName) 
    # as before, except the if() 
    if(ITR MATCHES "(.*)${dirName}/(.*)") 
    # same as before 
endfunction() 
Các vấn đề liên quan