2013-05-08 31 views
6

Tôi cần phải thêm các cờ khác nhau vào các dòng biên dịch C và C++ trong các tệp CMake của tôi (CMake 2.8.10.2). Tôi thấy một số người sử dụng add_definitions nhưng từ những gì tôi có thể thấy được dành cho cờ tiền xử lý (-D). Tôi có một số lá cờ mà tôi không muốn truyền cho bộ tiền xử lý.danh sách cmake chắp thêm cho cờ biên dịch mang lại kết quả không có thật?

Vì vậy, tôi đã cố sửa đổi CMAKE_C_FLAGSCMAKE_CXX_FLAGS. Tôi thấy rằng một số người đã sử dụng một cái gì đó như:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here") 

nhưng sau đó tôi đọc trong các tài liệu cmake rằng đây là kém hiệu quả, và đúng cách để làm điều đó là sử dụng list(APPEND ...), như thế này:

list(APPEND CMAKE_C_FLAGS -new -flags -here) 

Tuy nhiên, khi tôi thực hiện điều này, dòng biên dịch của tôi chứa các cờ được phân tách bằng dấu chấm phẩy và là lỗi cú pháp. Tôi đọc rằng đây là danh sách bây giờ được lưu trữ nội bộ, nhưng tôi figured điều này sẽ được chăm sóc bởi cmake khi tôi sử dụng biến. Điều này có vẻ rất cơ bản; Tôi có làm điều gì sai? Ý tôi là, những danh sách này là gì nếu chúng không thể được sử dụng trừ khi bạn muốn có một danh sách giá trị được phân tách bằng dấu chấm phẩy (và ai muốn điều đó, ngoài việc tôi đoán cài đặt Windows% PATH% hay gì đó)? Tôi có nên sử dụng phiên bản được trích dẫn ngay cả khi các tài liệu cho thấy nó kém hiệu quả/phù hợp không?

+1

tôi sử dụng một macro cho set() phương pháp mặc dù là nó rất dễ dàng để có được một không phù hợp trong tên var khi sao chép mọi thứ vv: vĩ mô (nối thêm tên mục) \t bộ ($ { name} "$ {$ {name}} $ {item}") endmacro() – Trass3r

Trả lời

6

Trong trường hợp này, bạn thực sự thường sử dụng kỹ thuật set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here"). Bạn có quyền trong đó trong hầu hết các ngữ cảnh khác, CMake có thể "dịch" một danh sách được phân tách bằng dấu chấm phẩy thành một cái gì đó có ý nghĩa cho trình biên dịch (ví dụ danh sách các tệp nguồn trong tệp thực thi), nhưng trong trường hợp này, CMake các cờ như một chuỗi đơn, hoàn chỉnh để chuyển tới trình biên dịch/trình liên kết. Bạn có thể nếu bạn thực sự muốn giữ danh sách cờ như một danh sách CMake, nhưng sau đó trước khi thoát CMakeLists.txt, bạn có thể tự mình "dịch" danh sách thành một giá trị chuỗi đơn là CMAKE_C_FLAGS, nhưng nó không bình thường để xem điều này.

+1

Một thành ngữ ngắn gọn hơn là 'string (APPEND CMAKE_C_FLAGS" -new-flags "). – Chadversary

1

Trong CMake, "danh sách" là một chuỗi các mục được phân cách bằng dấu chấm phẩy. Ví dụ:

set(FOO "a") 
list(APPEND FOO "b") # now FOO="a;b" 
list(APPEND FOO "c") # now FOO="a;b;c" 

Trong CMake, một chuỗi các gian mục -seperated chỉ là một chuỗi, không phải là một danh sách. Sử dụng lệnh string(APPEND) để thêm vào. Ví dụ:

set(FOO "a") 
string(APPEND FOO " b") # now FOO="a b" 
string(APPEND FOO " c") # now FOO="a b c" 

Mở phiên bản cũ của CMake thiếu lệnh string(APPEND), bạn nên dự phòng để lệnh set. Ví dụ:

set(FOO "a") 
set(FOO "${FOO} b") 
set(FOO "${FOO} c") 
Các vấn đề liên quan