From d9e9db65a3ed563da773d1264897f1136f26a747 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Wed, 19 Feb 2025 15:31:40 +0100 Subject: [PATCH] configure: Make it easier to translate arguments to CMake variables To add a configure argument that is translated to a CMake variable, one can now use in qt_cmdline.cmake files: qt_commandline_option(foo TYPE boolean CMAKE_VARIABLE QT_FOO ) It's not necessary anymore to add a translate_boolean_input call to QtProcessConfigureArgs.cmake. This is especially useful if a non-qtbase module wants to add such configure arguments. This patch adds the CMAKE_VARIABLE argument for configure options of TYPE boolean and string. An attempt to use CMAKE_VARIABLE with other types will result in an error. Task-number: QTBUG-123064 Change-Id: I4c341e57993b729d08327cea57cf7c8a05c96c0e Reviewed-by: Alexey Edelev --- cmake/QtProcessConfigureArgs.cmake | 62 +++++++++++++++--------------- qt_cmdline.cmake | 59 ++++++++++++++++++++-------- src/gui/qt_cmdline.cmake | 6 ++- 3 files changed, 79 insertions(+), 48 deletions(-) diff --git a/cmake/QtProcessConfigureArgs.cmake b/cmake/QtProcessConfigureArgs.cmake index 4dab078cd47..44761e9bea9 100644 --- a/cmake/QtProcessConfigureArgs.cmake +++ b/cmake/QtProcessConfigureArgs.cmake @@ -288,7 +288,7 @@ endmacro() function(qt_commandline_option name) set(options CONTROLS_FEATURE) - set(oneValueArgs TYPE NAME VALUE) + set(oneValueArgs TYPE NAME VALUE CMAKE_VARIABLE) set(multiValueArgs VALUES MAPPING) cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -299,6 +299,9 @@ function(qt_commandline_option name) set(input_name ${arg_NAME}) set(commandline_option_${name}_variable "${arg_NAME}" PARENT_SCOPE) endif() + if(DEFINED arg_CMAKE_VARIABLE) + set_property(GLOBAL PROPERTY INPUTCMAKEVAR_${input_name} "${arg_CMAKE_VARIABLE}") + endif() set(mapping_type "${arg_TYPE}") if(arg_CONTROLS_FEATURE) set(mapping_type "boolean") @@ -317,11 +320,13 @@ endfunction() # Add the common command line options for every qt repo. macro(qt_add_common_commandline_options) qt_commandline_option(headersclean TYPE boolean) - qt_commandline_option(sbom TYPE boolean) - qt_commandline_option(sbom-json TYPE boolean) - qt_commandline_option(sbom-json-required TYPE boolean) - qt_commandline_option(sbom-verify TYPE boolean) - qt_commandline_option(sbom-verify-required TYPE boolean) + qt_commandline_option(sbom TYPE boolean CMAKE_VARIABLE QT_GENERATE_SBOM) + qt_commandline_option(sbom-json TYPE boolean CMAKE_VARIABLE QT_SBOM_GENERATE_JSON) + qt_commandline_option(sbom-json-required TYPE boolean + CMAKE_VARIABLE QT_SBOM_REQUIRE_GENERATE_JSON + ) + qt_commandline_option(sbom-verify TYPE boolean CMAKE_VARIABLE QT_SBOM_VERIFY) + qt_commandline_option(sbom-verify-required TYPE boolean CMAKE_VARIABLE QT_SBOM_REQUIRE_VERIFY) endmacro() function(qt_commandline_prefix arg var) @@ -801,6 +806,7 @@ foreach(var ${config_inputs}) if("${commandline_input_${var}_type}" STREQUAL "") get_property(commandline_input_${var}_type GLOBAL PROPERTY INPUTTYPE_${var}) endif() + get_property(commandline_input_${var}_cmake_variable GLOBAL PROPERTY INPUTCMAKEVAR_${var}) endforeach() macro(drop_input name) @@ -842,6 +848,19 @@ macro(translate_list_input name cmake_var) endif() endmacro() +macro(translate_input name cmake_var) + if("${commandline_input_${name}_type}" STREQUAL "boolean") + translate_boolean_input(${name} ${cmake_var}) + elseif("${commandline_input_${name}_type}" STREQUAL "string") + translate_string_input(${name} ${cmake_var}) + else() + message(FATAL_ERROR + "translate_input cannot handle input '${name}' " + "of type '${commandline_input_${name}_type}'." + ) + endif() +endmacro() + # Check whether to guess the compiler for the given language. # # Sets ${out_var} to FALSE if one of the following holds: @@ -923,24 +942,16 @@ function(check_qt_build_parts type) set(cmake_args "${cmake_args}" PARENT_SCOPE) endfunction() +# Translate command line arguments that have CMAKE_VARIABLE set. +foreach(input IN LISTS config_inputs) + if(NOT "${commandline_input_${input}_cmake_variable}" STREQUAL "") + translate_input("${input}" "${commandline_input_${input}_cmake_variable}") + endif() +endforeach() + drop_input(commercial) drop_input(confirm-license) -translate_boolean_input(precompile_header BUILD_WITH_PCH) -translate_boolean_input(unity_build QT_UNITY_BUILD) -translate_string_input(unity_build_batch_size QT_UNITY_BUILD_BATCH_SIZE) -translate_boolean_input(ccache QT_USE_CCACHE) -translate_boolean_input(vcpkg QT_USE_VCPKG) -translate_boolean_input(sbom QT_GENERATE_SBOM) -translate_boolean_input(sbom-json QT_SBOM_GENERATE_JSON) -translate_boolean_input(sbom-json-required QT_SBOM_REQUIRE_GENERATE_JSON) -translate_boolean_input(sbom-verify QT_SBOM_VERIFY) -translate_boolean_input(sbom-verify-required QT_SBOM_REQUIRE_VERIFY) translate_boolean_input(shared BUILD_SHARED_LIBS) -translate_boolean_input(warnings_are_errors WARNINGS_ARE_ERRORS) -translate_boolean_input(qtinlinenamespace QT_INLINE_NAMESPACE) -translate_string_input(qt_namespace QT_NAMESPACE) -translate_string_input(qt_libinfix QT_LIBINFIX) -translate_string_input(qreal QT_COORD_TYPE) translate_path_input(prefix CMAKE_INSTALL_PREFIX) translate_path_input(extprefix CMAKE_STAGING_PREFIX) foreach(kind bin lib archdata libexec qml data doc sysconf examples tests) @@ -956,10 +967,7 @@ if(NOT "${INPUT_device}" STREQUAL "") push("-DQT_QMAKE_TARGET_MKSPEC=devices/${INPUT_device}") drop_input(device) endif() -translate_string_input(platform QT_QMAKE_TARGET_MKSPEC) -translate_string_input(xplatform QT_QMAKE_TARGET_MKSPEC) guess_compiler_from_mkspec() -translate_string_input(qpa_default_platform QT_QPA_DEFAULT_PLATFORM) translate_list_input(qpa_platforms QT_QPA_PLATFORMS) translate_path_input(android-sdk ANDROID_SDK_ROOT) @@ -975,14 +983,9 @@ if(DEFINED INPUT_android-abis) endif() translate_string_input(android-abis ANDROID_ABI) endif() -translate_string_input(android-javac-source QT_ANDROID_JAVAC_SOURCE) -translate_string_input(android-javac-target QT_ANDROID_JAVAC_TARGET) - -translate_string_input(sdk QT_APPLE_SDK) drop_input(make) drop_input(nomake) -translate_boolean_input(install-examples-sources QT_INSTALL_EXAMPLES_SOURCES) check_qt_build_parts(nomake) check_qt_build_parts(make) @@ -1048,7 +1051,6 @@ if("${INPUT_ltcg}" STREQUAL "yes") endif() translate_path_input(ffmpeg-dir FFMPEG_DIR) -translate_boolean_input(ffmpeg-deploy QT_DEPLOY_FFMPEG) translate_list_input(device-option QT_QMAKE_DEVICE_OPTIONS) translate_list_input(defines QT_EXTRA_DEFINES) diff --git a/qt_cmdline.cmake b/qt_cmdline.cmake index 191151535c5..e18b76f1845 100644 --- a/qt_cmdline.cmake +++ b/qt_cmdline.cmake @@ -34,18 +34,28 @@ qt_commandline_option(android-abis TYPE string) qt_commandline_option(android-ndk TYPE string) qt_commandline_option(android-ndk-platform TYPE string) qt_commandline_option(android-sdk TYPE string) -qt_commandline_option(android-javac-target TYPE string) -qt_commandline_option(android-javac-source TYPE string) +qt_commandline_option(android-javac-target + TYPE string + CMAKE_VARIABLE QT_ANDROID_JAVAC_TARGET +) +qt_commandline_option(android-javac-source + TYPE string + CMAKE_VARIABLE QT_ANDROID_JAVAC_SOURCE +) qt_commandline_option(android-style-assets TYPE boolean) qt_commandline_option(appstore-compliant TYPE boolean) qt_commandline_option(avx TYPE boolean) qt_commandline_option(avx2 TYPE boolean) qt_commandline_option(avx512 TYPE boolean NAME avx512f) qt_commandline_option(c++std TYPE cxxstd) -qt_commandline_option(unity-build TYPE boolean NAME unity_build) -qt_commandline_option(unity-build-batch-size TYPE string NAME unity_build_batch_size) -qt_commandline_option(ccache TYPE boolean NAME ccache) -qt_commandline_option(vcpkg TYPE boolean) +qt_commandline_option(unity-build TYPE boolean NAME unity_build CMAKE_VARIABLE QT_UNITY_BUILD) +qt_commandline_option(unity-build-batch-size + TYPE string + NAME unity_build_batch_size + CMAKE_VARIABLE QT_UNITY_BUILD_BATCH_SIZE +) +qt_commandline_option(ccache TYPE boolean NAME ccache CMAKE_VARIABLE QT_USE_CCACHE) +qt_commandline_option(vcpkg TYPE boolean CMAKE_VARIABLE QT_USE_VCPKG) qt_commandline_option(commercial TYPE void) qt_commandline_option(confirm-license TYPE void) qt_commandline_option(dbus TYPE optionalString VALUES no yes linked runtime) @@ -84,7 +94,10 @@ qt_commandline_option(libcpp-hardening TYPE boolean NAME libcpp_hardening) qt_commandline_option(relro-now-linker TYPE boolean NAME relro_now_linker) qt_commandline_option(make TYPE addString VALUES examples libs tests tools benchmarks manual-tests minimal-static-tests) -qt_commandline_option(install-examples-sources TYPE boolean) +qt_commandline_option(install-examples-sources + TYPE boolean + CMAKE_VARIABLE QT_INSTALL_EXAMPLES_SOURCES +) qt_commandline_option(mips_dsp TYPE boolean) qt_commandline_option(mips_dspr2 TYPE boolean) qt_commandline_option(nomake TYPE addString VALUES examples tests tools benchmarks @@ -94,21 +107,29 @@ qt_commandline_option(optimize-debug TYPE boolean NAME optimize_debug) qt_commandline_option(optimize-size TYPE boolean NAME optimize_size) qt_commandline_option(optimized-qmake TYPE boolean NAME release_tools) qt_commandline_option(optimized-tools TYPE boolean NAME release_tools) -qt_commandline_option(pch TYPE boolean NAME precompile_header) +qt_commandline_option(pch TYPE boolean NAME precompile_header CMAKE_VARIABLE BUILD_WITH_PCH) qt_commandline_option(pkg-config TYPE boolean) -qt_commandline_option(platform TYPE string) +qt_commandline_option(platform TYPE string CMAKE_VARIABLE QT_QMAKE_TARGET_MKSPEC) qt_commandline_option(plugin-manifests TYPE boolean) qt_commandline_option(profile TYPE boolean) -qt_commandline_option(qreal TYPE string) -qt_commandline_option(qtinlinenamespace TYPE boolean) -qt_commandline_option(qtlibinfix TYPE string NAME qt_libinfix) -qt_commandline_option(qtnamespace TYPE string NAME qt_namespace) +qt_commandline_option(qreal TYPE string CMAKE_VARIABLE QT_COORD_TYPE) +qt_commandline_option(qtinlinenamespace TYPE boolean CMAKE_VARIABLE QT_INLINE_NAMESPACE) +qt_commandline_option(qtlibinfix + TYPE string + NAME qt_libinfix + CMAKE_VARIABLE QT_LIBINFIX +) +qt_commandline_option(qtnamespace + TYPE string + NAME qt_namespace + CMAKE_VARIABLE QT_NAMESPACE +) qt_commandline_option(reduce-exports TYPE boolean NAME reduce_exports) qt_commandline_option(reduce-relocations TYPE boolean NAME reduce_relocations) qt_commandline_option(release TYPE enum NAME debug MAPPING yes no no yes) qt_commandline_option(rpath TYPE boolean) qt_commandline_option(sanitize TYPE sanitize) -qt_commandline_option(sdk TYPE string) +qt_commandline_option(sdk TYPE string CMAKE_VARIABLE QT_APPLE_SDK) qt_commandline_option(separate-debug-info TYPE boolean NAME separate_debug_info) qt_commandline_option(shared TYPE boolean) qt_commandline_option(silent TYPE void) @@ -123,15 +144,19 @@ qt_commandline_option(static-runtime TYPE boolean NAME static_runtime) qt_commandline_option(strip TYPE boolean) qt_commandline_option(sysroot TYPE string) qt_commandline_option(use-gold-linker TYPE boolean NAME use_gold_linker_alias) -qt_commandline_option(warnings-are-errors TYPE boolean NAME warnings_are_errors) +qt_commandline_option(warnings-are-errors + TYPE boolean + NAME warnings_are_errors + CMAKE_VARIABLE WARNINGS_ARE_ERRORS +) qt_commandline_option(Werror TYPE boolean NAME warnings_are_errors) qt_commandline_option(widgets TYPE boolean) -qt_commandline_option(xplatform TYPE string) +qt_commandline_option(xplatform TYPE string CMAKE_VARIABLE QT_QMAKE_TARGET_MKSPEC) qt_commandline_option(zlib CONTROLS_FEATURE TYPE enum NAME system-zlib MAPPING system yes qt no) qt_commandline_option(zstd TYPE boolean) qt_commandline_option(coverage TYPE optionalString VALUES gcov) qt_commandline_option(ffmpeg-dir TYPE string) -qt_commandline_option(ffmpeg-deploy TYPE boolean) +qt_commandline_option(ffmpeg-deploy TYPE boolean CMAKE_VARIABLE QT_DEPLOY_FFMPEG) qt_commandline_prefix(D defines) qt_commandline_prefix(F fpaths) qt_commandline_prefix(I includes) diff --git a/src/gui/qt_cmdline.cmake b/src/gui/qt_cmdline.cmake index 5465b2c63eb..01356665cbb 100644 --- a/src/gui/qt_cmdline.cmake +++ b/src/gui/qt_cmdline.cmake @@ -29,7 +29,11 @@ qt_commandline_option(opengl-es-2 TYPE void NAME opengl VALUE es2) qt_commandline_option(opengles3 TYPE boolean) qt_commandline_option(openvg TYPE boolean) qt_commandline_option(qpa TYPE string NAME qpa_platforms) -qt_commandline_option(default-qpa TYPE string NAME qpa_default_platform) +qt_commandline_option(default-qpa + TYPE string + NAME qpa_default_platform + CMAKE_VARIABLE QT_QPA_DEFAULT_PLATFORM +) qt_commandline_option(sm TYPE boolean NAME sessionmanager) qt_commandline_option(tslib TYPE boolean) qt_commandline_option(vulkan TYPE boolean)