2011-10-16 44 views
26

Tôi có hai câu hỏi liên quan đến CMakeCMake: Cách lấy tên của tất cả các thư mục con của một thư mục?

1) Giả sử rằng chúng ta có một biến ${MY_CURRENT_DIR} có chứa đường dẫn của một thư mục chứa nhiều thư mục con: mydir1, mydir2 và mydir3. Tôi muốn phát hiện các thư mục con này và đặt tên của chúng vào ${SUBDIRS} (không phải đường dẫn đầy đủ của các thư mục này, chỉ có tên của chúng). Làm thế nào để làm điều đó tự động?

2) Giả sử rằng ${SUBDIRS} chứa "mydir1 mydir2 mydir3". Cách thay thế

ADD_SUBDIRECTORY(mydir1) 
ADD_SUBDIRECTORY(mydir2) 
ADD_SUBDIRECTORY(mydir3) 

bằng vòng lặp trên ${SUBDIRS}?

Cảm ơn bạn rất nhiều.

Trả lời

70

1) Sử dụng macro này:

MACRO(SUBDIRLIST result curdir) 
    FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) 
    SET(dirlist "") 
    FOREACH(child ${children}) 
    IF(IS_DIRECTORY ${curdir}/${child}) 
     LIST(APPEND dirlist ${child}) 
    ENDIF() 
    ENDFOREACH() 
    SET(${result} ${dirlist}) 
ENDMACRO() 

Ví dụ:

SUBDIRLIST(SUBDIRS ${MY_CURRENT_DIR}) 

2) Sử dụng foreach:

FOREACH(subdir ${SUBDIRS}) 
    ADD_SUBDIRECTORY(${subdir}) 
ENDFOREACH() 
+13

để cải thiện hiệu suất, đặc biệt là nếu 'dirlist' dài, sử dụng 'LIST (APPEND dirlist $ {child})' thay vì 'SET (dirlist $ {dirlist} $ {child})' [xem tại đây] (http://www.cmake.org/Wiki/C Make_Performance_Tips # Use_LIST.28APPEND _.... 29) – ParokshaX

+2

Lưu ý quan trọng: điều này sẽ không hoạt động với 'GLOB_RECURSE', chỉ với' GLOB' – Synxis

+1

GLOB_RECURSE có LIST_DIRECTORIES mặc định sai trong khi GLOB có LIST_DIRECTORIES mặc định là true. Nếu bạn sử dụng recurse, bạn sẽ phải đặt nó thành true – Jaco

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