Procházet zdrojové kódy

BUG: Do not remove the source file extension when computing an object file name. This addresses bug #6169. If CMAKE_BACKWARDS_COMPATIBILITY is 2.4 or lower maintain the old behavior so that existing build trees and old project releases are not affected.

Brad King před 18 roky
rodič
revize
3efc6e40cb

+ 7 - 4
Source/cmLocalGenerator.cxx

@@ -2753,11 +2753,14 @@ cmLocalGenerator
   // extension.
   if(!source.GetPropertyAsBool("KEEP_EXTENSION"))
     {
-    // Remove the original extension.
-    std::string::size_type dot_pos = objectName.rfind(".");
-    if(dot_pos != std::string::npos)
+    // Remove the original extension for CMake 2.4 compatibility.
+    if(this->NeedBackwardsCompatibility(2, 4))
       {
-      objectName = objectName.substr(0, dot_pos);
+      std::string::size_type dot_pos = objectName.rfind(".");
+      if(dot_pos != std::string::npos)
+        {
+        objectName = objectName.substr(0, dot_pos);
+        }
       }
 
     // Store the new extension.

+ 6 - 17
Tests/ExternalOBJ/CMakeLists.txt

@@ -18,37 +18,26 @@ TRY_COMPILE(EXTERNAL_OBJECT_BUILT
   external
   OUTPUT_VARIABLE OUTPUT
   )
-SET(EXTERNAL_OBJECT_NAME "external_object${CMAKE_CXX_OUTPUT_EXTENSION}")
 IF(EXTERNAL_OBJECT_BUILT)
   MESSAGE(
-    "Building ${EXTERNAL_OBJECT_NAME} succeeded with the following output:\n"
+    "Building external_object.cxx succeeded with the following output:\n"
     "[${OUTPUT}]"
     )
 ELSE(EXTERNAL_OBJECT_BUILT)
   MESSAGE(FATAL_ERROR
-    "Building ${EXTERNAL_OBJECT_NAME} failed with the following output:\n"
+    "Building external_object.cxx failed with the following output:\n"
     "[${OUTPUT}]"
     )
 ENDIF(EXTERNAL_OBJECT_BUILT)
 
 # Find the external object file.
-SET(BASE ${ExternalOBJ_BINARY_DIR}/Object)
-SET(EXTERNAL_OBJECT)
-FOREACH(dir external.dir . ${CMAKE_CONFIGURATION_TYPES})
-  IF(NOT EXTERNAL_OBJECT)
-    IF(EXISTS ${BASE}/${dir}/${EXTERNAL_OBJECT_NAME})
-      SET(EXTERNAL_OBJECT ${BASE}/${dir}/${EXTERNAL_OBJECT_NAME})
-    ENDIF(EXISTS ${BASE}/${dir}/${EXTERNAL_OBJECT_NAME})
-  ENDIF(NOT EXTERNAL_OBJECT)
-ENDFOREACH(dir)
-IF(NOT EXTERNAL_OBJECT)
-  FILE(GLOB_RECURSE EXTERNAL_OBJECT
-    "${ExternalOBJ_BINARY_DIR}/Object/${EXTERNAL_OBJECT_NAME}")
-ENDIF(NOT EXTERNAL_OBJECT)
+SET(DIR ${ExternalOBJ_BINARY_DIR}/Object)
+FILE(GLOB_RECURSE EXTERNAL_OBJECT
+  "${DIR}/external_object*${CMAKE_CXX_OUTPUT_EXTENSION}")
 IF(EXTERNAL_OBJECT)
   MESSAGE("Found \"${EXTERNAL_OBJECT}\".")
 ELSE(EXTERNAL_OBJECT)
-  MESSAGE(FATAL_ERROR "Could not find ${EXTERNAL_OBJECT_NAME}.")
+  MESSAGE(FATAL_ERROR "Could not find external object.")
 ENDIF(EXTERNAL_OBJECT)
 
 # Test creation of external objects by custom commands.

+ 1 - 1
Tests/MakeClean/ToClean/CMakeLists.txt

@@ -6,7 +6,7 @@ ADD_EXECUTABLE(toclean toclean.cxx)
 # List some build-time-generated files.
 GET_TARGET_PROPERTY(TOCLEAN_FILES toclean LOCATION)
 SET(TOCLEAN_FILES ${TOCLEAN_FILES}
-  "${ToClean_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/toclean.dir/toclean${CMAKE_CXX_OUTPUT_EXTENSION}")
+  "${ToClean_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/toclean.dir/toclean.cxx${CMAKE_CXX_OUTPUT_EXTENSION}")
 
 # Create a file that must be registered for cleaning.
 FILE(WRITE "${ToClean_BINARY_DIR}/Registered.txt"