-make the imported targets feature of FindQt4.cmake fully backwards compatible

After discussing with Brad and Clinton:
-the namespace for the imported targets is now "Qt4::", tested with Makefiles, Visual Studio and XCode projects
-the imported targets are always created
-if QT_USE_IMPORTED_TARGETS is set to TRUE (it defaults to FALSE), the QT_QTFOO_LIBRARY variables are set to point to these imported
targets, otherwise the old behaviour is used.
-on OSX if Qt has been found as framework, disable QT_USE_IMPORTED_TARGETS, since cmake doesn't handle the framework directory as location of the library correctly

Alex
This commit is contained in:
Alexander Neundorf 2010-01-18 16:23:21 -05:00
parent 835b07a3a8
commit 03769801ff
1 changed files with 108 additions and 40 deletions

View File

@ -52,6 +52,18 @@
# QT_USE_PHONON # QT_USE_PHONON
# QT_USE_QTSCRIPTTOOLS # QT_USE_QTSCRIPTTOOLS
# #
# QT_USE_IMPORTED_TARGETS
# If this variable is set to TRUE, FindQt4.cmake will create imported
# library targets for the various Qt libraries and set the
# library variables like QT_QTCORE_LIBRARY to point at these imported
# targets instead of the library file on disk. This provides much better
# handling of the release and debug versions of the Qt libraries and is
# also always backwards compatible, except for the case that dependencies
# of libraries are exported, these will then also list the names of the
# imported targets as dependency and not the file location on disk. This
# is much more flexible, but requires that FindQt4.cmake is executed before
# such an exported dependency file is processed.
#
# There are also some files that need processing by some Qt tools such as moc # There are also some files that need processing by some Qt tools such as moc
# and uic. Listed below are macros that may be used to process those files. # and uic. Listed below are macros that may be used to process those files.
# #
@ -836,30 +848,86 @@ IF (QT4_QMAKE_FOUND)
# #
############################################ ############################################
MACRO (_QT4_ADJUST_LIB_VARS basename) # On OSX when Qt is found as framework, never use the imported targets for now, since
# The name of the imported targets, i.e. the prefix "Qt4ImportedTarget__" must not change, # in this case the handling of the framework directory currently does not work correctly.
IF(QT_USE_FRAMEWORKS)
SET(QT_USE_IMPORTED_TARGETS FALSE)
ENDIF(QT_USE_FRAMEWORKS)
MACRO (_QT4_ADJUST_LIB_VARS _camelCaseBasename)
STRING(TOUPPER "${_camelCaseBasename}" basename)
# The name of the imported targets, i.e. the prefix "Qt4::" must not change,
# since it is stored in EXPORT-files as name of a required library. If the name would change # since it is stored in EXPORT-files as name of a required library. If the name would change
# here, this would lead to the imported Qt4-library targets not being resolved by cmake anymore. # here, this would lead to the imported Qt4-library targets not being resolved by cmake anymore.
IF (QT_${basename}_LIBRARY_RELEASE OR QT_${basename}_LIBRARY_DEBUG) IF (QT_${basename}_LIBRARY_RELEASE OR QT_${basename}_LIBRARY_DEBUG)
IF(NOT TARGET Qt4ImportedTarget__${basename})
ADD_LIBRARY(Qt4ImportedTarget__${basename} UNKNOWN IMPORTED ) IF(NOT TARGET Qt4::${_camelCaseBasename})
ADD_LIBRARY(Qt4::${_camelCaseBasename} UNKNOWN IMPORTED )
IF (QT_${basename}_LIBRARY_RELEASE) IF (QT_${basename}_LIBRARY_RELEASE)
SET_PROPERTY(TARGET Qt4ImportedTarget__${basename} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) SET_PROPERTY(TARGET Qt4::${_camelCaseBasename} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
SET_PROPERTY(TARGET Qt4ImportedTarget__${basename} PROPERTY IMPORTED_LOCATION_RELEASE "${QT_${basename}_LIBRARY_RELEASE}" ) SET_PROPERTY(TARGET Qt4::${_camelCaseBasename} PROPERTY IMPORTED_LOCATION_RELEASE "${QT_${basename}_LIBRARY_RELEASE}" )
ENDIF (QT_${basename}_LIBRARY_RELEASE) ENDIF (QT_${basename}_LIBRARY_RELEASE)
IF (QT_${basename}_LIBRARY_DEBUG) IF (QT_${basename}_LIBRARY_DEBUG)
SET_PROPERTY(TARGET Qt4ImportedTarget__${basename} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) SET_PROPERTY(TARGET Qt4::${_camelCaseBasename} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
SET_PROPERTY(TARGET Qt4ImportedTarget__${basename} PROPERTY IMPORTED_LOCATION_DEBUG "${QT_${basename}_LIBRARY_DEBUG}" ) SET_PROPERTY(TARGET Qt4::${_camelCaseBasename} PROPERTY IMPORTED_LOCATION_DEBUG "${QT_${basename}_LIBRARY_DEBUG}" )
ENDIF (QT_${basename}_LIBRARY_DEBUG) ENDIF (QT_${basename}_LIBRARY_DEBUG)
ENDIF(NOT TARGET Qt4::${_camelCaseBasename})
SET(QT_${basename}_LIBRARY Qt4ImportedTarget__${basename} ) # If QT_USE_IMPORTED_TARGETS is enabled, the QT_QTFOO_LIBRARY variables are set to point at these
SET(QT_${basename}_LIBRARIES Qt4ImportedTarget__${basename} ) # imported targets. This works better in general, and is also in almost all cases fully
# backward compatible. The only issue is when a project A which had this enabled then exports its
# libraries via export or EXPORT_LIBRARY_DEPENDENCIES(). In this case the libraries from project
# A will depend on the imported Qt targets, and the names of these imported targets will be stored
# in the dependency files on disk. This means when a project B then uses project A, these imported
# targets must be created again, otherwise e.g. "Qt4__QtCore" will be interpreted as name of a
# library file on disk, and not as a target, and linking will fail:
IF(QT_USE_IMPORTED_TARGETS)
SET(QT_${basename}_LIBRARY Qt4::${_camelCaseBasename} )
SET(QT_${basename}_LIBRARIES Qt4::${_camelCaseBasename} )
ELSE(QT_USE_IMPORTED_TARGETS)
SET(QT_${basename}_FOUND 1) # if the release- as well as the debug-version of the library have been found:
IF (QT_${basename}_LIBRARY_DEBUG AND QT_${basename}_LIBRARY_RELEASE)
# if the generator supports configuration types then set
# optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value
IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
SET(QT_${basename}_LIBRARY optimized ${QT_${basename}_LIBRARY_RELEASE} debug ${QT_${basename}_LIBRARY_DEBUG})
ELSE(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
# if there are no configuration types and CMAKE_BUILD_TYPE has no value
# then just use the release libraries
SET(QT_${basename}_LIBRARY ${QT_${basename}_LIBRARY_RELEASE} )
ENDIF(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
SET(QT_${basename}_LIBRARIES optimized ${QT_${basename}_LIBRARY_RELEASE} debug ${QT_${basename}_LIBRARY_DEBUG})
ENDIF (QT_${basename}_LIBRARY_DEBUG AND QT_${basename}_LIBRARY_RELEASE)
# if only the release version was found, set the debug variable also to the release version
IF (QT_${basename}_LIBRARY_RELEASE AND NOT QT_${basename}_LIBRARY_DEBUG)
SET(QT_${basename}_LIBRARY_DEBUG ${QT_${basename}_LIBRARY_RELEASE})
SET(QT_${basename}_LIBRARY ${QT_${basename}_LIBRARY_RELEASE})
SET(QT_${basename}_LIBRARIES ${QT_${basename}_LIBRARY_RELEASE})
ENDIF (QT_${basename}_LIBRARY_RELEASE AND NOT QT_${basename}_LIBRARY_DEBUG)
# if only the debug version was found, set the release variable also to the debug version
IF (QT_${basename}_LIBRARY_DEBUG AND NOT QT_${basename}_LIBRARY_RELEASE)
SET(QT_${basename}_LIBRARY_RELEASE ${QT_${basename}_LIBRARY_DEBUG})
SET(QT_${basename}_LIBRARY ${QT_${basename}_LIBRARY_DEBUG})
SET(QT_${basename}_LIBRARIES ${QT_${basename}_LIBRARY_DEBUG})
ENDIF (QT_${basename}_LIBRARY_DEBUG AND NOT QT_${basename}_LIBRARY_RELEASE)
# put the value in the cache:
SET(QT_${basename}_LIBRARY ${QT_${basename}_LIBRARY} CACHE STRING "The Qt ${basename} library" FORCE)
ENDIF(QT_USE_IMPORTED_TARGETS)
# message(STATUS "QT_${basename}_LIBRARY: ${QT_${basename}_LIBRARY}")
SET(QT_${basename}_FOUND 1)
ENDIF(NOT TARGET Qt4ImportedTarget__${basename})
ENDIF (QT_${basename}_LIBRARY_RELEASE OR QT_${basename}_LIBRARY_DEBUG) ENDIF (QT_${basename}_LIBRARY_RELEASE OR QT_${basename}_LIBRARY_DEBUG)
IF (QT_${basename}_INCLUDE_DIR) IF (QT_${basename}_INCLUDE_DIR)
@ -874,39 +942,39 @@ IF (QT4_QMAKE_FOUND)
# Set QT_xyz_LIBRARY variable and add # Set QT_xyz_LIBRARY variable and add
# library include path to QT_INCLUDES # library include path to QT_INCLUDES
_QT4_ADJUST_LIB_VARS(QTCORE) _QT4_ADJUST_LIB_VARS(QtCore)
_QT4_ADJUST_LIB_VARS(QTGUI) _QT4_ADJUST_LIB_VARS(QtGui)
_QT4_ADJUST_LIB_VARS(QT3SUPPORT) _QT4_ADJUST_LIB_VARS(Qt3Support)
_QT4_ADJUST_LIB_VARS(QTASSISTANT) _QT4_ADJUST_LIB_VARS(QtAssistant)
_QT4_ADJUST_LIB_VARS(QTASSISTANTCLIENT) _QT4_ADJUST_LIB_VARS(QtAssistantClient)
_QT4_ADJUST_LIB_VARS(QTCLUCENE) _QT4_ADJUST_LIB_VARS(QtCLucene)
_QT4_ADJUST_LIB_VARS(QTDBUS) _QT4_ADJUST_LIB_VARS(QtDBus)
_QT4_ADJUST_LIB_VARS(QTDESIGNER) _QT4_ADJUST_LIB_VARS(QtDesigner)
_QT4_ADJUST_LIB_VARS(QTDESIGNERCOMPONENTS) _QT4_ADJUST_LIB_VARS(QtDesignerComponents)
_QT4_ADJUST_LIB_VARS(QTHELP) _QT4_ADJUST_LIB_VARS(QtHelp)
_QT4_ADJUST_LIB_VARS(QTMULTIMEDIA) _QT4_ADJUST_LIB_VARS(QtMultimedia)
_QT4_ADJUST_LIB_VARS(QTNETWORK) _QT4_ADJUST_LIB_VARS(QtNetwork)
_QT4_ADJUST_LIB_VARS(QTNSPLUGIN) _QT4_ADJUST_LIB_VARS(QtNsPlugin)
_QT4_ADJUST_LIB_VARS(QTOPENGL) _QT4_ADJUST_LIB_VARS(QtOpenGL)
_QT4_ADJUST_LIB_VARS(QTSCRIPT) _QT4_ADJUST_LIB_VARS(QtScript)
_QT4_ADJUST_LIB_VARS(QTSCRIPTTOOLS) _QT4_ADJUST_LIB_VARS(QtScriptTools)
_QT4_ADJUST_LIB_VARS(QTSQL) _QT4_ADJUST_LIB_VARS(QtSql)
_QT4_ADJUST_LIB_VARS(QTSVG) _QT4_ADJUST_LIB_VARS(QtSvg)
_QT4_ADJUST_LIB_VARS(QTTEST) _QT4_ADJUST_LIB_VARS(QtTest)
_QT4_ADJUST_LIB_VARS(QTUITOOLS) _QT4_ADJUST_LIB_VARS(QtUiTools)
_QT4_ADJUST_LIB_VARS(QTWEBKIT) _QT4_ADJUST_LIB_VARS(QtWebKit)
_QT4_ADJUST_LIB_VARS(QTXML) _QT4_ADJUST_LIB_VARS(QtXml)
_QT4_ADJUST_LIB_VARS(QTXMLPATTERNS) _QT4_ADJUST_LIB_VARS(QtXmlPatterns)
_QT4_ADJUST_LIB_VARS(PHONON) _QT4_ADJUST_LIB_VARS(phonon)
# platform dependent libraries # platform dependent libraries
IF(Q_WS_X11) IF(Q_WS_X11)
_QT4_ADJUST_LIB_VARS(QTMOTIF) _QT4_ADJUST_LIB_VARS(QtMotif)
ENDIF(Q_WS_X11) ENDIF(Q_WS_X11)
IF(WIN32) IF(WIN32)
_QT4_ADJUST_LIB_VARS(QTMAIN) _QT4_ADJUST_LIB_VARS(qtmain)
_QT4_ADJUST_LIB_VARS(QAXSERVER) _QT4_ADJUST_LIB_VARS(QAxServer)
_QT4_ADJUST_LIB_VARS(QAXCONTAINER) _QT4_ADJUST_LIB_VARS(QAxContainer)
ENDIF(WIN32) ENDIF(WIN32)
# If Qt is installed as a framework, we need to add QT_QTCORE_LIBRARY here (which # If Qt is installed as a framework, we need to add QT_QTCORE_LIBRARY here (which