From 5fc2882ac5062ec5a8b6f3da626d4d767473c16b Mon Sep 17 00:00:00 2001 From: Christophe Giboudeaux Date: Wed, 15 Jan 2020 23:01:16 +0100 Subject: Add INSTALL_MKSPECSDIR to the install locations Linux distributions may want to install mkspecs files into a different subdir in order to make Qt6 co-installable with older versions. Contributes to QTBUG-81289 Change-Id: Ie4a64370d742948d5ca4f2eaed6ea550d2676707 Reviewed-by: Qt CMake Build Bot Reviewed-by: Christophe Giboudeaux Reviewed-by: Alexandru Croitor --- CMakeLists.txt | 11 ++++++++--- cmake/QtBaseGlobalTargets.cmake | 4 ++-- cmake/QtBuild.cmake | 30 ++++++++++++++++++++++-------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d7874e891a..cb41b25406 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,11 +79,16 @@ if(NOT QT_BUILD_STANDALONE_TESTS) endif() # As long as we use the mkspecs (for qplatformdefs.h), we need to always # install it, especially when cross-compiling. - set(mkspecs_install_dir "${INSTALL_DATADIR}") + set(mkspecs_install_dir "${INSTALL_MKSPECSDIR}") qt_path_join(mkspecs_install_dir ${QT_INSTALL_DIR} ${mkspecs_install_dir}) - qt_copy_or_install(DIRECTORY "${PROJECT_SOURCE_DIR}/mkspecs" - DESTINATION ${mkspecs_install_dir}) + file(GLOB mkspecs_subdirs + LIST_DIRECTORIES TRUE + "${PROJECT_SOURCE_DIR}/mkspecs/*") + foreach(directory IN LISTS mkspecs_subdirs) + qt_copy_or_install(DIRECTORY "${directory}" + DESTINATION ${mkspecs_install_dir}) + endforeach() endif() qt_build_repo_end() diff --git a/cmake/QtBaseGlobalTargets.cmake b/cmake/QtBaseGlobalTargets.cmake index 9274512577..a68540d1e2 100644 --- a/cmake/QtBaseGlobalTargets.cmake +++ b/cmake/QtBaseGlobalTargets.cmake @@ -3,9 +3,9 @@ add_library(Platform INTERFACE) add_library(Qt::Platform ALIAS Platform) target_include_directories(Platform INTERFACE - $ + $ $ - $ + $ $ ) target_compile_definitions(Platform INTERFACE ${QT_PLATFORM_DEFINITIONS}) diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index 057048582e..459c637ca8 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -4,6 +4,7 @@ include(CMakePackageConfigHelpers) set(INSTALL_BINDIR "bin" CACHE STRING "Executables [PREFIX/bin]") set(INSTALL_INCLUDEDIR "include" CACHE STRING "Header files [PREFIX/include]") set(INSTALL_LIBDIR "lib" CACHE STRING "Libraries [PREFIX/lib]") +set(INSTALL_MKSPECSDIR "mkspecs" CACHE STRING "Mkspecs files [PREFIX/mkspecs]") set(INSTALL_ARCHDATADIR "." CACHE STRING "Arch-dependent data [PREFIX]") set(INSTALL_PLUGINSDIR "${INSTALL_ARCHDATADIR}/plugins" CACHE STRING "Plugins [ARCHDATADIR/plugins]") @@ -56,7 +57,7 @@ if(NOT QT_MKSPECS_DIR) get_filename_component(QT_MKSPECS_DIR "${CMAKE_CURRENT_LIST_DIR}/../mkspecs" ABSOLUTE) else() # We can rely on CMAKE_INSTALL_PREFIX being set by QtBuildInternalsExtra.cmake - get_filename_component(QT_MKSPECS_DIR "${CMAKE_INSTALL_PREFIX}/mkspecs" ABSOLUTE) + get_filename_component(QT_MKSPECS_DIR "${CMAKE_INSTALL_PREFIX}/${INSTALL_MKSPECSDIR}" ABSOLUTE) endif() set(QT_MKSPECS_DIR "${QT_MKSPECS_DIR}" CACHE INTERNAL "") endif() @@ -145,8 +146,19 @@ endif() # TODO: Fixme to be correct. set(QT_QMAKE_HOST_MKSPEC "${QT_QMAKE_TARGET_MKSPEC}") -if(QT_QMAKE_TARGET_MKSPEC) - set(QT_DEFAULT_PLATFORM_DEFINITION_DIR mkspecs/${QT_QMAKE_TARGET_MKSPEC}) +# Platform definition dir provided by user on command line. +# Derive the absolute one relative to the current source dir. +if(QT_PLATFORM_DEFINITION_DIR) + set(QT_DEFAULT_PLATFORM_DEFINITION_DIR "${QT_PLATFORM_DEFINITION_DIR}") + get_filename_component( + QT_DEFAULT_PLATFORM_DEFINITION_DIR_ABSOLUTE + "${QT_PLATFORM_DEFINITION_DIR}" + ABSOLUTE) +elseif(QT_QMAKE_TARGET_MKSPEC) + # Used by consumers of prefix builds via INSTALL_INTERFACE (relative path). + set(QT_DEFAULT_PLATFORM_DEFINITION_DIR "${INSTALL_MKSPECSDIR}/${QT_QMAKE_TARGET_MKSPEC}") + # Used by qtbase itself and consumers of non-prefix builds via BUILD_INTERFACE (absolute path). + set(QT_DEFAULT_PLATFORM_DEFINITION_DIR_ABSOLUTE "${QT_MKSPECS_DIR}/${QT_QMAKE_TARGET_MKSPEC}") endif() if(NOT DEFINED QT_DEFAULT_PLATFORM_DEFINITIONS) @@ -155,8 +167,10 @@ endif() set(QT_PLATFORM_DEFINITIONS ${QT_DEFAULT_PLATFORM_DEFINITIONS} CACHE STRING "Qt platform specific pre-processor defines") -set(QT_PLATFORM_DEFINITION_DIR ${QT_DEFAULT_PLATFORM_DEFINITION_DIR} +set(QT_PLATFORM_DEFINITION_DIR "${QT_DEFAULT_PLATFORM_DEFINITION_DIR}" CACHE PATH "Path to directory that contains qplatformdefs.h") +set(QT_PLATFORM_DEFINITION_DIR_ABSOLUTE "${QT_DEFAULT_PLATFORM_DEFINITION_DIR_ABSOLUTE}" + CACHE INTERNAL "Path to directory that contains qplatformdefs.h") set(QT_NAMESPACE "" CACHE STRING "Qt Namespace") if(QT_NAMESPACE STREQUAL "") set(QT_HAS_NAMESPACE OFF) @@ -574,7 +588,7 @@ QT.${module_lower}_private.disabled_features = ${disabled_private_features} endfunction() function(qt_generate_global_config_pri_file) - qt_path_join(qconfig_pri_target_path ${PROJECT_BINARY_DIR} mkspecs) + qt_path_join(qconfig_pri_target_path ${PROJECT_BINARY_DIR} ${INSTALL_MKSPECSDIR}) qt_path_join(qconfig_pri_target_path "${qconfig_pri_target_path}" "qconfig.pri") get_target_property(enabled_features GlobalConfig INTERFACE_QT_ENABLED_PUBLIC_FEATURES) @@ -626,7 +640,7 @@ CONFIG -= link_prl # we do not create prl files right now CONFIG += ${config_entries} " ) - qt_install(FILES "${qconfig_pri_target_path}" DESTINATION mkspecs) + qt_install(FILES "${qconfig_pri_target_path}" DESTINATION ${INSTALL_MKSPECSDIR}) endfunction() # Takes a list of path components and joins them into one path separated by forward slashes "/", @@ -1899,14 +1913,14 @@ set(QT_CMAKE_EXPORT_NAMESPACE ${QT_CMAKE_EXPORT_NAMESPACE})") unset(arg_INTERNAL_MODULE) endif() - qt_path_join(pri_target_path ${PROJECT_BINARY_DIR} mkspecs/modules) + qt_path_join(pri_target_path ${PROJECT_BINARY_DIR} ${INSTALL_MKSPECSDIR}/modules) qt_generate_module_pri_file("${target}" "${pri_target_path}" module_pri_files ${arg_INTERNAL_MODULE} ${header_module} QMAKE_MODULE_CONFIG ${arg_QMAKE_MODULE_CONFIG} ) - qt_install(FILES "${module_pri_files}" DESTINATION mkspecs/modules) + qt_install(FILES "${module_pri_files}" DESTINATION ${INSTALL_MKSPECSDIR}/modules) ### fixme: cmake is missing a built-in variable for this. We want to apply it only to modules and plugins # that belong to Qt. -- cgit v1.2.3