CMake/Tests/ExternalOBJ/CMakeLists.txt
Brad King b291d9e756 VS10: Fix external objects generated outside target (#13047)
Commit 9a6ff950 (Fix for bug where VS2010 did not use .obj files,
2011-04-01) assumed that if an external object is GENERATED that it is
the output of a custom command in the current target.  If it is
generated by another target then VS will not automatically include the
external object in the current target.  This bug was preserved by the
refactoring in the parent commit.

Instead use <None> for external objects generated by a custom command in
the current target and <Object> for all other external objects.  Update
the ExternalOBJ test to cover this case.
2012-03-20 09:01:02 -04:00

64 lines
2.0 KiB
CMake

cmake_minimum_required (VERSION 2.6)
PROJECT (ExternalOBJ)
IF(APPLE)
# set _CMAKE_OSX_MACHINE to umame -m
EXEC_PROGRAM(uname ARGS -m OUTPUT_VARIABLE _CMAKE_OSX_MACHINE)
# check for Power PC and change to ppc
IF("${_CMAKE_OSX_MACHINE}" MATCHES "Power")
SET(_CMAKE_OSX_MACHINE ppc)
ENDIF("${_CMAKE_OSX_MACHINE}" MATCHES "Power")
SET(CMAKE_OSX_ARCHITECTURES ${_CMAKE_OSX_MACHINE})
ENDIF(APPLE)
# Build the external object file.
TRY_COMPILE(EXTERNAL_OBJECT_BUILT
${ExternalOBJ_BINARY_DIR}/Object
${ExternalOBJ_SOURCE_DIR}/Object
Object
external
OUTPUT_VARIABLE OUTPUT
)
IF(EXTERNAL_OBJECT_BUILT)
MESSAGE(
"Building external_object.cxx succeeded with the following output:\n"
"[${OUTPUT}]"
)
ELSE(EXTERNAL_OBJECT_BUILT)
MESSAGE(FATAL_ERROR
"Building external_object.cxx failed with the following output:\n"
"[${OUTPUT}]"
)
ENDIF(EXTERNAL_OBJECT_BUILT)
# Find the external object file.
SET(DIR ${ExternalOBJ_BINARY_DIR}/Object)
FILE(GLOB_RECURSE EXTERNAL_OBJECT
"${DIR}/external_object*${CMAKE_CXX_OUTPUT_EXTENSION}")
IF(EXTERNAL_OBJECT)
LIST (GET EXTERNAL_OBJECT 0 EXTERNAL_OBJECT)
MESSAGE("Found \"${EXTERNAL_OBJECT}\".")
ELSE(EXTERNAL_OBJECT)
MESSAGE(FATAL_ERROR "Could not find external object.")
ENDIF(EXTERNAL_OBJECT)
# Test creation of external objects by custom commands.
SET(CUSTOM_OBJECT
${CMAKE_CURRENT_BINARY_DIR}/custom_object${CMAKE_C_OUTPUT_EXTENSION})
ADD_CUSTOM_COMMAND(
OUTPUT ${CUSTOM_OBJECT}
COMMAND ${CMAKE_COMMAND} -E copy ${EXTERNAL_OBJECT} ${CUSTOM_OBJECT}
DEPENDS ${EXTERNAL_OBJECT}
)
message("${EXTERNAL_OBJECT}")
# Build an executable using the external object file.
ADD_EXECUTABLE(ExternalOBJ executable.cxx ${CUSTOM_OBJECT})
# A bug showed up in VS2010 where an object file that was
# part of a custom commad output worked, but ones that were
# not didn't work. So, repeat the executable using the object
# directly and not from the output of the copy.
ADD_EXECUTABLE(ExternalOBJ2 executable.cxx ${EXTERNAL_OBJECT})
ADD_SUBDIRECTORY(Sub)