X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=cmake%2FQuasselMacros.cmake;h=d77ba1cfb511c6def8b60197bb9094a3d3f2441a;hb=b40672ab5c48b577b31371c159e60d330fdd7ce5;hp=f0791ec6366eb6b233f04b85421ed3ba9232fcf6;hpb=a2121709c6e39fe3640163e5a4b6b96b8b0f1ab8;p=quassel.git diff --git a/cmake/QuasselMacros.cmake b/cmake/QuasselMacros.cmake index f0791ec6..d77ba1cf 100644 --- a/cmake/QuasselMacros.cmake +++ b/cmake/QuasselMacros.cmake @@ -1,41 +1,135 @@ -# This macro sets variables for the Qt modules we need. +# This file contains various macros useful for building Quassel. +# +# (C) 2014 by the Quassel Project +# +# The qt4_use_modules function was taken from CMake's Qt4Macros.cmake: +# (C) 2005-2009 Kitware, Inc. +# +# The qt5_use_modules function was taken from Qt 5.10.1 (and modified): +# (C) 2005-2011 Kitware, Inc. +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. -macro(setup_qt_variables) - set(QUASSEL_QT_LIBRARIES ) - set(QUASSEL_QT_INCLUDES ${QT_INCLUDE_DIR}) # Qt4 - set(QUASSEL_QT_DEFINITIONS ${QT_DEFINITIONS}) # Qt4 +############################ +# Macros for dealing with Qt +############################ - IF(WIN32) - set(MAIN Main) - ENDIF(WIN32) - foreach(qtmod Core ${ARGV} ${MAIN}) - if(WITH_QT5) - find_package(Qt5${qtmod} ${QT_MIN_VERSION} REQUIRED) - list(APPEND QUASSEL_QT_LIBRARIES ${Qt5${qtmod}_LIBRARIES}) - list(APPEND QUASSEL_QT_INCLUDES ${Qt5${qtmod}_INCLUDE_DIRS}) - list(APPEND QUASSEL_QT_DEFINITIONS ${Qt5${qtmod}_DEFINITIONS} ${Qt5${qtmod}_EXECUTABLE_COMPILE_FLAGS}) - else(WITH_QT5) - string(TOUPPER ${qtmod} QTMOD) - list(APPEND QUASSEL_QT_LIBRARIES ${QT_QT${QTMOD}_LIBRARY}) - if(STATIC) - list(APPEND QUASSEL_QT_LIBRARIES ${QT_QT${QTMOD}_LIB_DEPENDENCIES}) - endif(STATIC) - list(APPEND QUASSEL_QT_INCLUDES ${QT_QT${QTMOD}_INCLUDE_DIR}) - list(APPEND QUASSEL_QT_DEFINITIONS -DQT_QT${QTMOD}_LIB) - endif(WITH_QT5) - endforeach(qtmod) +# CMake gained this function in 2.8.10. To be able to use older versions, we've copied +# this here. If present, the function from CMake will take precedence and our copy will be ignored. +function(qt4_use_modules _target _link_type) + if ("${_link_type}" STREQUAL "LINK_PUBLIC" OR "${_link_type}" STREQUAL "LINK_PRIVATE") + set(modules ${ARGN}) + set(link_type ${_link_type}) + else() + set(modules ${_link_type} ${ARGN}) + endif() + foreach(_module ${modules}) + string(TOUPPER ${_module} _ucmodule) + set(_targetPrefix QT_QT${_ucmodule}) + if (_ucmodule STREQUAL QAXCONTAINER OR _ucmodule STREQUAL QAXSERVER) + if (NOT QT_Q${_ucmodule}_FOUND) + message(FATAL_ERROR "Can not use \"${_module}\" module which has not yet been found.") + endif() + set(_targetPrefix QT_Q${_ucmodule}) + else() + if (NOT QT_QT${_ucmodule}_FOUND) + message(FATAL_ERROR "Can not use \"${_module}\" module which has not yet been found.") + endif() + if ("${_ucmodule}" STREQUAL "MAIN") + message(FATAL_ERROR "Can not use \"${_module}\" module with qt4_use_modules.") + endif() + endif() + target_link_libraries(${_target} ${link_type} ${${_targetPrefix}_LIBRARIES}) + set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES ${${_targetPrefix}_INCLUDE_DIR} ${QT_HEADERS_DIR} ${QT_MKSPECS_DIR}/default) + set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS ${${_targetPrefix}_COMPILE_DEFINITIONS}) + endforeach() +endfunction() - list(REMOVE_DUPLICATES QUASSEL_QT_LIBRARIES) - list(REMOVE_DUPLICATES QUASSEL_QT_INCLUDES) - list(REMOVE_DUPLICATES QUASSEL_QT_DEFINITIONS) +# Qt 5.11 removed the qt5_use_modules function, so we need to provide it until we can switch to a modern CMake version. +# If present, the Qt-provided version will be used automatically instead. +function(qt5_use_modules _target _link_type) + if (NOT TARGET ${_target}) + message(FATAL_ERROR "The first argument to qt5_use_modules must be an existing target.") + endif() + if ("${_link_type}" STREQUAL "LINK_PUBLIC" OR "${_link_type}" STREQUAL "LINK_PRIVATE" ) + set(_qt5_modules ${ARGN}) + set(_qt5_link_type ${_link_type}) + else() + set(_qt5_modules ${_link_type} ${ARGN}) + endif() - # The COMPILE_FLAGS property expects a string, not a list... - set(QUASSEL_QT_COMPILEFLAGS ) - foreach(flag ${QUASSEL_QT_DEFINITIONS}) - set(QUASSEL_QT_COMPILEFLAGS "${QUASSEL_QT_COMPILEFLAGS} ${flag}") - endforeach(flag) + if ("${_qt5_modules}" STREQUAL "") + message(FATAL_ERROR "qt5_use_modules requires at least one Qt module to use.") + endif() + foreach(_module ${_qt5_modules}) + if (NOT Qt5${_module}_FOUND) + find_package(Qt5${_module} PATHS "${_Qt5_COMPONENT_PATH}" NO_DEFAULT_PATH) + if (NOT Qt5${_module}_FOUND) + message(FATAL_ERROR "Can not use \"${_module}\" module which has not yet been found.") + endif() + endif() + target_link_libraries(${_target} ${_qt5_link_type} ${Qt5${_module}_LIBRARIES}) + set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES ${Qt5${_module}_INCLUDE_DIRS}) + set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS ${Qt5${_module}_COMPILE_DEFINITIONS}) + if (Qt5_POSITION_INDEPENDENT_CODE + AND (CMAKE_VERSION VERSION_LESS 2.8.12 + AND (NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU" + OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0))) + set_property(TARGET ${_target} PROPERTY POSITION_INDEPENDENT_CODE ${Qt5_POSITION_INDEPENDENT_CODE}) + endif() + endforeach() +endfunction() -endmacro(setup_qt_variables) +# Some wrappers for simplifying dual-Qt support + +function(qt_use_modules) + if (USE_QT5) + qt5_use_modules(${ARGN}) + else() + qt4_use_modules(${ARGN}) + endif() +endfunction() + +function(qt_wrap_ui _var) + if (USE_QT5) + qt5_wrap_ui(var ${ARGN}) + else() + qt4_wrap_ui(var ${ARGN}) + endif() + set(${_var} ${${_var}} ${var} PARENT_SCOPE) +endfunction() + +function(qt_add_resources _var) + if (USE_QT5) + qt5_add_resources(var ${ARGN}) + else() + qt4_add_resources(var ${ARGN}) + endif() + set(${_var} ${${_var}} ${var} PARENT_SCOPE) +endfunction() + +function(qt_add_dbus_interface _var) + if (USE_QT5) + qt5_add_dbus_interface(var ${ARGN}) + else() + qt4_add_dbus_interface(var ${ARGN}) + endif() + set(${_var} ${${_var}} ${var} PARENT_SCOPE) +endfunction() + +function(qt_add_dbus_adaptor _var) + if (USE_QT5) + qt5_add_dbus_adaptor(var ${ARGN}) + else() + qt4_add_dbus_adaptor(var ${ARGN}) + endif() + set(${_var} ${${_var}} ${var} PARENT_SCOPE) +endfunction() + +###################################### +# Macros for dealing with translations +###################################### # This generates a .ts from a .po file macro(generate_ts outvar basename) @@ -50,7 +144,7 @@ macro(generate_ts outvar basename) # This is a workaround to add (duplicate) strings that lconvert missed to the .ts COMMAND ${QT_LUPDATE_EXECUTABLE} ARGS -silent - ${CMAKE_SOURCE_DIR}/src/ + ${CMAKE_SOURCE_DIR}/src/ -ts ${output} DEPENDS ${basename}.po) set(${outvar} ${output})