Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 1 | # |
Imre Kis | 590cd9c | 2020-01-08 16:51:57 +0100 | [diff] [blame] | 2 | # Copyright (c) 2019-2020, Arm Limited. All rights reserved. |
Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 3 | # |
| 4 | # SPDX-License-Identifier: BSD-3-Clause |
| 5 | # |
| 6 | |
| 7 | include_guard(DIRECTORY) |
| 8 | |
Imre Kis | c625d49 | 2020-02-10 16:36:22 +0100 | [diff] [blame^] | 9 | # Trying to set CLANG_LIBRARY_PATH using the following methods |
| 10 | # 1. Using cache or command line definition |
| 11 | # Show warning if environment variable is also set but has different value |
| 12 | # 2. Copying the value of CLANG_LIBRARY_PATH environment variable if set |
| 13 | # 3. find_package (llvm-config, common paths or Windows registry) |
| 14 | # If none of the above steps succeeded CMake emits a fatal error and stops |
| 15 | |
| 16 | set(CLANG_LIBRARY_PATH_HELP "libclang directory for c-picker") |
| 17 | |
| 18 | if (DEFINED CLANG_LIBRARY_PATH) |
| 19 | message(STATUS "Using CLANG_LIBRARY_PATH from CMake variable (command line or cache)") |
| 20 | |
| 21 | if (DEFINED ENV{CLANG_LIBRARY_PATH}) |
| 22 | if (NOT (${CLANG_LIBRARY_PATH} STREQUAL $ENV{CLANG_LIBRARY_PATH})) |
| 23 | message(WARNING "Both CLANG_LIBRARY_PATH CMake and environment variables are set but have different values") |
| 24 | endif() |
| 25 | endif() |
| 26 | else() |
| 27 | if (DEFINED ENV{CLANG_LIBRARY_PATH}) |
| 28 | message(STATUS "Setting CLANG_LIBRARY_PATH based on environment variable") |
| 29 | set(CLANG_LIBRARY_PATH $ENV{CLANG_LIBRARY_PATH} CACHE PATH ${CLANG_LIBRARY_PATH_HELP}) |
| 30 | else() |
| 31 | message(STATUS "Setting CLANG_LIBRARY_PATH based on find_package") |
| 32 | find_package(LibClang REQUIRED) |
| 33 | set(CLANG_LIBRARY_PATH ${LibClang_LIBRARY_DIRS} CACHE PATH ${CLANG_LIBRARY_PATH_HELP}) |
| 34 | endif() |
| 35 | endif() |
| 36 | |
| 37 | message(STATUS "CLANG_LIBRARY_PATH has been set to ${CLANG_LIBRARY_PATH}") |
| 38 | |
| 39 | # Checking c-picker |
| 40 | find_program(CPICKER_COMMAND "c-picker") |
| 41 | if (NOT CPICKER_COMMAND) |
| 42 | message(FATAL_ERROR "Please install c-picker using pip") |
| 43 | endif() |
| 44 | |
Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 45 | # Global dependencies: |
| 46 | # Variables |
| 47 | # CPICKER_COMMAND: command of the c-picker |
| 48 | # CPICKER_CACHE_PATH: root directory of the c-picker generate files |
| 49 | # UNIT_TEST_COMMON_SOURCES: common source files for every test build |
Imre Kis | c0d4b44 | 2019-12-03 23:52:26 +0100 | [diff] [blame] | 50 | # CLANG_LIBRARY_PATH: libclang directory for c-picker |
Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 51 | # Modules |
| 52 | # CTest module should be included in the root CMakeLists.txt before calling this function |
| 53 | |
Imre Kis | 590cd9c | 2020-01-08 16:51:57 +0100 | [diff] [blame] | 54 | function(unit_test_add_suite) |
Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 55 | set(_OPTIONS_ARGS args1) |
Imre Kis | 590cd9c | 2020-01-08 16:51:57 +0100 | [diff] [blame] | 56 | set(_ONE_VALUE_ARGS NAME) |
Imre Kis | e32a103 | 2020-01-08 17:53:15 +0100 | [diff] [blame] | 57 | set(_MULTI_VALUE_ARGS SOURCES INCLUDE_DIRECTORIES COMPILE_DEFINITIONS DEPENDS) |
Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 58 | cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN}) |
| 59 | # TODO: check_args(add_unit_test_suite args1 args2 args3) |
| 60 | |
Imre Kis | c46907d | 2019-12-15 00:28:39 +0100 | [diff] [blame] | 61 | if(NOT DEFINED BUILD_TESTING) |
| 62 | message(FATAL_ERROR |
| 63 | "add_unit_test_suite(): " |
| 64 | "CTest module should be included in the root CMakeLists.txt before calling this function.") |
| 65 | endif() |
| 66 | |
Imre Kis | 590cd9c | 2020-01-08 16:51:57 +0100 | [diff] [blame] | 67 | set(TEST_NAME ${_MY_PARAMS_NAME}) |
| 68 | set(TEST_INCLUDE_DIRECTORIES ${_MY_PARAMS_INCLUDE_DIRECTORIES}) |
| 69 | set(TEST_COMPILE_DEFINITIONS ${_MY_PARAMS_COMPILE_DEFINITIONS}) |
Imre Kis | e32a103 | 2020-01-08 17:53:15 +0100 | [diff] [blame] | 70 | set(TEST_DEPENDS ${_MY_PARAMS_DEPENDS}) |
Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 71 | |
| 72 | add_executable(${TEST_NAME} ${UNIT_TEST_COMMON_SOURCES}) |
| 73 | |
Imre Kis | 590cd9c | 2020-01-08 16:51:57 +0100 | [diff] [blame] | 74 | foreach(TEST_SOURCE ${_MY_PARAMS_SOURCES}) |
Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 75 | get_filename_component(TEST_SOURCE_EXTENSION ${TEST_SOURCE} EXT) |
| 76 | |
| 77 | if (${TEST_SOURCE_EXTENSION} STREQUAL ".yml") |
| 78 | # Building output file name: tests/a/b/test.yml -> ${CPICKER_CACHE_PATH}/a/b/test.c |
| 79 | get_filename_component(TEST_SOURCE_DIR ${TEST_SOURCE} DIRECTORY) |
| 80 | file(RELATIVE_PATH CPICKER_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tests ${TEST_SOURCE_DIR}) |
| 81 | get_filename_component(TEST_SOURCE_NAME ${TEST_SOURCE} NAME_WE) |
| 82 | set(CPICKER_OUTPUT ${CPICKER_CACHE_PATH}/${TEST_NAME}/${CPICKER_SOURCE_DIR}/${TEST_SOURCE_NAME}.c) |
| 83 | |
| 84 | # Creating output directory |
| 85 | get_filename_component(OUTPUT_DIRECTORY ${CPICKER_OUTPUT} DIRECTORY) |
| 86 | file(MAKE_DIRECTORY ${OUTPUT_DIRECTORY}) |
| 87 | |
| 88 | # Fetching referenced source files as the dependencies of the generated file |
| 89 | execute_process( |
Imre Kis | c0d4b44 | 2019-12-03 23:52:26 +0100 | [diff] [blame] | 90 | COMMAND |
| 91 | ${CMAKE_COMMAND} -E env CLANG_LIBRARY_PATH=${CLANG_LIBRARY_PATH} |
| 92 | ${CPICKER_COMMAND} --config ${TEST_SOURCE} --root ${TF_A_PATH} --print-dependencies |
Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 93 | OUTPUT_VARIABLE CPICKER_DEPENDENCIES |
| 94 | ) |
| 95 | |
| 96 | # Adding custom command for invoking c-picker |
| 97 | add_custom_command( |
| 98 | OUTPUT ${CPICKER_OUTPUT} |
Imre Kis | c0d4b44 | 2019-12-03 23:52:26 +0100 | [diff] [blame] | 99 | COMMAND |
| 100 | ${CMAKE_COMMAND} -E env CLANG_LIBRARY_PATH=${CLANG_LIBRARY_PATH} |
| 101 | ${CPICKER_COMMAND} --config ${TEST_SOURCE} --root ${TF_A_PATH} > ${CPICKER_OUTPUT} |
Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 102 | DEPENDS ${TEST_SOURCE} ${CPICKER_DEPENDENCIES} |
| 103 | COMMENT "Generating c-picker output ${CPICKER_OUTPUT}" |
| 104 | ) |
| 105 | set(TEST_SOURCE ${CPICKER_OUTPUT}) |
| 106 | endif() |
| 107 | |
| 108 | target_sources(${TEST_NAME} PRIVATE ${TEST_SOURCE}) |
| 109 | endforeach() |
| 110 | |
Imre Kis | 590cd9c | 2020-01-08 16:51:57 +0100 | [diff] [blame] | 111 | target_include_directories(${TEST_NAME} PRIVATE ${TEST_INCLUDE_DIRECTORIES}) |
| 112 | target_compile_definitions(${TEST_NAME} PRIVATE ${TEST_COMPILE_DEFINITIONS}) |
Imre Kis | e32a103 | 2020-01-08 17:53:15 +0100 | [diff] [blame] | 113 | if (TEST_DEPENDS) |
| 114 | add_dependencies(${TEST_NAME} ${TEST_DEPENDS}) |
| 115 | endif() |
Imre Kis | ed98e9c | 2019-10-15 16:17:55 +0200 | [diff] [blame] | 116 | add_test(${TEST_NAME} ${TEST_NAME}) |
| 117 | endfunction() |