CMOS

2016-12-19 12 views
8

ile derleyicide bir C++ 11 özelliğinin etkin olup olmadığını kontrol edin CMake ile bir proje geliştiriyorum. Kodum Visual Studio 2015'te izin verilen ancak Visual Studio 2013'te izin verilen constexpr yöntemlerini içerir.CMOS

Özellik, belirtilen derleyici tarafından destekleniyorsa, CMakeLists.txt'u nasıl kontrol edebilirim? CMake belgelerinde CMAKE_CXX_KNOWN_FEATURES gördüm, ancak nasıl kullanacağımı anlamadım.

cevap

7

bir C++ 11 (/ 14/17), özelliği gerektirecek target_compile_features kullanabilir:

target_compile_features(target PRIVATE|PUBLIC|INTERFACE feature1 [feature2 ...]) 

CMAKE_CXX_KNOWN_FEATURES listelenen bir özellik olarak feature1 ile. Eğer kamu API constexpr kullanmak istiyorsanız Örneğin, şunları kullanabilirsiniz:

add_library(foo ...) 
target_compile_features(foo PUBLIC cxx_constexpr) 

Ayrıca seçenekler gibi özellikleri algılamasını sağlar WriteCompilerDetectionHeader module bakmak ve geriye dönük uyumluluk sağlayan gerektiğini bazı özellikler için uygulama derleyici bunları desteklemiyorsa:

İşte
write_compiler_detection_header(
    FILE foo_compiler_detection.h 
    PREFIX FOO 
    COMPILERS GNU MSVC 
    FEATURES cxx_constexpr cxx_nullptr 
) 

foo_compiler_detection.hFOO_COMPILER_CXX_CONSTEXPR kelime constexpr varsa tanımlanan ile oluşturulacak bir dosya:

#include "foo_compiler_detection.h" 

#if FOO_COMPILER_CXX_CONSTEXPR 

// implementation with constexpr available 
constexpr int bar = 0; 

#else 

// implementation with constexpr not available 
const int bar = 0; 

#endif 

Üstelik FOO_CONSTEXPR tanımlanacak ve özellik geçerli derleyici varsa constexpr genişleyecektir. Aksi halde boş olacak.

FOO_NULLPTR tanımlanacak ve geçerli derleyici için varsa, nullptr'a genişler. Aksi halde bir uyumluluk uygulamasına genişleyecektir (ör. NULL).

( )