2015-02-15 12 views
6

Trong cmake, làm cách nào để kiểm tra xem mã thông báo chuỗi có được bao gồm trong chuỗi khác không?Kiểm tra mã thông báo chuỗi ký tự nhỏ

Trong trường hợp của tôi, tôi muốn biết tên trình biên dịch có chứa chuỗi "Clang" (ví dụ: "clang", "AppleClang", ...) hay không. Tất cả những gì tôi có thể làm cho đến thời điểm này là:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 
... 
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") 
... 

Tôi muốn có cách tiếp cận linh hoạt hơn, như kiểm tra sự hiện diện của chuỗi con.

Đây là những gì tôi có thể tìm thấy trong tài liệu hướng dẫn:

if (phù hợp với regex) Đúng nếu chuỗi nhất định hoặc giá trị biến của phù hợp với biểu thức chính quy định.
nếu (LESS) Đúng nếu chuỗi hoặc giá trị của biến đã cho là số hợp lệ và nhỏ hơn số đó ở bên phải.
nếu (TUYỆT VỜI) Đúng nếu chuỗi hoặc giá trị của biến đã cho là số hợp lệ và lớn hơn số đó ở bên phải.
nếu (EQUAL) Đúng nếu chuỗi hoặc giá trị của biến đã cho là số hợp lệ và bằng với số đó ở bên phải.
nếu (STRLESS) Đúng nếu chuỗi hoặc giá trị của biến được đặt theo từ điển ít hơn chuỗi hoặc biến ở bên phải.
nếu (STRGREATER) Đúng nếu chuỗi hoặc giá trị của biến nhất định về mặt từ điển lớn hơn chuỗi hoặc biến ở bên phải.
nếu (STREQUAL) Đúng nếu chuỗi hoặc giá trị của biến được từ điển tương đương với chuỗi hoặc biến ở bên phải.

+0

Một trong những cách tiếp cận bạn được liệt kê sẽ là câu trả lời cuối cùng, nhưng không có ví dụ rõ ràng về mã thông báo bạn đang tìm kiếm và chuỗi bạn đang tìm kiếm, sẽ không có ai có thể hướng dẫn bạn trực tiếp hơn. – kdopen

Trả lời

7

if(<variable|string> MATCHES regex) có thể sẽ là thứ bạn đang tìm kiếm.

Trong trường hợp đặc biệt này (giả sử bạn đang làm điều tương tự bên trong khối cho ClangAppleClang) sau đó bạn có thể thay thế:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 
... 
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") 
... 

với:

if(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$") 
+0

Đối với những gì tôi phải làm, điều này hoạt động tốt: 'if (CMAKE_CXX_COMPILER_ID MATCHES" Clang ")' – Pietro

+0

Và vì ban đầu có thể là chữ hoa hoặc chữ thường: 'if (CMAKE_CXX_COMPILER_ID MATCHES" (C | c?) Lang ")' – Pietro

+4

@Pietro Đó là bởi vì, mặc dù đã được ghi lại, MATCHES trả về true khi chuỗi tìm kiếm là * chứa * trong chuỗi được phân tích cú pháp. Đó là ít nhất là kinh nghiệm của tôi, được thử nghiệm trong một số trường hợp, nhưng một lần nữa tài liệu hướng dẫn là xa rõ ràng về khía cạnh này. – Antonio

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