2013-02-18 9 views

Trả lời

37

AFAIK, không có built-in hỗ trợ cho một cái gì đó như thế này, nhưng bạn chắc chắn có thể viết nó cho mình:

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 
    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "your.required.gcc.version") 
    message(FATAL_ERROR "Insufficient gcc version") 
    endif() 
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 
    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "your.required.msvc.version") 
    message(FATAL_ERROR "Insufficient msvc version") 
    endif() 
elseif(...) 
# etc. 
endif() 

Tuy nhiên, tôi đề nghị bạn thực sự xem xét một cách tiếp cận tính năng phát hiện để thay thế. Tức là, sử dụng try_compile() để xác minh rằng trình biên dịch hỗ trợ các tính năng bạn cần và FATAL_ERROR nếu không. Đó là thành ngữ trong CMake, và có thêm lợi ích bạn không cần phải khám phá phiên bản tối thiểu thích hợp cho tất cả các trình biên dịch ra khỏi đó.

+0

Trong khi nhiều thành ngữ, tôi đã phát hiện ra rằng thử nghiệm xem ' std :: regex' sử dụng biên dịch mất thời gian so sánh để biên soạn toàn bộ (nhỏ) dự án. Đôi khi việc kiểm tra phiên bản đơn giản hơn cho nhà phát triển và nhanh hơn cho người dùng biên soạn dự án. – Ruslan

21

Bắt đầu với CMake 2.8.10 các biến CMAKE_ <LANG> _COMPILER_VERSION có thể được người dùng truy cập để lấy phiên bản trình biên dịch. Trong các phiên bản trước, chúng chỉ được dành riêng cho mục đích nội bộ và không được đọc bởi mã người dùng. Chúng cũng không đảm bảo được đặt cho tất cả ngôn ngữ nhưng C và CXX chắc chắn sẽ khả dụng.

CMake cũng chứa các toán tử để so sánh phiên bản (VERSION_LESS, VERSION_EQUAL, VERSION_GREATER) mà bạn có thể sử dụng để viết mã xác nhận phiên bản của mình.

Hãy nhớ rằng bạn sẽ cần phải tìm ra trình biên dịch nào bạn có trước và sau đó kiểm tra phiên bản chính xác.

Đây là một mẫu ngắn từ một trong những dự án của tôi:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 
    # require at least gcc 4.8 
    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) 
     message(FATAL_ERROR "GCC version must be at least 4.8!") 
    endif() 
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 
    # require at least clang 3.2 
    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.2) 
     message(FATAL_ERROR "Clang version must be at least 3.2!") 
    endif() 
else() 
    message(WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang and GCC.") 
endif() 
3

Bạn có thể kiểm tra phiên bản gcc cụ thể như sau:

if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) 
    message(FATAL_ERROR "Require at least gcc-5.1") 
endif()