2012-11-27 41 views
7

sự khác biệt, trong cmake, giữa một cái gì đó giống như là gì:

set(any_new_var ${old_var}) 

set(any_new_var "${old_var}") 

Bất kỳ sự khác biệt quan trọng? Khi nào tôi có thể sử dụng một hoặc một hình thức khác?

Ví dụ, tôi cố gắng với các thử nghiệm nhỏ sau

# test.cmake 

# Variable 'a' isn't defined. 
set(hola "${a}") 

# message(${hola}) 
message("${hola}") 

Kết quả của việc này mini-test (cmake -P test.cmake) là một dòng sản phẩm nào (vì 'a' không được định nghĩa) . Nếu tôi bỏ ghi chú đầu tiên, cmake ném một thông báo lỗi:

CMake Error at prueba.cmake:6 (message): 
    message called with incorrect number of arguments 

Tại sao trường hợp thứ hai nó không ném và lỗi nhưng là một dòng trống?

+1

Mô tả cú pháp hữu ích để tham khảo trong tương lai: http://www.cmake.org/Wiki/CMake/Language_Syntax – raek

+0

Trang rất hữu ích. Một tham chiếu chính cho những người mới làm quen với tôi :) –

Trả lời

8

Trong chuỗi CMake có thể được hiểu là danh sách. Quy tắc rất đơn giản: để tạo thành danh sách chia chuỗi tại dấu chấm phẩy. Ví dụ: giá trị chuỗi one;two;three có thể được coi là danh sách gồm ba phần tử: one, twothree.

Để gọi lệnh, bạn viết tên lệnh và một số từ giữa dấu ngoặc đơn. Tuy nhiên, những từ này làm không tương ứng với các đối số mà lệnh nhận được theo kiểu một-một. Mỗi từ trở thành 0 hoặc nhiều đối số, và tất cả các đối số được nối với nhau. Trừ khi một từ được trích dẫn, nó được coi là một danh sách và được mở rộng thành nhiều đối số. Một từ được trích dẫn luôn trở thành một đối số duy nhất.

Ví dụ, giả sử rằng X là ràng buộc để one;two;three, Y được ràng buộc với chuỗi rỗng, và Z là ràng buộc để foo. Invocation lệnh sau đây có ba chữ, nhưng lệnh nhận được bốn đối số:

some_command(${X} ${Y} ${Z}) 
# The command receives four arguments: 
# 1. one 
# 2. two 
# 3. three 
# 4. foo 

Nếu chúng ta đã trích dẫn những lời, lệnh sẽ nhận được ba đối số:

some_command("${X}" "${Y}" "${Z}") 
# The command receives three arguments: 
# 1. one;two;three 
# 2. (the empty list) 
# 3. foo 

Để trở về ban đầu của bạn câu hỏi: lệnh message có thể nhận được số lượng đối số khác nhau. Phải mất tất cả các đối số của nó, nối chúng lại với nhau thành một chuỗi, và sau đó in chuỗi đó. Đối với một số lý do không rõ nó không chấp nhận số không đối số, mặc dù.

Các hành vi message có với nhiều đối số không phải là rất hữu ích, vì vậy bạn có xu hướng sử dụng một đối số duy nhất được trích dẫn với nó:

set(SOURCES foo.c hoo.h) 
message(${SOURCES}) # prints foo.cfoo.h 
message("${SOURCES}") # prints foo.c;foo.h 

Ngoài ra, khi set nhận nhiều đối số nó xây dựng một chuỗi các đối số tách bằng dấu chấm phẩy. Biến được đặt thành chuỗi đó.

+0

Tôi cần lưu ý rằng cú pháp $ {...} có nghĩa là thay thế chuỗi và có thể sử dụng hầu như bất cứ nơi nào (và thậm chí có thể làm tổ!). – raek

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