2012-04-05 32 views
7

Tôi đang viết một CMakeLists.txt để tạo tệp và biên dịch các tệp được tạo. Tôi tạo một hàm để thêm một số chuỗi đường dẫn tệp vào biến danh sách chung.Làm thế nào để thiết lập biến toàn cầu trong một hàm cho cmake?

My CMakeLists.txt:

set(source_list "nothing") 
function(test file_path) 
    list(APPEND source_list ${file_path}) 
endfunction(test) 
test(abc.txt) 
test(def.txt) 
message("At last, the source_list is:\"${source_list}\"") 

Sản lượng cmake:

At last, the source_list is:"nothing" 

Có người đề nghị rằng để sử dụng vĩ mô thay vì chức năng, nhưng tôi cần phải sử dụng biến cục bộ, vì vậy tôi cần phải sử dụng hàm thay vì macro.

Làm cách nào tôi có thể đặt đúng biến global_list trong hàm test()? Không thể làm điều đó một cách đơn giản và bình thường?

Trả lời

11

Bạn cần sử dụng set thay vì list để ảnh hưởng đến biến trong phạm vi gốc.

Vì vậy, thay thế lệnh list của bạn với:

set(source_list ${source_list} ${file_path} PARENT_SCOPE) 
+0

Nó không phải là toàn cầu mặc dù, anh chị em sẽ không nhìn thấy. – 0xbaadf00d

12

PARENT_SCOPE chỉ dành cho phụ huynh, nó sẽ không hoạt động nếu bạn có chữ viết không phải là cha mẹ rằng muốn nhìn thấy nó là tốt.

Bạn cần bộ nhớ cache cho biến "giống toàn cầu" thực sự. Trong trường hợp của bạn, hãy sử dụng:

SET(source_list "${source_list}" CACHE INTERNAL "source_list") 
+1

Nó không hoạt động cho lần chạy thứ hai của cmake, bởi vì giá trị đã có trong bộ nhớ cache. Bạn phải làm sạch trước khi xây dựng. –

+1

'INTERNAL' ngụ ý' FORCE', có nghĩa là: Sử dụng tùy chọn '' FORCE'' để ghi đè các mục nhập hiện có. –

1

Cách tiếp cận khác là sử dụng các thuộc tính toàn cầu. Khi bạn cài đặt nó:

set_property(GLOBAL PROPERTY source_list_property "${source_list}") 

bạn có thể đọc nó từ khắp mọi nơi:

get_property(source_list GLOBAL PROPERTY source_list_property) 

tôi đã sử dụng trong ví dụ trên các tên khác nhau cho tài sản (source_list_property) và cho biến (source_list). Có lẽ tốt hơn nên sử dụng cùng tên. Nhưng vấn đề là sử dụng một thuộc tính làm biến toàn cầu, chứ không phải về việc đặt tên.

Thuộc tính toàn cầu như vậy không có trong bộ nhớ cache.

0

xây dựng trên câu trả lời Maxim Suslov của, đoạn code sau làm việc cho một vấn đề tương tự tôi phải đối mặt:

set_property(GLOBAL PROPERTY source_list) 
function(add_source) 
    get_property(tmp GLOBAL PROPERTY source_list) 
    foreach(arg ${ARGV}) 
     set(tmp "${tmp} ${arg}") 
    endforeach() 
    set_property(GLOBAL PROPERTY source_list "${tmp}") 
endfunction(add_source) 

add_source(a_file) 
add_source(b_file c_file) 

get_property(local_prop GLOBAL PROPERTY source_list) 
message("list: ${local_prop}") 

Chức năng add_source thể được gọi từ bên trong bất kỳ thư mục con.

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