Browse Source

CMake: avoid installed Magnum headers being picked over local ones.

If Magnum and Corrade get installed into the same directory,
target_include_directories() or target_link_libraries() with Corrade
before Magnum will result in the (usually stale) installed Magnum
headers being picked over the local ones. Which is unwanted, so try to
always put the local Magnum include path first.

Tested manually by installing to an arbitrary location and editing
configure.h to contain an #error. That failed for the Text library, and
with these changes it now doesn't fail anymore, but that's not a
guarantee that I managed to fix all such cases.
pull/168/head
Vladimír Vondruš 3 years ago
parent
commit
1d2796baed
  1. 8
      src/Magnum/Audio/CMakeLists.txt
  2. 6
      src/Magnum/GL/CMakeLists.txt
  3. 11
      src/Magnum/Text/CMakeLists.txt
  4. 2
      src/Magnum/Trade/CMakeLists.txt

8
src/Magnum/Audio/CMakeLists.txt

@ -75,8 +75,10 @@ add_library(MagnumAudioObjects OBJECT
${MagnumAudio_SRCS} ${MagnumAudio_SRCS}
${MagnumAudio_HEADERS}) ${MagnumAudio_HEADERS})
target_include_directories(MagnumAudioObjects PUBLIC target_include_directories(MagnumAudioObjects PUBLIC
$<TARGET_PROPERTY:OpenAL::OpenAL,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:Magnum,INTERFACE_INCLUDE_DIRECTORIES> $<TARGET_PROPERTY:Magnum,INTERFACE_INCLUDE_DIRECTORIES>
# Include dependencies after Magnum itself, to avoid stale installed Magnum
# headers being preferred over the project-local ones
$<TARGET_PROPERTY:OpenAL::OpenAL,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:Corrade::PluginManager,INTERFACE_INCLUDE_DIRECTORIES>) $<TARGET_PROPERTY:Corrade::PluginManager,INTERFACE_INCLUDE_DIRECTORIES>)
if(NOT MAGNUM_BUILD_STATIC) if(NOT MAGNUM_BUILD_STATIC)
target_compile_definitions(MagnumAudioObjects PRIVATE "MagnumAudioObjects_EXPORTS") target_compile_definitions(MagnumAudioObjects PRIVATE "MagnumAudioObjects_EXPORTS")
@ -178,7 +180,6 @@ if(MAGNUM_BUILD_TESTS)
${MagnumAudio_GracefulAssert_SRCS}) ${MagnumAudio_GracefulAssert_SRCS})
target_compile_definitions(MagnumAudioTestLib PRIVATE target_compile_definitions(MagnumAudioTestLib PRIVATE
"CORRADE_GRACEFUL_ASSERT" "MagnumAudio_EXPORTS") "CORRADE_GRACEFUL_ASSERT" "MagnumAudio_EXPORTS")
target_include_directories(MagnumAudioTestLib PUBLIC ${OPENAL_INCLUDE_DIR})
set_target_properties(MagnumAudioTestLib PROPERTIES DEBUG_POSTFIX "-d") set_target_properties(MagnumAudioTestLib PROPERTIES DEBUG_POSTFIX "-d")
if(MAGNUM_BUILD_STATIC_PIC) if(MAGNUM_BUILD_STATIC_PIC)
set_target_properties(MagnumAudioTestLib PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(MagnumAudioTestLib PROPERTIES POSITION_INDEPENDENT_CODE ON)
@ -187,6 +188,9 @@ if(MAGNUM_BUILD_TESTS)
Magnum Magnum
Corrade::PluginManager Corrade::PluginManager
OpenAL::OpenAL) OpenAL::OpenAL)
# Include dependencies after Magnum itself, to avoid stale installed Magnum
# headers being preferred over the project-local ones
target_include_directories(MagnumAudioTestLib PUBLIC ${OPENAL_INCLUDE_DIR})
if(MAGNUM_WITH_SCENEGRAPH) if(MAGNUM_WITH_SCENEGRAPH)
target_link_libraries(MagnumAudioTestLib PUBLIC MagnumSceneGraph) target_link_libraries(MagnumAudioTestLib PUBLIC MagnumSceneGraph)
endif() endif()

6
src/Magnum/GL/CMakeLists.txt

@ -264,9 +264,11 @@ if(MAGNUM_WITH_OPENGLTESTER)
# Assuming that PIC is not needed because the Tester lib is always linked # Assuming that PIC is not needed because the Tester lib is always linked
# to the executable and not to any intermediate shared lib # to the executable and not to any intermediate shared lib
target_include_directories(MagnumOpenGLTesterObjects PUBLIC target_include_directories(MagnumOpenGLTesterObjects PUBLIC
$<TARGET_PROPERTY:Corrade::TestSuite,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:MagnumGL,INTERFACE_INCLUDE_DIRECTORIES> $<TARGET_PROPERTY:MagnumGL,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:${OPENGLTESTER_APPLICATION},INTERFACE_INCLUDE_DIRECTORIES>) $<TARGET_PROPERTY:${OPENGLTESTER_APPLICATION},INTERFACE_INCLUDE_DIRECTORIES>
# Include dependencies after Magnum itself, to avoid stale installed
# headers being preferred over the project-local ones
$<TARGET_PROPERTY:Corrade::TestSuite,INTERFACE_INCLUDE_DIRECTORIES>)
add_library(MagnumOpenGLTester STATIC add_library(MagnumOpenGLTester STATIC
$<TARGET_OBJECTS:MagnumOpenGLTesterObjects> $<TARGET_OBJECTS:MagnumOpenGLTesterObjects>

11
src/Magnum/Text/CMakeLists.txt

@ -85,11 +85,14 @@ add_library(MagnumTextObjects OBJECT
${MagnumText_HEADERS} ${MagnumText_HEADERS}
${MagnumText_PRIVATE_HEADERS}) ${MagnumText_PRIVATE_HEADERS})
target_include_directories(MagnumTextObjects PUBLIC target_include_directories(MagnumTextObjects PUBLIC
$<TARGET_PROPERTY:Corrade::PluginManager,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:Magnum,INTERFACE_INCLUDE_DIRECTORIES>) $<TARGET_PROPERTY:Magnum,INTERFACE_INCLUDE_DIRECTORIES>)
if(MAGNUM_TARGET_GL) if(MAGNUM_TARGET_GL)
target_include_directories(MagnumTextObjects PUBLIC $<TARGET_PROPERTY:MagnumGL,INTERFACE_INCLUDE_DIRECTORIES>) target_include_directories(MagnumTextObjects PUBLIC $<TARGET_PROPERTY:MagnumGL,INTERFACE_INCLUDE_DIRECTORIES>)
endif() endif()
# Include dependencies after Magnum itself, to avoid stale installed Magnum
# headers being preferred over the project-local ones
target_include_directories(MagnumTextObjects PUBLIC
$<TARGET_PROPERTY:Corrade::PluginManager,INTERFACE_INCLUDE_DIRECTORIES>)
if(NOT MAGNUM_BUILD_STATIC) if(NOT MAGNUM_BUILD_STATIC)
target_compile_definitions(MagnumTextObjects PRIVATE "MagnumTextObjects_EXPORTS") target_compile_definitions(MagnumTextObjects PRIVATE "MagnumTextObjects_EXPORTS")
endif() endif()
@ -109,11 +112,13 @@ elseif(MAGNUM_BUILD_STATIC_PIC)
endif() endif()
target_link_libraries(MagnumText PUBLIC target_link_libraries(MagnumText PUBLIC
Magnum Magnum
MagnumTextureTools MagnumTextureTools)
Corrade::PluginManager)
if(MAGNUM_TARGET_GL) if(MAGNUM_TARGET_GL)
target_link_libraries(MagnumText PUBLIC MagnumGL) target_link_libraries(MagnumText PUBLIC MagnumGL)
endif() endif()
# Include dependencies after Magnum itself, to avoid stale installed Magnum
# headers being preferred over the project-local ones
target_link_libraries(MagnumText PUBLIC Corrade::PluginManager)
install(TARGETS MagnumText install(TARGETS MagnumText
RUNTIME DESTINATION ${MAGNUM_BINARY_INSTALL_DIR} RUNTIME DESTINATION ${MAGNUM_BINARY_INSTALL_DIR}

2
src/Magnum/Trade/CMakeLists.txt

@ -123,6 +123,8 @@ add_library(MagnumTradeObjects OBJECT
${MagnumTrade_PRIVATE_HEADERS}) ${MagnumTrade_PRIVATE_HEADERS})
target_include_directories(MagnumTradeObjects PUBLIC target_include_directories(MagnumTradeObjects PUBLIC
$<TARGET_PROPERTY:Magnum,INTERFACE_INCLUDE_DIRECTORIES> $<TARGET_PROPERTY:Magnum,INTERFACE_INCLUDE_DIRECTORIES>
# Include dependencies after Magnum itself, to avoid stale installed
# headers being preferred over the project-local ones
$<TARGET_PROPERTY:Corrade::PluginManager,INTERFACE_INCLUDE_DIRECTORIES>) $<TARGET_PROPERTY:Corrade::PluginManager,INTERFACE_INCLUDE_DIRECTORIES>)
if(NOT MAGNUM_BUILD_STATIC) if(NOT MAGNUM_BUILD_STATIC)
target_compile_definitions(MagnumTradeObjects PRIVATE "MagnumTradeObjects_EXPORTS") target_compile_definitions(MagnumTradeObjects PRIVATE "MagnumTradeObjects_EXPORTS")

Loading…
Cancel
Save