2012-04-06 35 views
95

Chúng tôi có một bộ cross platform CMake build scripts và chúng tôi hỗ trợ xây dựng với MSVCGCC.Trong cmake, làm thế nào tôi có thể kiểm tra nếu trình biên dịch là Clang?

Chúng tôi đang thử ra Clang, nhưng tôi không thể tìm ra cách kiểm tra xem trình biên dịch có phải là Clang với tập lệnh CMake của chúng tôi hay không.

Tôi nên kiểm tra xem trình biên dịch có phải là Clang hay không? Chúng tôi hiện đang sử dụng MSVCCMAKE_COMPILER_IS_GNU<LANG> để kiểm tra MSVC và GCC tương ứng.

+0

Bạn có thể đặt trình biên dịch bằng cách đặt CMAKE_C_COMPILER và CMAKE_CXX_COMPILER thành đường dẫn đến clang hoặc clang ++. 1 cho tiếng kêu. – Zaffy

+0

Tại sao bạn nên quan tâm? Clang rất giống GCC, về các tùy chọn biên dịch được chấp nhận ... –

+0

@BasileStarynkevitch Vì chúng tôi hỗ trợ MSVC, chúng tôi cần phát hiện Clang để chúng tôi biết có bật các tùy chọn giống như GCC hay các tùy chọn giống như MSVC hay không. Đã quá lâu để tôi nhớ, nhưng chắc chắn chúng tôi cũng có thể sử dụng các tùy chọn không được Clang hỗ trợ. – leedm777

Trả lời

158

Một kiểm tra đáng tin cậy là sử dụng CMAKE_<LANG>_COMPILER_ID biến. Ví dụ: để kiểm tra trình biên dịch C++:

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 
    # using Clang 
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 
    # using GCC 
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") 
    # using Intel C++ 
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") 
    # using Visual Studio C++ 
endif() 

Chúng cũng hoạt động chính xác nếu trình bao bọc trình biên dịch ccache được sử dụng.

Kể từ CMake 3.0.0, giá trị CMAKE_<LANG>_COMPILER_ID cho Clang do Apple cung cấp hiện là AppleClang. Để kiểm tra cả Clang do Apple cung cấp và Clang thông thường, hãy sử dụng các điều kiện sau:

if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") 
    # using regular Clang or AppleClang 
endif() 

Xem thêm AppleClang policy description.

+0

Tài liệu [cmake] (http://www.cmake.org/cmake/help/cmake-2-8-docs.html#variable:CMAKE_LANG_COMPILER_ID) nêu "Điều này được sử dụng để xác định trình biên dịch và có thể thay đổi" . Nếu không, nó sẽ là hoàn hảo :-( – leedm777

+0

Nó có lẽ không phải là một ý tưởng tốt để sử dụng các giải pháp dựa trên 'CMAKE_CXX_COMPILER_ARG1', một trong hai.Điều này dường như không được tài liệu ở tất cả .. – sakra

+15

Như của CMake 2.8.10, biến này là (cuối cùng!) Tài liệu. Xem: http://www.cmake.org/cmake/help/v2.8.10/cmake.html#variable:CMAKE_LANG_COMPILER_ID –

0

Các OGRE 3D mã nguồn động cơ sử dụng check sau:

if (CMAKE_CXX_COMPILER MATCHES ".*clang") 
    set(CMAKE_COMPILER_IS_CLANGXX 1) 
endif() 
+3

Thật gần, nhưng không hoạt động khi bạn sử dụng [ccache] (http: // ccache .samba.org /) (ví dụ: 'xuất khẩu CXX = "ccache clang ++" ') – leedm777

+4

Đóng đủ, tôi sẽ cung cấp cho bạn. Tôi đã sử dụng 'if (" $ {CMAKE_CXX_COMPILER} $ {CMAKE_CXX_COMPILER_ARG1} "MATCHES". * Clang ")' để xử lý trường hợp ccache. – leedm777

+0

Điều này không có tác dụng với tôi như '$ {CMAKE_CXX_COMPILER} ==/Thư viện/Nhà phát triển/CommandLineTools/usr/bin/C++'. Câu trả lời được chấp nhận hoạt động. –

0

Chỉ cần để tránh bất kỳ vấn đề mispelling, Tôi đang sử dụng này:

if (CMAKE_CXX_COMPILER_ID MATCHES "[cC][lL][aA][nN][gG]") #Case insensitive match 
    set(IS_CLANG_BUILD true) 
else() 
    set(IS_CLANG_BUILD false) 
endif() 

Đối với đưa ra luận cứ regex không nhạy cảm, tôi đã cố gắng mọi thứ here nhưng không thành công (dường như không được hỗ trợ trong CMake).

+0

thực sự, như ngày hôm nay, trường hợp không phù hợp với trường hợp nó là không thể https://cmake.org/pipermail/cmake/2017-May/065432.html – fferri

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