summaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2013-10-14 10:42:35 +0200
committerGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2013-10-14 10:42:35 +0200
commit83564d2caddf8dac447d8d8e8071aad8d705a031 (patch)
tree7a42d81fbcc72964f978e9702bfd3956a4c64623 /cmake
parent8ee7655743408e812715b7262947ad4471d4dd61 (diff)
Unfortunately that commit was wrong. Compilation tests need to link to QtCore in order to resolve qt_assert, which is used indirectly. This commit reverts and fixes the original problem in a different way, using handle_imported_targets_in_cmake_required_libraries()
Diffstat (limited to 'cmake')
-rw-r--r--cmake/modules/FindQt4or5.cmake7
-rw-r--r--cmake/modules/HandleImportedTargetsInCMakeRequiredLibraries.cmake83
2 files changed, 90 insertions, 0 deletions
diff --git a/cmake/modules/FindQt4or5.cmake b/cmake/modules/FindQt4or5.cmake
index f5355b2..b0f6874 100644
--- a/cmake/modules/FindQt4or5.cmake
+++ b/cmake/modules/FindQt4or5.cmake
@@ -177,6 +177,13 @@ include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Qt4or5 REQUIRED_VARS _Qt4or5_FOUND HANDLE_COMPONENTS)
set(Qt4or5_FOUND ${QT4OR5_FOUND})
+# Core library needed for compilation tests
+if (${QT_VERSION} STREQUAL "4")
+ set (Qt4or5_Core_LIBRARIES ${QT_QTCORE_LIBRARY})
+else()
+ set (Qt4or5_Core_LIBRARIES ${Qt5Core_LIBRARIES})
+endif()
+
# qt4or5_use_modules(target [ LINK_PUBLIC | LINK_PRIVATE ] <modules>)
# Supported modules: Core, Gui, Widgets, Quick1, Quick2, Test, OpenGL
function(qt4or5_use_modules _target _link_type)
diff --git a/cmake/modules/HandleImportedTargetsInCMakeRequiredLibraries.cmake b/cmake/modules/HandleImportedTargetsInCMakeRequiredLibraries.cmake
new file mode 100644
index 0000000..10b6806
--- /dev/null
+++ b/cmake/modules/HandleImportedTargetsInCMakeRequiredLibraries.cmake
@@ -0,0 +1,83 @@
+# This is a helper function used by CheckCXXSourceRuns.cmake and
+# CheckCXXSourceCompiles.cmake. Actually it should be used by all macros which
+# use TRY_COMPILE() or TRY_RUN().
+# It takes the CMAKE_REQUIRED_LIBRARY variable and searches it for imported
+# (library) targets. Since the project created by TRY_COMPILE() (and TRY_RUN())
+# does not know about these imported targets, this macro here replaces these
+# imported targets with the actual library files on disk and it also
+# adds the libraries from the link interface of these imported targets.
+# E.g the imported target KDE4__kdeui is replaced on my system with /opt/kdelibs/lib/libkdeui.so
+# and the link interface libraries, which includes e.g. /opt/kdelibs/lib/libkdecore.so.
+# This way imported targets work also when used with CHECK_CXX_SOURCE_COMPILES/RUNS().
+
+# Copyright (c) 2009, Alexander Neundorf, <neundorf@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+FUNCTION(HANDLE_IMPORTED_TARGETS_IN_CMAKE_REQUIRED_LIBRARIES _RESULT)
+# handle imported library targets
+ SET(_CCSR_IMP_TARGETS_MAP)
+ SET(_CCSR_REQ_LIBS ${CMAKE_REQUIRED_LIBRARIES})
+ SET(_CHECK_FOR_IMPORTED_TARGETS TRUE)
+ SET(_CCSR_LOOP_COUNTER 0)
+ WHILE(_CHECK_FOR_IMPORTED_TARGETS)
+ MATH(EXPR _CCSR_LOOP_COUNTER "${_CCSR_LOOP_COUNTER} + 1 ")
+ SET(_CCSR_NEW_REQ_LIBS )
+ SET(_CHECK_FOR_IMPORTED_TARGETS FALSE)
+ FOREACH(_CURRENT_LIB ${_CCSR_REQ_LIBS})
+ GET_TARGET_PROPERTY(_importedConfigs ${_CURRENT_LIB} IMPORTED_CONFIGURATIONS)
+ IF (_importedConfigs)
+ # Ok, so this is an imported target.
+ # First we get the imported configurations.
+ # Then we get the location of the actual library on disk of the first configuration.
+ # then we'll get its link interface libraries property,
+ # iterate through it and replace all imported targets we find there
+ # with there actual location.
+
+ # guard against infinite loop: abort after 100 iterations ( 100 is arbitrary chosen)
+ IF ("${_CCSR_LOOP_COUNTER}" LESS 100)
+ SET(_CHECK_FOR_IMPORTED_TARGETS TRUE)
+# ELSE ("${_CCSR_LOOP_COUNTER}" LESS 1)
+# MESSAGE(STATUS "********* aborting loop, counter : ${_CCSR_LOOP_COUNTER}")
+ ENDIF ("${_CCSR_LOOP_COUNTER}" LESS 100)
+
+ LIST(GET _importedConfigs 0 _firstImportedConfig)
+ GET_TARGET_PROPERTY(_firstImportedLocation ${_CURRENT_LIB} IMPORTED_LOCATION_${_firstImportedConfig})
+ GET_TARGET_PROPERTY(_linkInterfaceLibs ${_CURRENT_LIB} IMPORTED_LINK_INTERFACE_LIBRARIES_${_firstImportedConfig} )
+
+ LIST(APPEND _CCSR_NEW_REQ_LIBS ${_firstImportedLocation})
+# MESSAGE(STATUS "Appending lib ${_CURRENT_LIB} as ${_firstImportedLocation}")
+ IF(_linkInterfaceLibs)
+ FOREACH(_currentLinkInterfaceLib ${_linkInterfaceLibs})
+# MESSAGE(STATUS "Appending link interface lib ${_currentLinkInterfaceLib}")
+ IF(_currentLinkInterfaceLib)
+ LIST(APPEND _CCSR_NEW_REQ_LIBS ${_currentLinkInterfaceLib} )
+ ENDIF(_currentLinkInterfaceLib)
+ ENDFOREACH(_currentLinkInterfaceLib ${_linkInterfaceLibs})
+ ENDIF(_linkInterfaceLibs)
+ ELSE(_importedConfigs)
+ # "Normal" libraries are just used as they are.
+ LIST(APPEND _CCSR_NEW_REQ_LIBS ${_CURRENT_LIB} )
+# MESSAGE(STATUS "Appending lib directly: ${_CURRENT_LIB}")
+ ENDIF(_importedConfigs)
+ ENDFOREACH(_CURRENT_LIB ${_CCSR_REQ_LIBS})
+
+ SET(_CCSR_REQ_LIBS ${_CCSR_NEW_REQ_LIBS} )
+ ENDWHILE(_CHECK_FOR_IMPORTED_TARGETS)
+
+ # Finally we iterate once more over all libraries. This loop only removes
+ # all remaining imported target names (there shouldn't be any left anyway).
+ SET(_CCSR_NEW_REQ_LIBS )
+ FOREACH(_CURRENT_LIB ${_CCSR_REQ_LIBS})
+ GET_TARGET_PROPERTY(_importedConfigs ${_CURRENT_LIB} IMPORTED_CONFIGURATIONS)
+ IF (NOT _importedConfigs)
+ LIST(APPEND _CCSR_NEW_REQ_LIBS ${_CURRENT_LIB} )
+# MESSAGE(STATUS "final: appending ${_CURRENT_LIB}")
+ ELSE (NOT _importedConfigs)
+# MESSAGE(STATUS "final: skipping ${_CURRENT_LIB}")
+ ENDIF (NOT _importedConfigs)
+ ENDFOREACH(_CURRENT_LIB ${_CCSR_REQ_LIBS})
+ SET(${_RESULT} ${_CCSR_NEW_REQ_LIBS} PARENT_SCOPE)
+
+ENDFUNCTION(HANDLE_IMPORTED_TARGETS_IN_CMAKE_REQUIRED_LIBRARIES _RESULT)