diff options
author | Brad King <brad.king@kitware.com> | 2015-02-05 14:25:14 (GMT) |
---|---|---|
committer | CMake Topic Stage <kwrobot@kitware.com> | 2015-02-05 14:25:14 (GMT) |
commit | 9042c875dcbd0f4b7150e9050b60fb0d40365e45 (patch) | |
tree | 046a4e8dae32734af5d2001ad8255ee866536b5e | |
parent | 0ae11b1fb0925a172adcc7cc3c9b804e2ece9ba7 (diff) | |
parent | fb3487a9975ed321b48fad5c71dd655d66b68087 (diff) | |
download | CMake-9042c875dcbd0f4b7150e9050b60fb0d40365e45.zip CMake-9042c875dcbd0f4b7150e9050b60fb0d40365e45.tar.gz CMake-9042c875dcbd0f4b7150e9050b60fb0d40365e45.tar.bz2 |
Merge topic 'fix-C-standard-features'
fb3487a9 Features: Fix C90 feature detection.
6027798a Features: Allow setting standard dialect below the default.
9d767810 Features: Populate CMAKE_<LANG>_STANDARD_DEFAULT only for supported compilers.
72537e44 Features: Add dialect compile flags only if default is known.
82c9d686 AppleClang: Remove redundant UNIX condition.
-rw-r--r-- | Modules/Compiler/AppleClang-C-FeatureTests.cmake | 2 | ||||
-rw-r--r-- | Modules/Compiler/AppleClang-C.cmake | 6 | ||||
-rw-r--r-- | Modules/Compiler/AppleClang-CXX.cmake | 6 | ||||
-rw-r--r-- | Modules/Compiler/Clang-C-FeatureTests.cmake | 2 | ||||
-rw-r--r-- | Modules/Compiler/Clang-CXX.cmake | 4 | ||||
-rw-r--r-- | Modules/Compiler/GNU-C-FeatureTests.cmake | 2 | ||||
-rw-r--r-- | Modules/Compiler/GNU-C.cmake | 2 | ||||
-rw-r--r-- | Modules/Compiler/GNU-CXX.cmake | 4 | ||||
-rw-r--r-- | Modules/Compiler/MSVC-CXX.cmake | 7 | ||||
-rw-r--r-- | Modules/Compiler/SunPro-CXX.cmake | 4 | ||||
-rw-r--r-- | Source/cmLocalGenerator.cxx | 30 | ||||
-rw-r--r-- | Tests/CompileFeatures/CMakeLists.txt | 32 | ||||
-rw-r--r-- | Tests/CompileFeatures/genex_test.c | 38 | ||||
-rw-r--r-- | Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt | 22 | ||||
-rw-r--r-- | Tests/Module/WriteCompilerDetectionHeader/main.c | 29 | ||||
-rw-r--r-- | Tests/Module/WriteCompilerDetectionHeader/main_multi.c | 29 |
16 files changed, 198 insertions, 21 deletions
diff --git a/Modules/Compiler/AppleClang-C-FeatureTests.cmake b/Modules/Compiler/AppleClang-C-FeatureTests.cmake index 6f3d6a7..e80b526 100644 --- a/Modules/Compiler/AppleClang-C-FeatureTests.cmake +++ b/Modules/Compiler/AppleClang-C-FeatureTests.cmake @@ -7,5 +7,5 @@ set(AppleClang_C99 "${_cmake_oldestSupported} && defined(__STDC_VERSION__) && __ set(_cmake_feature_test_c_restrict "${AppleClang_C99}") set(_cmake_feature_test_c_variadic_macros "${AppleClang_C99}") -set(AppleClang_C90 "${_cmake_oldestSupported} && !defined(__STDC_VERSION__)") +set(AppleClang_C90 "${_cmake_oldestSupported}") set(_cmake_feature_test_c_function_prototypes "${AppleClang_C90}") diff --git a/Modules/Compiler/AppleClang-C.cmake b/Modules/Compiler/AppleClang-C.cmake index 16f420f..10454f6 100644 --- a/Modules/Compiler/AppleClang-C.cmake +++ b/Modules/Compiler/AppleClang-C.cmake @@ -12,7 +12,9 @@ if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.0) set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11") endif() -set(CMAKE_C_STANDARD_DEFAULT 99) +if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.0) + set(CMAKE_C_STANDARD_DEFAULT 99) +endif() macro(cmake_record_c_compile_features) macro(_get_appleclang_features std_version list) @@ -20,7 +22,7 @@ macro(cmake_record_c_compile_features) endmacro() set(_result 0) - if (UNIX AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.0) + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.0) _get_appleclang_features(${CMAKE_C11_STANDARD_COMPILE_OPTION} CMAKE_C11_COMPILE_FEATURES) if (_result EQUAL 0) _get_appleclang_features(${CMAKE_C99_STANDARD_COMPILE_OPTION} CMAKE_C99_COMPILE_FEATURES) diff --git a/Modules/Compiler/AppleClang-CXX.cmake b/Modules/Compiler/AppleClang-CXX.cmake index 978c382..5194da4 100644 --- a/Modules/Compiler/AppleClang-CXX.cmake +++ b/Modules/Compiler/AppleClang-CXX.cmake @@ -19,7 +19,9 @@ if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y") endif() -set(CMAKE_CXX_STANDARD_DEFAULT 98) +if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.0) + set(CMAKE_CXX_STANDARD_DEFAULT 98) +endif() macro(cmake_record_cxx_compile_features) macro(_get_appleclang_features std_version list) @@ -27,7 +29,7 @@ macro(cmake_record_cxx_compile_features) endmacro() set(_result 0) - if (UNIX AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.0) + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.0) set(_result 0) if(CMAKE_CXX14_STANDARD_COMPILE_OPTION) _get_appleclang_features(${CMAKE_CXX14_STANDARD_COMPILE_OPTION} CMAKE_CXX14_COMPILE_FEATURES) diff --git a/Modules/Compiler/Clang-C-FeatureTests.cmake b/Modules/Compiler/Clang-C-FeatureTests.cmake index 2d8673d..99c2252 100644 --- a/Modules/Compiler/Clang-C-FeatureTests.cmake +++ b/Modules/Compiler/Clang-C-FeatureTests.cmake @@ -7,5 +7,5 @@ set(Clang_C99 "${_cmake_oldestSupported} && defined(__STDC_VERSION__) && __STDC_ set(_cmake_feature_test_c_restrict "${Clang_C99}") set(_cmake_feature_test_c_variadic_macros "${Clang_C99}") -set(Clang_C90 "${_cmake_oldestSupported} && !defined(__STDC_VERSION__)") +set(Clang_C90 "${_cmake_oldestSupported}") set(_cmake_feature_test_c_function_prototypes "${Clang_C90}") diff --git a/Modules/Compiler/Clang-CXX.cmake b/Modules/Compiler/Clang-CXX.cmake index e07eace..84b2c74 100644 --- a/Modules/Compiler/Clang-CXX.cmake +++ b/Modules/Compiler/Clang-CXX.cmake @@ -31,7 +31,9 @@ elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4) set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y") endif() -set(CMAKE_CXX_STANDARD_DEFAULT 98) +if(UNIX AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4) + set(CMAKE_CXX_STANDARD_DEFAULT 98) +endif() macro(cmake_record_cxx_compile_features) macro(_get_clang_features std_version list) diff --git a/Modules/Compiler/GNU-C-FeatureTests.cmake b/Modules/Compiler/GNU-C-FeatureTests.cmake index d8e456c..b3fe33f 100644 --- a/Modules/Compiler/GNU-C-FeatureTests.cmake +++ b/Modules/Compiler/GNU-C-FeatureTests.cmake @@ -13,5 +13,5 @@ set(GNU44_C99 "(__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && defined(__STDC_VERSIO set(_cmake_feature_test_c_restrict "${GNU44_C99}") set(_cmake_feature_test_c_variadic_macros "${GNU44_C99}") -set(GNU_C90 "${_cmake_oldestSupported} && !defined(__STDC_VERSION__)") +set(GNU_C90 "${_cmake_oldestSupported}") set(_cmake_feature_test_c_function_prototypes "${GNU_C90}") diff --git a/Modules/Compiler/GNU-C.cmake b/Modules/Compiler/GNU-C.cmake index fa97a94..89704e6 100644 --- a/Modules/Compiler/GNU-C.cmake +++ b/Modules/Compiler/GNU-C.cmake @@ -24,7 +24,7 @@ endif() if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0) set(CMAKE_C_STANDARD_DEFAULT 11) -else() +elseif(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.4) set(CMAKE_C_STANDARD_DEFAULT 90) endif() diff --git a/Modules/Compiler/GNU-CXX.cmake b/Modules/Compiler/GNU-CXX.cmake index c471daf..86a31e4 100644 --- a/Modules/Compiler/GNU-CXX.cmake +++ b/Modules/Compiler/GNU-CXX.cmake @@ -34,7 +34,9 @@ elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y") endif() -set(CMAKE_CXX_STANDARD_DEFAULT 98) +if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4) + set(CMAKE_CXX_STANDARD_DEFAULT 98) +endif() macro(cmake_record_cxx_compile_features) macro(_get_gcc_features std_version list) diff --git a/Modules/Compiler/MSVC-CXX.cmake b/Modules/Compiler/MSVC-CXX.cmake index 962aaeb..82ce069 100644 --- a/Modules/Compiler/MSVC-CXX.cmake +++ b/Modules/Compiler/MSVC-CXX.cmake @@ -1,5 +1,8 @@ -# MSVC has no specific language level or flags to change it. -set(CMAKE_CXX_STANDARD_DEFAULT "") + +if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16.0) + # MSVC has no specific language level or flags to change it. + set(CMAKE_CXX_STANDARD_DEFAULT "") +endif() macro(cmake_record_cxx_compile_features) record_compiler_features(CXX "" CMAKE_CXX_COMPILE_FEATURES) diff --git a/Modules/Compiler/SunPro-CXX.cmake b/Modules/Compiler/SunPro-CXX.cmake index cb37713..c7bc734 100644 --- a/Modules/Compiler/SunPro-CXX.cmake +++ b/Modules/Compiler/SunPro-CXX.cmake @@ -37,7 +37,9 @@ if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13) set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=c++11") endif() -set(CMAKE_CXX_STANDARD_DEFAULT 98) +if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13) + set(CMAKE_CXX_STANDARD_DEFAULT 98) +endif() macro(cmake_record_cxx_compile_features) macro(_get_solaris_studio_features std_version list) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 290c2ca..7ca7684 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2205,7 +2205,7 @@ AddCompilerRequirementFlag(std::string &flags, cmTarget* target, } const char* defaultStd = this->Makefile->GetDefinition("CMAKE_" + lang + "_STANDARD_DEFAULT"); - if (defaultStd && !*defaultStd) + if (!defaultStd || !*defaultStd) { // This compiler has no notion of language standard levels. return; @@ -2272,18 +2272,32 @@ AddCompilerRequirementFlag(std::string &flags, cmTarget* target, std::find(stds.begin(), stds.end(), standard); assert(stdIt != stds.end()); - std::vector<std::string>::const_iterator defaultStdIt; - if (defaultStd) + std::vector<std::string>::const_iterator defaultStdIt = + std::find(stds.begin(), stds.end(), defaultStd); + if (defaultStdIt == stds.end()) { - defaultStdIt = std::find(stds.begin(), stds.end(), defaultStd); - assert(defaultStdIt != stds.end()); + std::string e = + "CMAKE_" + lang + "_STANDARD_DEFAULT is set to invalid value '" + + std::string(defaultStd) + "'"; + this->Makefile->IssueMessage(cmake::INTERNAL_ERROR, e); + return; } - else + + // Greater or equal because the standards are stored in + // backward chronological order. + if (stdIt >= defaultStdIt) { - defaultStdIt = stds.end() - 1; + std::string option_flag = + "CMAKE_" + lang + *stdIt + + "_" + type + "_COMPILE_OPTION"; + + const char *opt = + target->GetMakefile()->GetRequiredDefinition(option_flag); + this->AppendFlagEscape(flags, opt); + return; } - for ( ; stdIt <= defaultStdIt; ++stdIt) + for ( ; stdIt < defaultStdIt; ++stdIt) { std::string option_flag = "CMAKE_" + lang + *stdIt diff --git a/Tests/CompileFeatures/CMakeLists.txt b/Tests/CompileFeatures/CMakeLists.txt index 38c44c8..3ba1e0a 100644 --- a/Tests/CompileFeatures/CMakeLists.txt +++ b/Tests/CompileFeatures/CMakeLists.txt @@ -164,6 +164,38 @@ if (CMAKE_C_COMPILE_FEATURES) ) endif() endif() + + add_executable(CompileFeaturesGenex_C genex_test.c) + set_property(TARGET CompileFeaturesGenex_C PROPERTY C_STANDARD 11) + + if (CMAKE_C_COMPILER_ID STREQUAL "GNU") + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.6) + list(APPEND expected_defs + EXPECT_C_STATIC_ASSERT=1 + ) + else() + list(APPEND expected_defs + EXPECT_C_STATIC_ASSERT=0 + ) + endif() + elseif(CMAKE_C_COMPILER_ID STREQUAL "Clang" + OR CMAKE_C_COMPILER_ID STREQUAL "AppleClang") + list(APPEND expected_defs + EXPECT_C_STATIC_ASSERT=1 + ) + endif() + + list(APPEND expected_defs + EXPECT_C_FUNCTION_PROTOTYPES=1 + EXPECT_C_RESTRICT=1 + ) + + target_compile_definitions(CompileFeaturesGenex_C PRIVATE + HAVE_C_FUNCTION_PROTOTYPES=$<COMPILE_FEATURES:c_function_prototypes> + HAVE_C_RESTRICT=$<COMPILE_FEATURES:c_restrict> + HAVE_C_STATIC_ASSERT=$<COMPILE_FEATURES:c_static_assert> + ${expected_defs} + ) endif() if (CMAKE_CXX_COMPILE_FEATURES) diff --git a/Tests/CompileFeatures/genex_test.c b/Tests/CompileFeatures/genex_test.c new file mode 100644 index 0000000..b1215bd --- /dev/null +++ b/Tests/CompileFeatures/genex_test.c @@ -0,0 +1,38 @@ +#ifndef EXPECT_C_STATIC_ASSERT +# error EXPECT_C_STATIC_ASSERT not defined +#endif +#ifndef EXPECT_C_FUNCTION_PROTOTYPES +# error EXPECT_C_FUNCTION_PROTOTYPES not defined +#endif +#ifndef EXPECT_C_RESTRICT +# error EXPECT_C_RESTRICT not defined +#endif + +#if !EXPECT_C_STATIC_ASSERT +#if EXPECT_C_STATIC_ASSERT +#error "Expect c_static_assert feature" +#endif +#else +#if !EXPECT_C_STATIC_ASSERT +#error "Expect no c_static_assert feature" +#endif +#endif + +#if !EXPECT_C_FUNCTION_PROTOTYPES +# error Expect c_function_prototypes support +#endif + +#if !EXPECT_C_RESTRICT +# if EXPECT_C_RESTRICT +# error Expect c_restrict support +# endif +#else +# if !EXPECT_C_RESTRICT +# error Expect no c_restrict support +# endif +#endif + +int main() +{ + +} diff --git a/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt b/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt index e70a977..c538280 100644 --- a/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt +++ b/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt @@ -84,6 +84,15 @@ if (CMAKE_C_COMPILER_ID STREQUAL "GNU" add_executable(C_undefined c_undefined.c) set_property(TARGET C_undefined PROPERTY C_STANDARD 90) target_compile_options(C_undefined PRIVATE -Werror=undef) + + add_executable(WriteCompilerDetectionHeader_C main.c) + set_property(TARGET WriteCompilerDetectionHeader_C PROPERTY C_STANDARD 90) + set_defines(WriteCompilerDetectionHeader_C "EXPECTED_COMPILER_C_FUNCTION_PROTOTYPES" "EXPECTED_COMPILER_C_RESTRICT") + + add_executable(WriteCompilerDetectionHeader_C_multi main_multi.c) + set_property(TARGET WriteCompilerDetectionHeader_C_multi PROPERTY C_STANDARD 90) + set_defines(WriteCompilerDetectionHeader_C_multi "EXPECTED_COMPILER_C_FUNCTION_PROTOTYPES" "EXPECTED_COMPILER_C_RESTRICT") + target_include_directories(WriteCompilerDetectionHeader_C_multi PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/compiler_multi_files) endif() add_executable(WriteCompilerDetectionHeader main.cpp) @@ -130,3 +139,16 @@ add_executable(multi_files_11 multi_files.cpp) set_property(TARGET multi_files_11 PROPERTY CXX_STANDARD 11) target_include_directories(multi_files_11 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/compiler_multi_files) set_defines(multi_files_11 "${true_defs}" "${false_defs}") + +if (CMAKE_C_COMPILER_ID STREQUAL "GNU" + OR CMAKE_C_COMPILER_ID STREQUAL "Clang" + OR CMAKE_C_COMPILER_ID STREQUAL "AppleClang") + add_executable(WriteCompilerDetectionHeader_C11 main.c) + set_property(TARGET WriteCompilerDetectionHeader_C11 PROPERTY C_STANDARD 11) + set_defines(WriteCompilerDetectionHeader_C11 "EXPECTED_COMPILER_C_FUNCTION_PROTOTYPES;EXPECTED_COMPILER_C_RESTRICT" "") + + add_executable(WriteCompilerDetectionHeader_C11_multi main_multi.c) + set_property(TARGET WriteCompilerDetectionHeader_C11_multi PROPERTY C_STANDARD 11) + set_defines(WriteCompilerDetectionHeader_C11_multi "EXPECTED_COMPILER_C_FUNCTION_PROTOTYPES;EXPECTED_COMPILER_C_RESTRICT" "") + target_include_directories(WriteCompilerDetectionHeader_C11_multi PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/compiler_multi_files) +endif() diff --git a/Tests/Module/WriteCompilerDetectionHeader/main.c b/Tests/Module/WriteCompilerDetectionHeader/main.c new file mode 100644 index 0000000..9023b0f --- /dev/null +++ b/Tests/Module/WriteCompilerDetectionHeader/main.c @@ -0,0 +1,29 @@ + +#include "test_compiler_detection.h" + +#if !defined(TEST_COMPILER_C_FUNCTION_PROTOTYPES) || !TEST_COMPILER_C_FUNCTION_PROTOTYPES +# error Expected TEST_COMPILER_C_FUNCTION_PROTOTYPES +#endif + +#if !EXPECTED_COMPILER_C_FUNCTION_PROTOTYPES +# error Expected EXPECTED_COMPILER_C_FUNCTION_PROTOTYPES +#endif + +#if !defined(TEST_COMPILER_C_RESTRICT) || !TEST_COMPILER_C_RESTRICT +# if EXPECTED_COMPILER_C_RESTRICT +# error Expected TEST_COMPILER_C_RESTRICT +# endif +#else +# if !EXPECTED_COMPILER_C_RESTRICT +# error Expect no TEST_COMPILER_C_RESTRICT +# endif +#endif + +#ifdef TEST_COMPILER_CXX_STATIC_ASSERT +#error Expect no CXX features defined +#endif + +int main() +{ + return 0; +} diff --git a/Tests/Module/WriteCompilerDetectionHeader/main_multi.c b/Tests/Module/WriteCompilerDetectionHeader/main_multi.c new file mode 100644 index 0000000..6f4573f --- /dev/null +++ b/Tests/Module/WriteCompilerDetectionHeader/main_multi.c @@ -0,0 +1,29 @@ + +#include "multi_file_compiler_detection.h" + +#if !defined(MULTI_COMPILER_C_FUNCTION_PROTOTYPES) || !MULTI_COMPILER_C_FUNCTION_PROTOTYPES +# error Expected MULTI_COMPILER_C_FUNCTION_PROTOTYPES +#endif + +#if !EXPECTED_COMPILER_C_FUNCTION_PROTOTYPES +# error Expected EXPECTED_COMPILER_C_FUNCTION_PROTOTYPES +#endif + +#if !defined(MULTI_COMPILER_C_RESTRICT) || !MULTI_COMPILER_C_RESTRICT +# if EXPECTED_COMPILER_C_RESTRICT +# error Expected MULTI_COMPILER_C_RESTRICT +# endif +#else +# if !EXPECTED_COMPILER_C_RESTRICT +# error Expect no MULTI_COMPILER_C_RESTRICT +# endif +#endif + +#ifdef MULTI_COMPILER_CXX_STATIC_ASSERT +#error Expect no CXX features defined +#endif + +int main() +{ + return 0; +} |