Browse Source

Merge topic 'feature-absence-hard-error'

8d0b1cca Features: FATAL_ERROR on compilers with no recorded features.
447fbb3f Tests: Execute compile features tests unconditionally.
597bb72e Tests: Run RunCMake.target_compile_features unconditionally.
Brad King 11 years ago
parent
commit
b10083876c

+ 22 - 2
Source/cmMakefile.cxx

@@ -4604,8 +4604,28 @@ AddRequiredTargetFeature(cmTarget *target, const std::string& feature,
 
   if (!featuresKnown || !*featuresKnown)
     {
-    // We know of no features for the compiler at all.
-    return true;
+    cmOStringStream e;
+    if (error)
+      {
+      e << "no";
+      }
+    else
+      {
+      e << "No";
+      }
+    e << " known features for compiler\n\""
+      << this->GetDefinition("CMAKE_" + lang + "_COMPILER_ID")
+      << "\"\nversion "
+      << this->GetDefinition("CMAKE_" + lang + "_COMPILER_VERSION") << ".";
+    if (error)
+      {
+      *error = e.str();
+      }
+    else
+      {
+      this->IssueMessage(cmake::FATAL_ERROR, e.str());
+      }
+    return false;
     }
 
   std::vector<std::string> availableFeatures;

+ 8 - 0
Tests/CMakeCommands/target_compile_features/CMakeLists.txt

@@ -1,6 +1,14 @@
 cmake_minimum_required(VERSION 3.0)
 project(target_compile_features)
 
+if (NOT CMAKE_CXX_COMPILE_FEATURES)
+  file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test_dummy.cpp"
+    "int main(int,char**) { return 0; }\n"
+  )
+  add_executable(target_compile_features "${CMAKE_CURRENT_BINARY_DIR}/test_dummy.cpp")
+  return()
+endif()
+
 set(CMAKE_VERBOSE_MAKEFILE ON)
 
 add_executable(target_compile_features main.cpp)

+ 3 - 5
Tests/CMakeLists.txt

@@ -197,11 +197,9 @@ if(BUILD_TESTING)
   ADD_TEST_MACRO(TarTest TarTest)
   ADD_TEST_MACRO(SystemInformation SystemInformation)
   ADD_TEST_MACRO(MathTest MathTest)
-  if(CMAKE_CXX_COMPILER_ID STREQUAL GNU
-      AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
-    ADD_TEST_MACRO(CompileFeatures CompileFeatures)
-    ADD_TEST_MACRO(CMakeCommands.target_compile_features target_compile_features)
-  endif()
+  ADD_TEST_MACRO(CompileFeatures CompileFeatures)
+  ADD_TEST_MACRO(CMakeCommands.target_compile_features target_compile_features)
+
   # assume no resources building to test
   set(TEST_RESOURCES FALSE)
   # for windows and cygwin assume we have resources

+ 8 - 0
Tests/CompileFeatures/CMakeLists.txt

@@ -3,6 +3,14 @@ cmake_minimum_required(VERSION 3.0)
 
 project(CompileFeatures)
 
+if (NOT CMAKE_CXX_COMPILE_FEATURES)
+  file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp"
+    "int main(int,char**) { return 0; }\n"
+  )
+  add_executable(CompileFeatures "${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp")
+  return()
+endif()
+
 macro(run_test feature)
   if (";${CMAKE_CXX_COMPILE_FEATURES};" MATCHES ${feature})
     add_library(test_${feature} OBJECT ${feature}.cpp)

+ 1 - 3
Tests/RunCMake/CMakeLists.txt

@@ -126,9 +126,7 @@ add_RunCMake_test(File_Generate)
 add_RunCMake_test(ExportWithoutLanguage)
 add_RunCMake_test(target_link_libraries)
 
-if (CMAKE_CXX_COMPILER_ID STREQUAL GNU AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
-  add_RunCMake_test(target_compile_features)
-endif()
+add_RunCMake_test(target_compile_features)
 add_RunCMake_test(CheckModules)
 add_RunCMake_test(CommandLine)
 

+ 1 - 0
Tests/RunCMake/CompileFeatures/NoSupportedCxxFeatures-result.txt

@@ -0,0 +1 @@
+1

+ 8 - 0
Tests/RunCMake/CompileFeatures/NoSupportedCxxFeatures-stderr.txt

@@ -0,0 +1,8 @@
+CMake Error at NoSupportedCxxFeatures.cmake:3 \(target_compile_features\):
+  target_compile_features no known features for compiler
+
+  "[^"]*"
+
+  version *[.0-9]+\.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 3 - 0
Tests/RunCMake/CompileFeatures/NoSupportedCxxFeatures.cmake

@@ -0,0 +1,3 @@
+
+add_library(no_features empty.cpp)
+target_compile_features(no_features PRIVATE cxx_constexpr)

+ 1 - 0
Tests/RunCMake/CompileFeatures/NoSupportedCxxFeaturesGenex-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/CompileFeatures/NoSupportedCxxFeaturesGenex-stderr.txt

@@ -0,0 +1,6 @@
+CMake Error in CMakeLists.txt:
+  No known features for compiler
+
+  "[^"]*"
+
+  version *[.0-9]+\.

+ 3 - 0
Tests/RunCMake/CompileFeatures/NoSupportedCxxFeaturesGenex.cmake

@@ -0,0 +1,3 @@
+
+add_library(no_features empty.cpp)
+target_compile_features(no_features PRIVATE $<1:cxx_constexpr>)

+ 11 - 0
Tests/RunCMake/CompileFeatures/RunCMakeTest.cmake

@@ -7,3 +7,14 @@ run_cmake(NotAFeature_OriginDebug)
 run_cmake(NotAFeature_OriginDebugGenex)
 run_cmake(NotAFeature_OriginDebugTransitive)
 run_cmake(NotAFeature_OriginDebug_target_compile_features)
+
+run_cmake(generate_feature_list)
+file(READ
+  "${RunCMake_BINARY_DIR}/generate_feature_list-build/features.txt"
+  FEATURES
+)
+
+if (NOT FEATURES)
+  run_cmake(NoSupportedCxxFeatures)
+  run_cmake(NoSupportedCxxFeaturesGenex)
+endif()

+ 4 - 0
Tests/RunCMake/CompileFeatures/generate_feature_list.cmake

@@ -0,0 +1,4 @@
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/features.txt"
+  "${CMAKE_CXX_COMPILE_FEATURES}"
+)