Warning, /frameworks/extra-cmake-modules/modules/ECMCheckOutboundLicense.cmake is written in an unsupported language. File is not indexed.
0001 # SPDX-FileCopyrightText: 2020 Andreas Cord-Landwehr <cordlandwehr@kde.org>
0002 #
0003 # SPDX-License-Identifier: BSD-3-Clause
0004
0005 #[=======================================================================[.rst:
0006 ECMCheckOutboundLicense
0007 -----------------------
0008
0009 Assert that source file licenses are compatible with a desired outbound license
0010 of a compiled binary artifact (e.g., library, plugin or application).
0011
0012 This module provides the ``ecm_check_outbound_license`` function that
0013 generates unit tests for checking the compatibility of license statements.
0014 The license statements in all tested files are required to be added by using
0015 the SPDX marker ``SPDX-License-Identifier``.
0016
0017 During the CMake configuration of the project, a temporary license bill of
0018 materials (BOM) in SPDX format is generated by calling the REUSE tool
0019 (see <https://reuse.software>). That BOM is parsed and license computations
0020 based on an internal compatibility matrix are performed.
0021
0022 Preconditions for using this module:
0023 * All tested input source files must contain the SPDX-License-Identifier tag.
0024 * Python3 must be available.
0025 * The REUSE tool must be available, which generates the bill-of-materials
0026 by running ``reuse spdx`` on the tested directory.
0027
0028 When this module is included, a ``SKIP_LICENSE_TESTS`` option is added (default
0029 ``OFF``). Turning this option on skips the generation of license tests, which might
0030 be convenient if licenses shall not be tested in all build configurations.
0031
0032 ::
0033
0034 ecm_check_outbound_license(LICENSES <outbound-licenses>
0035 FILES <source-files>
0036 [TEST_NAME <name>]
0037 [WILL_FAIL])
0038
0039 This method adds a custom unit test to ensure the specified outbound license to be
0040 compatible with the specified license headers. Note that a convenient way is to use
0041 the CMake ``GLOB`` argument of the ``FILE`` function.
0042
0043 ``LICENSES`` : List of one or multiple outbound license regarding which the compatibility of the source code files shall be tested.
0044 Currently, the following values are supported (values are SPDX registry identifiers):
0045 * MIT
0046 * BSD-2-Clause
0047 * BSD-3-Clause
0048 * LGPL-2.0-only
0049 * LGPL-2.1-only
0050 * LGPL-3.0-only
0051 * GPL-2.0-only
0052 * GPL-3.0-only
0053
0054 ``FILES:`` : List of source files that contain valid SPDX-License-Identifier markers.
0055 The paths can be relative to the CMake file that generates the test case
0056 or be absolute paths.
0057
0058 ``TEST_NAME`` : Optional parameter that defines the name of the generated test case.
0059 If no name is defined, the relative path to the test directory with appended
0060 license name is used. Every test has ``licensecheck_`` as prefix.
0061
0062 ``WILL_FAIL`` : Optional parameter that inverts the test result. This parameter is usually only
0063 used for tests of the module.
0064
0065 Since 5.75.0
0066 #]=======================================================================]
0067
0068 include(FeatureSummary)
0069
0070 option(SKIP_LICENSE_TESTS "Skip outbound license tests" OFF)
0071
0072 find_package(Python3)
0073 set_package_properties(Python3 PROPERTIES
0074 PURPOSE "Required to run tests of module ECMCheckOutboundLicense"
0075 TYPE OPTIONAL
0076 )
0077
0078 find_package(ReuseTool)
0079 set_package_properties(ReuseTool PROPERTIES
0080 PURPOSE "Required to run tests of module ECMCheckOutboundLicense"
0081 TYPE OPTIONAL
0082 )
0083
0084 if (NOT SKIP_LICENSE_TESTS AND NOT REUSETOOL_FOUND)
0085 add_feature_info(SPDX_LICENSE_TESTING FALSE "Automatic license testing based on SPDX definitions (requires reuse tool)")
0086 message(WARNING "Reuse tool not found, skipping test generation")
0087 else()
0088 add_feature_info(SPDX_LICENSE_TESTING TRUE "Automatic license testing based on SPDX definitions (requires reuse tool)")
0089 endif()
0090
0091 set(SPDX_BOM_OUTPUT "${CMAKE_BINARY_DIR}/spdx.txt")
0092
0093 # test fixture for generating SPDX bill of materials
0094 if(SKIP_LICENSE_TESTS OR NOT REUSETOOL_FOUND)
0095 message(STATUS "Skipping execution of outbound license tests.")
0096 else()
0097 add_test(
0098 NAME generate_spdx_bom
0099 COMMAND reuse spdx -o ${SPDX_BOM_OUTPUT}
0100 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
0101 )
0102 set_tests_properties(generate_spdx_bom PROPERTIES FIXTURES_SETUP SPDX_BOM)
0103 endif()
0104
0105 function(ecm_check_outbound_license)
0106 if(SKIP_LICENSE_TESTS OR NOT REUSETOOL_FOUND)
0107 return()
0108 endif()
0109
0110 set(_options WILL_FAIL)
0111 set(_oneValueArgs TEST_NAME)
0112 set(_multiValueArgs LICENSES FILES)
0113 cmake_parse_arguments(ARG "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN} )
0114
0115 if(NOT ARG_LICENSES)
0116 message(FATAL_ERROR "No LICENSES argument given to ecm_check_outbound_license")
0117 endif()
0118
0119 if(NOT ARG_FILES)
0120 message(WARNING "No FILES argument given to ecm_check_outbound_license")
0121 return()
0122 endif()
0123
0124 if(NOT ARG_TEST_NAME)
0125 # compute test name based on licensecheck_<relative-path>_<licence> if not name given
0126 string(REPLACE "${CMAKE_SOURCE_DIR}/" "" TEMP_TEST_NAME "${CMAKE_CURRENT_SOURCE_DIR}_${ARG_LICENSE}")
0127 string(MAKE_C_IDENTIFIER ${TEMP_TEST_NAME} ARG_TEST_NAME)
0128 endif()
0129
0130 # generate file with list of relative file paths
0131 string(REPLACE "${CMAKE_BINARY_DIR}/" "" RELATIVE_PREFIX_PATH ${CMAKE_CURRENT_BINARY_DIR})
0132 set(OUTPUT_FILE ${CMAKE_BINARY_DIR}/licensecheck_${ARG_TEST_NAME}.txt)
0133 file(REMOVE ${OUTPUT_FILE})
0134 foreach(_file ${ARG_FILES})
0135 # check script expects files to start with "./", which must be relative to CMAKE_SOURCE_DIR
0136 if (IS_ABSOLUTE ${_file})
0137 string(REPLACE ${CMAKE_SOURCE_DIR} "." TEMPORARY_PATH ${_file})
0138 file(APPEND ${OUTPUT_FILE} "${TEMPORARY_PATH}\n")
0139 else()
0140 file(APPEND ${OUTPUT_FILE} "./${RELATIVE_PREFIX_PATH}/${_file}\n")
0141 endif()
0142 endforeach()
0143
0144 file(COPY ${ECM_MODULE_DIR}/check-outbound-license.py DESTINATION ${CMAKE_BINARY_DIR})
0145
0146 foreach(_license ${ARG_LICENSES})
0147 string(MAKE_C_IDENTIFIER ${_license} LICENSE_ID)
0148 add_test(
0149 NAME licensecheck_${ARG_TEST_NAME}_${LICENSE_ID}
0150 COMMAND python3 ${CMAKE_BINARY_DIR}/check-outbound-license.py -l ${_license} -s ${SPDX_BOM_OUTPUT} -i ${OUTPUT_FILE}
0151 )
0152 set_tests_properties(licensecheck_${ARG_TEST_NAME}_${LICENSE_ID} PROPERTIES FIXTURES_REQUIRED SPDX_BOM)
0153 set_tests_properties(licensecheck_${ARG_TEST_NAME}_${LICENSE_ID} PROPERTIES WILL_FAIL ${ARG_WILL_FAIL})
0154 endforeach()
0155 endfunction()