From 9be3d7a7a0a8c7047d7b13a61d4f45c0c14519c4 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Fri, 14 Jun 2024 19:07:16 +0200 Subject: [PATCH] CMake: Allow specifying most SBOM options to qt_internal_add_foo Previously, only a very short subset of options related to attribution files could be specified to qt_internal_add_module / qt_internal_extend_target. It is more convenient to allow specifying most (safe) options, instead of calling another function. Unsafe are considered paths like INSTALL_PATH and derivatives, TYPE which is too generic, and some other ones like LIBRARIES which would be duplicated, and causes warnings in cmake_parse_arguments if duplicated. Change the code to allow specifying most SBOM options and forwarding them to _qt_internal_extend_sbom. Task-number: QTBUG-122899 Change-Id: I6eb723e165edf59973d83c66eace43acdce237de Reviewed-by: Joerg Bornemann (cherry picked from commit 81162cc8b6931c8659dc722be97eb788e344812a) Reviewed-by: Qt Cherry-pick Bot --- cmake/Qt3rdPartyLibraryHelpers.cmake | 36 +++++-------------- cmake/QtAppHelpers.cmake | 10 +++--- cmake/QtExecutableHelpers.cmake | 21 ++++++++--- cmake/QtModuleHelpers.cmake | 20 +++++++---- cmake/QtPluginHelpers.cmake | 17 ++++++--- cmake/QtPublicSbomHelpers.cmake | 31 ++++++++++++---- cmake/QtTargetHelpers.cmake | 53 +++++++++++----------------- cmake/QtToolHelpers.cmake | 20 ++++++++--- 8 files changed, 118 insertions(+), 90 deletions(-) diff --git a/cmake/Qt3rdPartyLibraryHelpers.cmake b/cmake/Qt3rdPartyLibraryHelpers.cmake index 17a6afd5551..7d40145efa1 100644 --- a/cmake/Qt3rdPartyLibraryHelpers.cmake +++ b/cmake/Qt3rdPartyLibraryHelpers.cmake @@ -130,49 +130,27 @@ function(qt_internal_add_cmake_library target) ) endfunction() -macro(qt_internal_get_3rdparty_library_sbom_options option_args single_args multi_args) - set(${option_args} "") - set(${single_args} - PACKAGE_VERSION - CPE_VENDOR - CPE_PRODUCT - LICENSE_EXPRESSION - DOWNLOAD_LOCATION - ${__qt_internal_sbom_single_args} - ) - set(${multi_args} - COPYRIGHTS - CPE # Common Platform Enumeration, free-form - ${__qt_internal_sbom_multi_args} - ) -endmacro() - # This function replaces qmake's qt_helper_lib feature. It is intended to # compile 3rdparty libraries as part of the build. # function(qt_internal_add_3rdparty_library target) qt_internal_get_add_library_option_args(library_option_args) - qt_internal_get_3rdparty_library_sbom_options( - sbom_option_args - sbom_single_args - sbom_multi_args - ) set(option_args EXCEPTIONS INSTALL SKIP_AUTOMOC - ${sbom_option_args} - ) + ${__qt_internal_sbom_optional_args} + ) set(single_args OUTPUT_DIRECTORY QMAKE_LIB_NAME - ${sbom_single_args} + ${__qt_internal_sbom_single_args} ) set(multi_args ${__default_private_args} ${__default_public_args} - ${sbom_multi_args} + ${__qt_internal_sbom_multi_args} ) cmake_parse_arguments(PARSE_ARGV 1 arg @@ -394,10 +372,12 @@ function(qt_internal_add_3rdparty_library target) FORWARD_APPEND FORWARD_PREFIX arg FORWARD_OUT_VAR sbom_args + FORWARD_OPTIONS + ${__qt_internal_sbom_optional_args} FORWARD_SINGLE - ${sbom_single_args} + ${__qt_internal_sbom_single_args} FORWARD_MULTI - ${sbom_multi_args} + ${__qt_internal_sbom_multi_args} ) _qt_internal_extend_sbom(${target} ${sbom_args}) diff --git a/cmake/QtAppHelpers.cmake b/cmake/QtAppHelpers.cmake index 1220680688e..eb29030e304 100644 --- a/cmake/QtAppHelpers.cmake +++ b/cmake/QtAppHelpers.cmake @@ -9,6 +9,7 @@ function(qt_internal_add_app target) INSTALL_VERSIONED_LINK EXCEPTIONS NO_UNITY_BUILD + ${__qt_internal_sbom_optional_args} ) set(single_args ${__default_target_info_args} @@ -84,10 +85,6 @@ function(qt_internal_add_app target) MOC_OPTIONS ${arg_MOC_OPTIONS} ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS} DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS} - ATTRIBUTION_ENTRY_INDEX "${arg_ATTRIBUTION_ENTRY_INDEX}" - ATTRIBUTION_FILE_PATHS ${arg_ATTRIBUTION_FILE_PATHS} - ATTRIBUTION_FILE_DIR_PATHS ${arg_ATTRIBUTION_FILE_DIR_PATHS} - SBOM_DEPENDENCIES ${arg_SBOM_DEPENDENCIES} TARGET_VERSION ${arg_TARGET_VERSION} TARGET_PRODUCT ${arg_TARGET_PRODUCT} TARGET_DESCRIPTION ${arg_TARGET_DESCRIPTION} @@ -144,6 +141,11 @@ function(qt_internal_add_app target) FORWARD_OUT_VAR sbom_args FORWARD_OPTIONS NO_INSTALL + ${__qt_internal_sbom_optional_args} + FORWARD_SINGLE + ${__qt_internal_sbom_single_args} + FORWARD_MULTI + ${__qt_internal_sbom_multi_args} ) _qt_internal_extend_sbom(${target} ${sbom_args}) diff --git a/cmake/QtExecutableHelpers.cmake b/cmake/QtExecutableHelpers.cmake index 2e447a601d5..10f9fd94460 100644 --- a/cmake/QtExecutableHelpers.cmake +++ b/cmake/QtExecutableHelpers.cmake @@ -138,10 +138,6 @@ function(qt_internal_add_executable name) MOC_OPTIONS ${arg_MOC_OPTIONS} ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS} DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS} - ATTRIBUTION_ENTRY_INDEX "${arg_ATTRIBUTION_ENTRY_INDEX}" - ATTRIBUTION_FILE_PATHS ${arg_ATTRIBUTION_FILE_PATHS} - ATTRIBUTION_FILE_DIR_PATHS ${arg_ATTRIBUTION_FILE_DIR_PATHS} - SBOM_DEPENDENCIES ${arg_SBOM_DEPENDENCIES} ) set_target_properties("${name}" PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${arg_OUTPUT_DIRECTORY}" @@ -211,6 +207,23 @@ function(qt_internal_add_executable name) ADDITIONAL_INSTALL_ARGS ${additional_install_args}) qt_internal_install_pdb_files(${name} "${arg_INSTALL_DIRECTORY}") endif() + + if(QT_GENERATE_SBOM) + set(sbom_args "") + _qt_internal_forward_function_args( + FORWARD_APPEND + FORWARD_PREFIX arg + FORWARD_OUT_VAR sbom_args + FORWARD_OPTIONS + ${__qt_internal_sbom_optional_args} + FORWARD_SINGLE + ${__qt_internal_sbom_single_args} + FORWARD_MULTI + ${__qt_internal_sbom_multi_args} + ) + + _qt_internal_extend_sbom(${name} ${sbom_args}) + endif() endfunction() # This function compiles the target at configure time the very first time and creates the custom diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake index 0a6084a157e..d92e1524fee 100644 --- a/cmake/QtModuleHelpers.cmake +++ b/cmake/QtModuleHelpers.cmake @@ -18,6 +18,7 @@ macro(qt_internal_get_internal_add_module_keywords option_args single_args multi NO_HEADERSCLEAN_CHECK NO_GENERATE_CPP_EXPORTS NO_UNITY_BUILD + ${__qt_internal_sbom_optional_args} ) set(${single_args} MODULE_INCLUDE_NAME @@ -641,10 +642,6 @@ function(qt_internal_add_module target) DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS} PRECOMPILED_HEADER ${arg_PRECOMPILED_HEADER} NO_PCH_SOURCES ${arg_NO_PCH_SOURCES} - ATTRIBUTION_ENTRY_INDEX "${arg_ATTRIBUTION_ENTRY_INDEX}" - ATTRIBUTION_FILE_PATHS ${arg_ATTRIBUTION_FILE_PATHS} - ATTRIBUTION_FILE_DIR_PATHS ${arg_ATTRIBUTION_FILE_DIR_PATHS} - SBOM_DEPENDENCIES ${arg_SBOM_DEPENDENCIES} ) # The public module define is not meant to be used when building the module itself, @@ -920,9 +917,8 @@ set(QT_ALLOW_MISSING_TOOLS_PACKAGES TRUE)") qt_describe_module(${target}) - set(sbom_args "") - if(QT_GENERATE_SBOM) + set(sbom_args "") list(APPEND sbom_args TYPE QT_MODULE) qt_get_cmake_configurations(configs) @@ -953,6 +949,18 @@ set(QT_ALLOW_MISSING_TOOLS_PACKAGES TRUE)") ) endforeach() + _qt_internal_forward_function_args( + FORWARD_APPEND + FORWARD_PREFIX arg + FORWARD_OUT_VAR sbom_args + FORWARD_OPTIONS + ${__qt_internal_sbom_optional_args} + FORWARD_SINGLE + ${__qt_internal_sbom_single_args} + FORWARD_MULTI + ${__qt_internal_sbom_multi_args} + ) + _qt_internal_extend_sbom(${target} ${sbom_args}) endif() diff --git a/cmake/QtPluginHelpers.cmake b/cmake/QtPluginHelpers.cmake index 46953d89cb7..e29b638ff5b 100644 --- a/cmake/QtPluginHelpers.cmake +++ b/cmake/QtPluginHelpers.cmake @@ -9,6 +9,7 @@ macro(qt_internal_get_internal_add_plugin_keywords option_args single_args multi ALLOW_UNDEFINED_SYMBOLS SKIP_INSTALL NO_UNITY_BUILD + ${__qt_internal_sbom_optional_args} ) set(${single_args} OUTPUT_DIRECTORY @@ -314,10 +315,6 @@ function(qt_internal_add_plugin target) MOC_OPTIONS ${arg_MOC_OPTIONS} ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS} DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS} - ATTRIBUTION_ENTRY_INDEX "${arg_ATTRIBUTION_ENTRY_INDEX}" - ATTRIBUTION_FILE_PATHS ${arg_ATTRIBUTION_FILE_PATHS} - ATTRIBUTION_FILE_DIR_PATHS ${arg_ATTRIBUTION_FILE_DIR_PATHS} - SBOM_DEPENDENCIES ${arg_SBOM_DEPENDENCIES} ) qt_internal_add_repo_local_defines("${target}") @@ -435,6 +432,18 @@ function(qt_internal_add_plugin target) ) endforeach() + _qt_internal_forward_function_args( + FORWARD_APPEND + FORWARD_PREFIX arg + FORWARD_OUT_VAR sbom_args + FORWARD_OPTIONS + ${__qt_internal_sbom_optional_args} + FORWARD_SINGLE + ${__qt_internal_sbom_single_args} + FORWARD_MULTI + ${__qt_internal_sbom_multi_args} + ) + _qt_internal_extend_sbom(${target} ${sbom_args}) endif() diff --git a/cmake/QtPublicSbomHelpers.cmake b/cmake/QtPublicSbomHelpers.cmake index 3c5148473b2..794447c8e7f 100644 --- a/cmake/QtPublicSbomHelpers.cmake +++ b/cmake/QtPublicSbomHelpers.cmake @@ -262,11 +262,10 @@ function(_qt_internal_sbom_end_project) set_property(GLOBAL PROPERTY _qt_internal_sbom_repo_begin_called FALSE) endfunction() -# Helper to get the options that _qt_internal_sbom_add_target understands. -# Also used in qt_find_package_extend_sbom. -macro(_qt_internal_get_sbom_add_target_options opt_args single_args multi_args) +# Helper to get the options that _qt_internal_sbom_add_target understands, but that are also +# a safe subset for qt_internal_add_module, qt_internal_extend_target, etc to understand. +macro(_qt_internal_get_sbom_add_target_common_options opt_args single_args multi_args) set(${opt_args} - NO_INSTALL NO_CURRENT_DIR_ATTRIBUTION NO_DEFAULT_QT_LICENSE NO_DEFAULT_DIRECTORY_QT_LICENSE @@ -275,7 +274,6 @@ macro(_qt_internal_get_sbom_add_target_options opt_args single_args multi_args) NO_DEFAULT_QT_SUPPLIER ) set(${single_args} - TYPE PACKAGE_VERSION FRIENDLY_PACKAGE_NAME CPE_VENDOR @@ -286,13 +284,32 @@ macro(_qt_internal_get_sbom_add_target_options opt_args single_args multi_args) ) set(${multi_args} COPYRIGHTS - LIBRARIES - PUBLIC_LIBRARIES CPE SBOM_DEPENDENCIES ATTRIBUTION_FILE_PATHS ATTRIBUTION_FILE_DIR_PATHS ) +endmacro() + +# Helper to get the options that _qt_internal_sbom_add_target understands. +# Also used in qt_find_package_extend_sbom. +macro(_qt_internal_get_sbom_add_target_options opt_args single_args multi_args) + set(${opt_args} + NO_INSTALL + ) + set(${single_args} + TYPE + ) + set(${multi_args} + LIBRARIES + PUBLIC_LIBRARIES + ) + + _qt_internal_get_sbom_add_target_common_options( + common_opt_args common_single_args common_multi_args) + list(APPEND opt_args ${common_opt_args}) + list(APPEND single_args ${common_single_args}) + list(APPEND multi_args ${common_multi_args}) _qt_internal_sbom_get_multi_config_single_args(multi_config_single_args) list(APPEND single_args ${multi_config_single_args}) diff --git a/cmake/QtTargetHelpers.cmake b/cmake/QtTargetHelpers.cmake index b90b95870d9..55ce0b8cfb6 100644 --- a/cmake/QtTargetHelpers.cmake +++ b/cmake/QtTargetHelpers.cmake @@ -41,11 +41,12 @@ function(qt_internal_extend_target target) set(option_args NO_UNITY_BUILD + ${__qt_internal_sbom_optional_args} ) set(single_args PRECOMPILED_HEADER EXTRA_LINKER_SCRIPT_CONTENT - ATTRIBUTION_ENTRY_INDEX + ${__qt_internal_sbom_single_args} ) set(multi_args ${__default_public_args} @@ -55,9 +56,7 @@ function(qt_internal_extend_target target) CONDITION_INDEPENDENT_SOURCES COMPILE_FLAGS EXTRA_LINKER_SCRIPT_EXPORTS - SBOM_DEPENDENCIES - ATTRIBUTION_FILE_PATHS - ATTRIBUTION_FILE_DIR_PATHS + ${__qt_internal_sbom_multi_args} ) cmake_parse_arguments(PARSE_ARGV 1 arg @@ -226,28 +225,20 @@ function(qt_internal_extend_target target) ) endif() - if(arg_SBOM_DEPENDENCIES) - _qt_internal_extend_sbom_dependencies(${target} - SBOM_DEPENDENCIES ${arg_SBOM_DEPENDENCIES} - ) - endif() - - if(NOT "${arg_ATTRIBUTION_ENTRY_INDEX}" STREQUAL "") - _qt_internal_extend_sbom(${target} - ATTRIBUTION_ENTRY_INDEX "${arg_ATTRIBUTION_ENTRY_INDEX}" - ) - endif() - - if(arg_ATTRIBUTION_FILE_PATHS) - _qt_internal_extend_sbom(${target} - ATTRIBUTION_FILE_PATHS ${arg_ATTRIBUTION_FILE_PATHS} - ) - endif() - - if(arg_ATTRIBUTION_FILE_DIR_PATHS) - _qt_internal_extend_sbom(${target} - ATTRIBUTION_FILE_DIR_PATHS ${arg_ATTRIBUTION_FILE_DIR_PATHS} + if(QT_GENERATE_SBOM) + set(sbom_args "") + _qt_internal_forward_function_args( + FORWARD_APPEND + FORWARD_PREFIX arg + FORWARD_OUT_VAR sbom_args + FORWARD_OPTIONS + ${__qt_internal_sbom_optional_args} + FORWARD_SINGLE + ${__qt_internal_sbom_single_args} + FORWARD_MULTI + ${__qt_internal_sbom_multi_args} ) + _qt_internal_extend_sbom(${target} ${sbom_args}) endif() set(target_private "${target}Private") @@ -438,13 +429,10 @@ macro(qt_internal_setup_default_target_function_options) TARGET_COPYRIGHT ) - set(__qt_internal_sbom_single_args - ATTRIBUTION_ENTRY_INDEX - ) - set(__qt_internal_sbom_multi_args - SBOM_DEPENDENCIES - ATTRIBUTION_FILE_PATHS - ATTRIBUTION_FILE_DIR_PATHS + _qt_internal_get_sbom_add_target_common_options( + __qt_internal_sbom_optional_args + __qt_internal_sbom_single_args + __qt_internal_sbom_multi_args ) # Collection of arguments so they can be shared across qt_internal_add_executable @@ -457,6 +445,7 @@ macro(qt_internal_setup_default_target_function_options) DELAY_TARGET_INFO QT_APP NO_UNITY_BUILD + ${__qt_internal_sbom_optional_args} ) set(__qt_internal_add_executable_single_args CORE_LIBRARY diff --git a/cmake/QtToolHelpers.cmake b/cmake/QtToolHelpers.cmake index dd865c7d9c3..b8713165b77 100644 --- a/cmake/QtToolHelpers.cmake +++ b/cmake/QtToolHelpers.cmake @@ -50,7 +50,9 @@ function(qt_internal_add_tool target_name) INSTALL_VERSIONED_LINK EXCEPTIONS NO_UNITY_BUILD - TRY_RUN) + TRY_RUN + ${__qt_internal_sbom_optional_args} + ) set(one_value_keywords TOOLS_TARGET INSTALL_DIR @@ -132,10 +134,6 @@ function(qt_internal_add_tool target_name) LINK_OPTIONS ${arg_LINK_OPTIONS} MOC_OPTIONS ${arg_MOC_OPTIONS} DISABLE_AUTOGEN_TOOLS ${disable_autogen_tools} - ATTRIBUTION_ENTRY_INDEX "${arg_ATTRIBUTION_ENTRY_INDEX}" - ATTRIBUTION_FILE_PATHS ${arg_ATTRIBUTION_FILE_PATHS} - ATTRIBUTION_FILE_DIR_PATHS ${arg_ATTRIBUTION_FILE_DIR_PATHS} - SBOM_DEPENDENCIES ${arg_SBOM_DEPENDENCIES} TARGET_VERSION ${arg_TARGET_VERSION} TARGET_PRODUCT ${arg_TARGET_PRODUCT} TARGET_DESCRIPTION ${arg_TARGET_DESCRIPTION} @@ -273,6 +271,18 @@ function(qt_internal_add_tool target_name) qt_internal_install_pdb_files(${target_name} "${install_dir}") if(QT_GENERATE_SBOM) + _qt_internal_forward_function_args( + FORWARD_APPEND + FORWARD_PREFIX arg + FORWARD_OUT_VAR sbom_args + FORWARD_OPTIONS + ${__qt_internal_sbom_optional_args} + FORWARD_SINGLE + ${__qt_internal_sbom_single_args} + FORWARD_MULTI + ${__qt_internal_sbom_multi_args} + ) + _qt_internal_extend_sbom(${target_name} ${sbom_args}) endif()