summaryrefslogtreecommitdiffstats
path: root/cmake/QtQmakeHelpers.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/QtQmakeHelpers.cmake')
-rw-r--r--cmake/QtQmakeHelpers.cmake208
1 files changed, 208 insertions, 0 deletions
diff --git a/cmake/QtQmakeHelpers.cmake b/cmake/QtQmakeHelpers.cmake
new file mode 100644
index 0000000000..ce1f96efd9
--- /dev/null
+++ b/cmake/QtQmakeHelpers.cmake
@@ -0,0 +1,208 @@
+macro(qt_add_string_to_qconfig_cpp str)
+ string(LENGTH "${str}" length)
+ string(APPEND QT_CONFIG_STRS " \"${str}\\0\"\n")
+ string(APPEND QT_CONFIG_STR_OFFSETS " ${QT_CONFIG_STR_OFFSET},\n")
+ math(EXPR QT_CONFIG_STR_OFFSET "${QT_CONFIG_STR_OFFSET}+${length}+1")
+endmacro()
+
+function(qt_generate_qconfig_cpp)
+ set(QT_CONFIG_STR_OFFSET "0")
+ set(QT_CONFIG_STR_OFFSETS "")
+ set(QT_CONFIG_STRS "")
+
+ # Start first part.
+ qt_add_string_to_qconfig_cpp("${INSTALL_DOCDIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_INCLUDEDIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_LIBDIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_LIBEXECDIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_BINDIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_PLUGINSDIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_QMLDIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_ARCHDATADIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_DATADIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_TRANSLATIONSDIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_EXAMPLESDIR}")
+ qt_add_string_to_qconfig_cpp("${INSTALL_TESTSDIR}")
+
+ # Save first part.
+ set(QT_CONFIG_STR_OFFSETS_FIRST "${QT_CONFIG_STR_OFFSETS}")
+ set(QT_CONFIG_STRS_FIRST "${QT_CONFIG_STRS}")
+
+ # Start second part.
+ set(QT_CONFIG_STR_OFFSETS "")
+ set(QT_CONFIG_STRS "")
+
+ qt_add_string_to_qconfig_cpp("") # config.input.sysroot
+ qt_add_string_to_qconfig_cpp("false") # qmake_sysrootify
+ qt_add_string_to_qconfig_cpp("${INSTALL_BINDIR}") # TODO: Host-specific
+ qt_add_string_to_qconfig_cpp("${INSTALL_LIBDIR}") # TODO: Host-specific
+ qt_add_string_to_qconfig_cpp("${INSTALL_DATADIR}") # TODO: Host-specific
+ qt_add_string_to_qconfig_cpp("${QT_QMAKE_TARGET_MKSPEC}")
+ qt_add_string_to_qconfig_cpp("${QT_QMAKE_HOST_MKSPEC}")
+
+ # Save second part.
+ set(QT_CONFIG_STR_OFFSETS_SECOND "${QT_CONFIG_STR_OFFSETS}")
+ set(QT_CONFIG_STRS_SECOND "${QT_CONFIG_STRS}")
+
+ # Settings path / sysconf dir.
+ set(QT_SYS_CONF_DIR "${INSTALL_SYSCONFDIR}")
+
+ # Compute and set relocation prefixes.
+ # TODO: Clean this up, there's a bunch of unrealistic assumptions here.
+ # See qtConfOutput_preparePaths in qtbase/configure.pri.
+ if(WIN32)
+ set(lib_location_absolute_path
+ "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}/${INSTALL_BINDIR}")
+ else()
+ set(lib_location_absolute_path
+ "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}/${INSTALL_LIBDIR}")
+ endif()
+ file(RELATIVE_PATH from_lib_location_to_prefix
+ "${lib_location_absolute_path}" "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}")
+ set(QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH "${from_lib_location_to_prefix}")
+
+ # The QT_CONFIGURE_HOSTBINDIR_TO_*PREFIX_PATH defines are exclusively used by qmake to determine
+ # the prefix from the location of the qmake executable. In our build of qmake host_prefix is
+ # always the same as ext_prefix, and we can just use CMAKE_INSTALL_PREFIX for the calculation of
+ # the relative path between <ext_prefix>/bin and <ext_prefix>.
+ set(bin_dir_absolute_path "${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}")
+ file(RELATIVE_PATH from_bin_dir_to_prefix "${bin_dir_absolute_path}" "${CMAKE_INSTALL_PREFIX}")
+ set(QT_CONFIGURE_HOSTBINDIR_TO_HOSTPREFIX_PATH "${from_bin_dir_to_prefix}")
+ set(QT_CONFIGURE_HOSTBINDIR_TO_EXTPREFIX_PATH "${from_bin_dir_to_prefix}")
+
+ configure_file(global/qconfig.cpp.in global/qconfig.cpp @ONLY)
+endfunction()
+
+# In the cross-compiling case, creates a wrapper around the host Qt's
+# qmake executable. Also creates a qmake configuration file that sets
+# up the host qmake's properties for cross-compiling with this Qt
+# build.
+function(qt_generate_qmake_wrapper_for_target)
+ if(NOT CMAKE_CROSSCOMPILING)
+ return()
+ endif()
+
+ # Call the configuration file something else but qt.conf to avoid
+ # being picked up by the qmake executable that's created if
+ # QT_BUILD_TOOLS_WHEN_CROSSCOMPILING is enabled.
+ qt_path_join(qt_conf_path "${INSTALL_BINDIR}" "target_qt.conf")
+
+ set(prefix "${CMAKE_INSTALL_PREFIX}")
+ set(ext_prefix "${QT_STAGING_PREFIX}")
+ set(host_prefix "${QT_HOST_PATH}")
+ file(RELATIVE_PATH host_prefix_relative_to_conf_file "${ext_prefix}/${INSTALL_BINDIR}"
+ "${host_prefix}")
+ file(RELATIVE_PATH ext_prefix_relative_to_conf_file "${ext_prefix}/${INSTALL_BINDIR}"
+ "${ext_prefix}")
+ file(RELATIVE_PATH ext_prefix_relative_to_host_prefix "${host_prefix}" "${ext_prefix}")
+
+ set(content "")
+ if(ext_prefix STREQUAL prefix)
+ set(sysrootify_prefix true)
+ else()
+ set(sysrootify_prefix false)
+ string(APPEND content "[DevicePaths]
+Prefix=${prefix}
+")
+ endif()
+
+ if(NOT QT_WILL_INSTALL)
+ # The shadow build directory of a non-prefix build does not contain a copy of the mkspecs
+ # directory. Let $$[QT_HOST_DATA/src] point to the qtbase source directory.
+ string(APPEND content "[EffectiveSourcePaths]
+HostData=${CMAKE_CURRENT_SOURCE_DIR}
+")
+
+ # Set $$[QT_HOST_DATA/get] to avoid falling back to the source dir where it isn't explicitly
+ # requested.
+ # Also make sure to specif the Prefix as well, because it doesn't get inherited from the
+ # [Paths] section.
+ string(APPEND content "[EffectivePaths]
+HostData=${ext_prefix}
+Prefix=${ext_prefix_relative_to_conf_file}
+")
+ endif()
+
+ # On Android CMAKE_SYSROOT is set, but for Qt's purposes it should not be set, because then
+ # qmake generates incorrect Qt module include flags (among other things). Do the same for darwin
+ # cross-compilation.
+ set(sysroot "")
+ if(CMAKE_SYSROOT AND NOT ANDROID AND NOT UIKIT)
+ set(sysroot "${CMAKE_SYSROOT}")
+ endif()
+
+ string(APPEND content
+ "[Paths]
+Prefix=${ext_prefix_relative_to_conf_file}
+HostPrefix=${host_prefix_relative_to_conf_file}
+HostData=${ext_prefix_relative_to_host_prefix}
+Sysroot=${sysroot}
+SysrootifyPrefix=${sysrootify_prefix}
+TargetSpec=${QT_QMAKE_TARGET_MKSPEC}
+HostSpec=${QT_QMAKE_HOST_MKSPEC}
+")
+ file(GENERATE OUTPUT "${qt_conf_path}" CONTENT "${content}")
+
+ qt_path_join(qmake_wrapper_in_file "${CMAKE_CURRENT_SOURCE_DIR}/bin/qmake-wrapper-for-target")
+ qt_path_join(qmake_wrapper "preliminary" "qmake")
+ if(QT_BUILD_TOOLS_WHEN_CROSSCOMPILING)
+ # Avoid collisions with the cross-compiled qmake binary.
+ string(PREPEND qmake_wrapper "host-")
+ endif()
+ if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
+ string(APPEND qmake_wrapper_in_file ".bat")
+ string(APPEND qmake_wrapper ".bat")
+ endif()
+ string(APPEND qmake_wrapper_in_file ".in")
+
+ set(host_qt_bindir "${host_prefix}/${QT${PROJECT_VERSION_MAJOR}_HOST_INFO_BINDIR}")
+
+ configure_file("${qmake_wrapper_in_file}" "${qmake_wrapper}" @ONLY)
+ qt_install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${qt_conf_path}"
+ DESTINATION "${INSTALL_BINDIR}")
+ qt_copy_or_install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/${qmake_wrapper}"
+ DESTINATION "${INSTALL_BINDIR}")
+endfunction()
+
+# Transforms a CMake Qt module name to a qmake Qt module name.
+# Example: Qt6FooPrivate becomes foo_private
+function(qt_get_qmake_module_name result module)
+ string(REGEX REPLACE "^Qt6" "" module "${module}")
+ string(REGEX REPLACE "Private$" "_private" module "${module}")
+ string(REGEX REPLACE "Qpa$" "_qpa_lib_private" module "${module}")
+ string(TOLOWER "${module}" module)
+ set(${result} ${module} PARENT_SCOPE)
+endfunction()
+
+function(qt_cmake_build_type_to_qmake_build_config out_var build_type)
+ if(build_type STREQUAL "Debug")
+ set(cfg debug)
+ else()
+ set(cfg release)
+ endif()
+ set(${out_var} ${cfg} PARENT_SCOPE)
+endfunction()
+
+function(qt_guess_qmake_build_config out_var)
+ if(QT_GENERATOR_IS_MULTI_CONFIG)
+ unset(cfg)
+ foreach(config_type ${CMAKE_CONFIGURATION_TYPES})
+ qt_cmake_build_type_to_qmake_build_config(tmp ${config_type})
+ list(APPEND cfg ${tmp})
+ endforeach()
+ if(cfg)
+ list(REMOVE_DUPLICATES cfg)
+ else()
+ set(cfg debug)
+ endif()
+ else()
+ qt_cmake_build_type_to_qmake_build_config(cfg ${CMAKE_BUILD_TYPE})
+ endif()
+ set(${out_var} ${cfg} PARENT_SCOPE)
+endfunction()
+
+macro(qt_add_qmake_lib_dependency lib dep)
+ string(REPLACE "-" "_" dep ${dep})
+ string(TOUPPER "${dep}" ucdep)
+ list(APPEND QT_QMAKE_LIB_DEPS_${lib} ${ucdep})
+endmacro()