Warning, /frameworks/extra-cmake-modules/modules/ECMAddTests.cmake is written in an unsupported language. File is not indexed.
0001 # SPDX-FileCopyrightText: 2013 Alexander Richardson <arichardson.kde@gmail.com>
0002 # SPDX-FileCopyrightText: 2015 Alex Merry <alex.merry@kde.org>
0003 #
0004 # SPDX-License-Identifier: BSD-3-Clause
0005
0006 #[=======================================================================[.rst:
0007 ECMAddTests
0008 -----------
0009
0010 Convenience functions for adding tests.
0011
0012 ::
0013
0014 ecm_add_tests(<sources>
0015 LINK_LIBRARIES <library> [<library> [...]]
0016 [NAME_PREFIX <prefix>]
0017 [GUI]
0018 [TARGET_NAMES_VAR <target_names_var>]
0019 [TEST_NAMES_VAR <test_names_var>]
0020 [WORKING_DIRECTORY <dir>] # Since 5.111
0021 )
0022
0023 A convenience function for adding multiple tests, each consisting of a
0024 single source file. For each file in <sources>, an executable target will be
0025 created (the name of which will be the basename of the source file). This
0026 will be linked against the libraries given with ``LINK_LIBRARIES``. Each
0027 executable will be added as a test with the same name.
0028
0029 If ``NAME_PREFIX`` is given, this prefix will be prepended to the test names, but
0030 not the target names. As a result, it will not prevent clashes between tests
0031 with the same name in different parts of the project, but it can be used to
0032 give an indication of where to look for a failing test.
0033
0034 If the flag ``GUI`` is passed the test binaries will be GUI executables, otherwise
0035 the resulting binaries will be console applications (regardless of the value
0036 of ``CMAKE_WIN32_EXECUTABLE`` or ``CMAKE_MACOSX_BUNDLE``). Be aware that this changes
0037 the executable entry point on Windows (although some frameworks, such as Qt,
0038 abstract this difference away).
0039
0040 The tests will be build with ``-DQT_FORCE_ASSERTS`` to enable assertions in the
0041 test executable even for release builds.
0042
0043 The ``TARGET_NAMES_VAR`` and ``TEST_NAMES_VAR`` arguments, if given, should specify a
0044 variable name to receive the list of generated target and test names,
0045 respectively. This makes it convenient to apply properties to them as a
0046 whole, for example, using ``set_target_properties()`` or ``set_tests_properties()``.
0047
0048 The generated target executables will have the effects of ``ecm_mark_as_test()``
0049 (from the :module:`ECMMarkAsTest` module) applied to it.
0050
0051 ``WORKING_DIRECTORY`` sets the test property `WORKING_DIRECTORY
0052 <https://cmake.org/cmake/help/latest/prop_test/WORKING_DIRECTORY.html>`_
0053 in which to execute the test. By default the test will be run in
0054 ``${CMAKE_CURRENT_BINARY_DIR}``. The working directory can be specified using
0055 generator expressions. Since 5.111.
0056
0057 ::
0058
0059 ecm_add_test(
0060 <sources>
0061 LINK_LIBRARIES <library> [<library> [...]]
0062 [TEST_NAME <name>]
0063 [NAME_PREFIX <prefix>]
0064 [GUI]
0065 [WORKING_DIRECTORY <dir>] # Since 5.111
0066 )
0067
0068 This is a single-test form of ``ecm_add_tests`` that allows multiple source files
0069 to be used for a single test. If using multiple source files, ``TEST_NAME`` must
0070 be given; this will be used for both the target and test names (and, as with
0071 ``ecm_add_tests()``, the ``NAME_PREFIX`` argument will be prepended to the test name).
0072
0073 ``WORKING_DIRECTORY`` sets the test property `WORKING_DIRECTORY
0074 <https://cmake.org/cmake/help/latest/prop_test/WORKING_DIRECTORY.html>`_
0075 in which to execute the test. By default the test will be run in
0076 ``${CMAKE_CURRENT_BINARY_DIR}``. The working directory can be specified using
0077 generator expressions. Since 5.111.
0078
0079 Since pre-1.0.0.
0080 #]=======================================================================]
0081
0082 include(ECMMarkAsTest)
0083 include(ECMMarkNonGuiExecutable)
0084
0085 function(ecm_add_test)
0086 set(options GUI)
0087 # TARGET_NAME_VAR and TEST_NAME_VAR are undocumented args used by
0088 # ecm_add_tests
0089 set(oneValueArgs TEST_NAME NAME_PREFIX TARGET_NAME_VAR TEST_NAME_VAR WORKING_DIRECTORY)
0090 set(multiValueArgs LINK_LIBRARIES)
0091 cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0092 set(_sources ${ARG_UNPARSED_ARGUMENTS})
0093 list(LENGTH _sources _sourceCount)
0094 if(ARG_TEST_NAME)
0095 set(_targetname ${ARG_TEST_NAME})
0096 elseif(${_sourceCount} EQUAL "1")
0097 #use the source file name without extension as the testname
0098 get_filename_component(_targetname ${_sources} NAME_WE)
0099 else()
0100 #more than one source file passed, but no test name given -> error
0101 message(FATAL_ERROR "ecm_add_test() called with multiple source files but without setting \"TEST_NAME\"")
0102 endif()
0103
0104 set(_testname ${ARG_NAME_PREFIX}${_targetname})
0105 set(gui_args)
0106 if(ARG_GUI)
0107 set(gui_args WIN32 MACOSX_BUNDLE)
0108 endif()
0109 add_executable(${_targetname} ${gui_args} ${_sources})
0110 if(NOT ARG_GUI)
0111 ecm_mark_nongui_executable(${_targetname})
0112 endif()
0113 set(test_args)
0114 if(DEFINED ARG_WORKING_DIRECTORY)
0115 list(APPEND test_args WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY})
0116 endif()
0117 add_test(NAME ${_testname} COMMAND ${_targetname} ${test_args})
0118 target_link_libraries(${_targetname} ${ARG_LINK_LIBRARIES})
0119 target_compile_definitions(${_targetname} PRIVATE -DQT_FORCE_ASSERTS)
0120 ecm_mark_as_test(${_targetname})
0121 if (CMAKE_LIBRARY_OUTPUT_DIRECTORY)
0122 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
0123 # https://stackoverflow.com/questions/59862894/how-do-i-make-a-list-in-cmake-with-the-semicolon-value
0124 set(PATHSEP "\\\;") # Don't want cmake to treat it like a list
0125 else() # e.g. Linux
0126 set(PATHSEP ":")
0127 endif()
0128 set(_plugin_path "$ENV{QT_PLUGIN_PATH}")
0129 set_property(TEST ${_testname} PROPERTY ENVIRONMENT "QT_PLUGIN_PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}${PATHSEP}${_plugin_path}")
0130 endif()
0131 if (ARG_TARGET_NAME_VAR)
0132 set(${ARG_TARGET_NAME_VAR} "${_targetname}" PARENT_SCOPE)
0133 endif()
0134 if (ARG_TEST_NAME_VAR)
0135 set(${ARG_TEST_NAME_VAR} "${_testname}" PARENT_SCOPE)
0136 endif()
0137 endfunction()
0138
0139 function(ecm_add_tests)
0140 set(options GUI)
0141 set(oneValueArgs NAME_PREFIX TARGET_NAMES_VAR TEST_NAMES_VAR WORKING_DIRECTORY)
0142 set(multiValueArgs LINK_LIBRARIES)
0143 cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0144 if(ARG_GUI)
0145 set(_exe_type GUI)
0146 else()
0147 set(_exe_type "")
0148 endif()
0149 set(test_args)
0150 if(DEFINED ARG_WORKING_DIRECTORY)
0151 list(APPEND test_args WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY})
0152 endif()
0153 set(test_names)
0154 set(target_names)
0155 foreach(_test_source ${ARG_UNPARSED_ARGUMENTS})
0156 ecm_add_test(${_test_source}
0157 NAME_PREFIX ${ARG_NAME_PREFIX}
0158 LINK_LIBRARIES ${ARG_LINK_LIBRARIES}
0159 TARGET_NAME_VAR target_name
0160 TEST_NAME_VAR test_name
0161 ${_exe_type}
0162 ${test_args}
0163 )
0164 list(APPEND _test_names "${test_name}")
0165 list(APPEND _target_names "${target_name}")
0166 endforeach()
0167 if (ARG_TARGET_NAMES_VAR)
0168 set(${ARG_TARGET_NAMES_VAR} "${_target_names}" PARENT_SCOPE)
0169 endif()
0170 if (ARG_TEST_NAMES_VAR)
0171 set(${ARG_TEST_NAMES_VAR} "${_test_names}" PARENT_SCOPE)
0172 endif()
0173 endfunction()