summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandru Croitor <alexandru.croitor@qt.io>2019-08-28 15:15:50 +0200
committerJoerg Bornemann <joerg.bornemann@qt.io>2020-04-17 20:42:18 +0200
commit59756b7183e9c35f862f957d709b9c8eab673f23 (patch)
tree4f853adce2c58ad2ad1f0905bee47c9758cbbb4b
parentbfcf36d459c7a36a92dd6f9127e6513f7a08277e (diff)
CMake: Generate qmake pri information for building with qmake
Implemented some necessary functionality to generate correct .pri information, so that qmake can build modules. Task-number: QTBUG-75666 Change-Id: I63281adfef3d01385928b1d8c4be0b32ac97c4d7 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
-rw-r--r--cmake/QtBaseGlobalTargets.cmake2
-rw-r--r--cmake/QtBuild.cmake170
2 files changed, 161 insertions, 11 deletions
diff --git a/cmake/QtBaseGlobalTargets.cmake b/cmake/QtBaseGlobalTargets.cmake
index 9cd3ad72cb..ddee9c63c2 100644
--- a/cmake/QtBaseGlobalTargets.cmake
+++ b/cmake/QtBaseGlobalTargets.cmake
@@ -240,6 +240,8 @@ endif()
qt_feature_module_end(GlobalConfig OUT_VAR_PREFIX "__GlobalConfig_")
qt_generate_global_config_pri_file()
+qt_generate_global_module_pri_file()
+qt_generate_qt_conf()
add_library(Qt::GlobalConfig ALIAS GlobalConfig)
diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake
index f2a22c50b8..bb3a747734 100644
--- a/cmake/QtBuild.cmake
+++ b/cmake/QtBuild.cmake
@@ -566,6 +566,10 @@ function(qt_generate_module_pri_file target target_path config_module_name pri_f
"${property_prefix}QT_ENABLED_PRIVATE_FEATURES")
get_target_property(disabled_private_features "${target}"
"${property_prefix}QT_DISABLED_PRIVATE_FEATURES")
+ qt_correct_features(enabled_features "${enabled_features}")
+ qt_correct_features(disabled_features "${disabled_features}")
+ qt_correct_features(enabled_private_features "${enabled_private_features}")
+ qt_correct_features(disabled_private_features "${disabled_private_features}")
foreach(var enabled_features disabled_features enabled_private_features disabled_private_features)
if(${var} STREQUAL "${var}-NOTFOUND")
@@ -575,11 +579,31 @@ function(qt_generate_module_pri_file target target_path config_module_name pri_f
endif()
endforeach()
+ set(module_internal_config v2)
+ if(NOT QT_FEATURE_shared)
+ list(APPEND module_internal_config staticlib)
+ endif()
+ if(arg_INTERNAL_MODULE)
+ list(APPEND module_internal_config internal_module)
+ endif()
+
+ get_target_property(target_type ${target} TYPE)
+ if (NOT target_type STREQUAL "INTERFACE_LIBRARY")
+ get_target_property(is_fw ${target} FRAMEWORK)
+ if(is_fw)
+ list(APPEND module_internal_config lib_bundle)
+ endif()
+ endif()
+
+ # TODO: Add the value 'ltcg' to module_internal_config if LTCG is turned on.
+
+ list(JOIN module_internal_config " " joined_module_internal_config)
+
if(arg_QMAKE_MODULE_CONFIG)
- string(REPLACE ";" " " module_config "${arg_QMAKE_MODULE_CONFIG}")
- set(module_config "\nQT.${module_config_name}.CONFIG = ${module_config}")
+ string(REPLACE ";" " " module_build_config "${arg_QMAKE_MODULE_CONFIG}")
+ set(module_build_config "\nQT.${config_module_name}.CONFIG = ${module_build_config}")
else()
- set(module_config "")
+ set(module_build_config "")
endif()
if (NOT ${arg_INTERNAL_MODULE})
@@ -598,10 +622,10 @@ QT.${config_module_name}.frameworks =
QT.${config_module_name}.bins = $$QT_MODULE_BIN_BASE
QT.${config_module_name}.depends =
QT.${config_module_name}.uses =
-QT.${config_module_name}.module_config = v2
+QT.${config_module_name}.module_config = ${joined_module_internal_config}
QT.${config_module_name}.DEFINES = QT_${module_define}_LIB
QT.${config_module_name}.enabled_features = ${enabled_features}
-QT.${config_module_name}.disabled_features = ${disabled_features}${module_config}
+QT.${config_module_name}.disabled_features = ${disabled_features}${module_build_config}
QT_MODULES += ${config_module_name}
"
)
@@ -621,7 +645,7 @@ QT.${config_module_name}_private.includes = $$QT_MODULE_INCLUDE_BASE/${module}/$
QT.${config_module_name}_private.frameworks =
QT.${config_module_name}_private.depends = ${config_module_name}
QT.${config_module_name}_private.uses =
-QT.${config_module_name}_private.module_config = v2
+QT.${config_module_name}_private.module_config = ${joined_module_internal_config}
QT.${config_module_name}_private.enabled_features = ${enabled_private_features}
QT.${config_module_name}_private.disabled_features = ${disabled_private_features}
"
@@ -630,6 +654,59 @@ QT.${config_module_name}_private.disabled_features = ${disabled_private_features
set("${pri_files_var}" "${pri_files}" 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()
+
+function(qt_correct_features out_var features)
+ set(corrected_features "")
+ foreach(feature ${features})
+ get_property(feature_original_name GLOBAL PROPERTY "QT_FEATURE_ORIGINAL_NAME_${feature}")
+ list(APPEND corrected_features "${feature_original_name}")
+ endforeach()
+ set(${out_var} ${corrected_features} PARENT_SCOPE)
+endfunction()
+
+# Get original names for config values (which correspond to feature names) and use them if they
+# exist, otherwise just use the config value (which might be the case when a config value has
+# a custom name).
+function(qt_correct_config out_var config)
+ set(corrected_config "")
+ foreach(name ${config})
+ get_property(feature_original_name GLOBAL PROPERTY "QT_FEATURE_ORIGINAL_NAME_${name}")
+ if(feature_original_name)
+ list(APPEND corrected_config "${feature_original_name}")
+ else()
+ list(APPEND corrected_config "${name}")
+ endif()
+ endforeach()
+ set(${out_var} ${corrected_config} PARENT_SCOPE)
+endfunction()
+
+# Creates mkspecs/qconfig.pri which contains public global features among other things.
function(qt_generate_global_config_pri_file)
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")
@@ -637,8 +714,11 @@ function(qt_generate_global_config_pri_file)
get_target_property(enabled_features GlobalConfig INTERFACE_QT_ENABLED_PUBLIC_FEATURES)
get_target_property(disabled_features GlobalConfig INTERFACE_QT_DISABLED_PUBLIC_FEATURES)
- string (REPLACE ";" " " enabled_features "${enabled_features}")
- string (REPLACE ";" " " disabled_features "${disabled_features}")
+ qt_correct_features(corrected_enabled_features "${enabled_features}")
+ qt_correct_features(corrected_disabled_features "${disabled_features}")
+
+ string (REPLACE ";" " " corrected_enabled_features "${corrected_enabled_features}")
+ string (REPLACE ";" " " corrected_disabled_features "${corrected_disabled_features}")
# Add some required CONFIG entries.
set(config_entries "")
@@ -650,23 +730,87 @@ function(qt_generate_global_config_pri_file)
list(APPEND config_entries "${qt_build_config_type}")
string (REPLACE ";" " " config_entries "${config_entries}")
+ get_target_property(public_config GlobalConfig INTERFACE_QT_QMAKE_PUBLIC_CONFIG)
+ get_target_property(qt_public_config GlobalConfig INTERFACE_QT_QMAKE_PUBLIC_QT_CONFIG)
+ qt_correct_config(corrected_public_config "${public_config}")
+ qt_correct_config(corrected_qt_public_config "${qt_public_config}")
+ qt_guess_qmake_build_config(qmake_build_config)
+ list(APPEND corrected_qt_public_config ${qmake_build_config})
+
+ list(JOIN corrected_public_config " " public_config_joined)
+ list(JOIN corrected_qt_public_config " " qt_public_config_joined)
+
file(GENERATE
OUTPUT "${qconfig_pri_target_path}"
CONTENT
"QT_ARCH = ${TEST_architecture_arch}
QT_BUILDABI = ${TEST_buildAbi}
-QT.global.enabled_features = ${enabled_features}
-QT.global.disabled_features = ${disabled_features}
+QT.global.enabled_features = ${corrected_enabled_features}
+QT.global.disabled_features = ${corrected_disabled_features}
+QT.global.disabled_features += release build_all
+QT_CONFIG += ${qt_public_config_joined}
+CONFIG += ${config_entries} ${public_config_joined}
QT_VERSION = ${PROJECT_VERSION}
QT_MAJOR_VERSION = ${PROJECT_VERSION_MAJOR}
QT_MINOR_VERSION = ${PROJECT_VERSION_MINOR}
QT_PATCH_VERSION = ${PROJECT_VERSION_PATCH}
-CONFIG += ${config_entries}
"
)
qt_install(FILES "${qconfig_pri_target_path}" DESTINATION ${INSTALL_MKSPECSDIR})
endfunction()
+# Creates mkspecs/qmodule.pri which contains private global features among other things.
+function(qt_generate_global_module_pri_file)
+ qt_path_join(qmodule_pri_target_path ${PROJECT_BINARY_DIR} mkspecs)
+ qt_path_join(qmodule_pri_target_path "${qmodule_pri_target_path}" "qmodule.pri")
+
+ get_target_property(enabled_features GlobalConfig INTERFACE_QT_ENABLED_PRIVATE_FEATURES)
+ get_target_property(disabled_features GlobalConfig INTERFACE_QT_DISABLED_PRIVATE_FEATURES)
+
+ qt_correct_features(corrected_enabled_features "${enabled_features}")
+ qt_correct_features(corrected_disabled_features "${disabled_features}")
+
+ string (REPLACE ";" " " corrected_enabled_features "${corrected_enabled_features}")
+ string (REPLACE ";" " " corrected_disabled_features "${corrected_disabled_features}")
+
+ set(corrected_private_config "")
+ get_target_property(private_config GlobalConfig INTERFACE_QT_QMAKE_PRIVATE_CONFIG)
+ qt_correct_config(corrected_private_config "${private_config}")
+ list(JOIN corrected_private_config " " private_config_joined)
+
+ file(GENERATE
+ OUTPUT "${qmodule_pri_target_path}"
+ CONTENT
+ "QT.global_private.enabled_features = ${corrected_enabled_features}
+QT.global_private.disabled_features = ${corrected_disabled_features}
+CONFIG += ${private_config_joined}
+"
+ )
+ qt_install(FILES "${qmodule_pri_target_path}" DESTINATION mkspecs)
+endfunction()
+
+function(qt_generate_qt_conf)
+ qt_path_join(qt_conf__path ${PROJECT_BINARY_DIR} "bin" "qt.conf")
+
+ file(GENERATE
+ OUTPUT "${qt_conf__path}"
+ CONTENT
+ "[EffectivePaths]
+Prefix=..
+[DevicePaths]
+Prefix=${CMAKE_INSTALL_PREFIX}
+[Paths]
+Prefix=${CMAKE_INSTALL_PREFIX}
+HostPrefix=${CMAKE_INSTALL_PREFIX}
+Sysroot=
+SysrootifyPrefix=false
+TargetSpec=${QT_QMAKE_TARGET_MKSPEC}
+HostSpec=${QT_QMAKE_HOST_MKSPEC}
+[EffectiveSourcePaths]
+Prefix=${CMAKE_SOURCE_DIR}
+")
+endfunction()
+
# Takes a list of path components and joins them into one path separated by forward slashes "/",
# and saves the path in out_var.
function(qt_path_join out_var)
@@ -815,6 +959,10 @@ function(qt_ensure_sync_qt)
qt_path_join(syncqt_install_dir ${QT_INSTALL_DIR} ${INSTALL_LIBEXECDIR})
qt_copy_or_install(PROGRAMS "${SYNCQT_FROM_SOURCE}"
DESTINATION "${syncqt_install_dir}")
+
+ qt_path_join(syncqt_install_dir ${QT_INSTALL_DIR} ${INSTALL_BINDIR})
+ qt_copy_or_install(PROGRAMS "${SYNCQT_FROM_SOURCE}"
+ DESTINATION "${syncqt_install_dir}")
elseif(QT_HOST_PATH)
get_filename_component(syncqt_absolute_path
"${QT_HOST_PATH}/${INSTALL_LIBEXECDIR}/syncqt.pl"