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.

This commit is contained in:
Brad King 2007-12-28 23:07:26 -05:00
parent f872c10b7e
commit 3efc6e40cb
3 changed files with 14 additions and 22 deletions

View File

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

View File

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

View File

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