blob: bcfb234f357ac4a7cf432c18c113a1e7533a6e72 [file] [log] [blame]
Imre Kised98e9c2019-10-15 16:17:55 +02001#
2# Copyright (c) 2019, Arm Limited. All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6
7cmake_minimum_required(VERSION 3.11...3.15) # TODO: test with ubuntu
8project(tf-a-unit-tests)
9
10list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake)
11
12include(CTest)
13include(ExternalProject)
14include(FetchContent)
15
16# Configuration variables
17set(TF_A_PATH "" CACHE PATH "Path of the Trusted Firmware A directory")
18set(TF_A_UNIT_TESTS_PATH ${CMAKE_CURRENT_LIST_DIR} CACHE PATH "Path of root directory of the unit test repository")
19set(CPPUTEST_URL "https://github.com/cpputest/cpputest.git" CACHE STRING "CppUTest repository URL")
20set(CPPUTEST_REFSPEC "v3.8" CACHE STRING "CppUTest git refspec")
21set(CPPUTEST_INSTALL_PATH ${CMAKE_CURRENT_BINARY_DIR}/CppUTest_install CACHE PATH "CppUTest installation directory")
22set(CPPUTEST_PACKAGE_PATH ${CPPUTEST_INSTALL_PATH}/lib/CppUTest/cmake CACHE PATH "CppUTest CMake package directory")
23set(CPICKER_CACHE_PATH ${CMAKE_CURRENT_BINARY_DIR}/cpicker_cache CACHE PATH "Directory of c-picker generated file")
24set(UNIT_TEST_COMMON_SOURCES ${CMAKE_CURRENT_LIST_DIR}/common/main.cpp)
25set(CMAKE_CXX_STANDARD 11)
Imre Kisc0d4b442019-12-03 23:52:26 +010026set(CLANG_LIBRARY_PATH_HELP "libclang directory for c-picker")
Imre Kised98e9c2019-10-15 16:17:55 +020027
28# Checking TF-A
29if (NOT TF_A_PATH)
30 message(FATAL_ERROR "TF_A_PATH is not set")
31endif()
32
Imre Kisc0d4b442019-12-03 23:52:26 +010033# Trying to set CLANG_LIBRARY_PATH using the following methods
34# 1. Using cache or command line definition
35# Show warning if environment variable is also set but has different value
36# 2. Copying the value of CLANG_LIBRARY_PATH environment variable if set
37# 3. find_package (llvm-config, common paths or Windows registry)
38# If none of the above steps succeeded CMake emits a fatal error and stops
39if (DEFINED CLANG_LIBRARY_PATH)
40 message(STATUS "Using CLANG_LIBRARY_PATH from CMake variable (command line or cache)")
41
42 if (DEFINED ENV{CLANG_LIBRARY_PATH})
43 if (NOT (${CLANG_LIBRARY_PATH} STREQUAL $ENV{CLANG_LIBRARY_PATH}))
44 message(WARNING "Both CLANG_LIBRARY_PATH CMake and environment variables are set but have different values")
45 endif()
46 endif()
47else()
48 if (DEFINED ENV{CLANG_LIBRARY_PATH})
49 message(STATUS "Setting CLANG_LIBRARY_PATH based on environment variable")
50 set(CLANG_LIBRARY_PATH $ENV{CLANG_LIBRARY_PATH} CACHE PATH ${CLANG_LIBRARY_PATH_HELP})
51 else()
52 message(STATUS "Setting CLANG_LIBRARY_PATH based on find_package")
53 find_package(LibClang REQUIRED)
54 set(CLANG_LIBRARY_PATH ${LibClang_LIBRARY_DIRS} CACHE PATH ${CLANG_LIBRARY_PATH_HELP})
55 endif()
56endif()
57
58message(STATUS "CLANG_LIBRARY_PATH has been set to ${CLANG_LIBRARY_PATH}")
59
Imre Kised98e9c2019-10-15 16:17:55 +020060# Checking c-picker
61find_program(CPICKER_COMMAND "c-picker")
62if (NOT CPICKER_COMMAND)
63 message(FATAL_ERROR "Please install c-picker using pip")
64endif()
65
66# Checking git
67find_program(GIT_COMMAND "git")
68if (NOT GIT_COMMAND)
69 message(FATAL_ERROR "Please install git")
70endif()
71
72# Fetching CppUTest
73FetchContent_Declare(
74 cpputest
75 GIT_REPOSITORY ${CPPUTEST_URL}
76 GIT_TAG ${CPPUTEST_REFSPEC}
77 GIT_SHALLOW TRUE
78 PATCH_COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/common/cpputest-cmake-fix.patch
79)
80
81# FetchContent_GetProperties exports cpputest_SOURCE_DIR and cpputest_BINARY_DIR variables
82FetchContent_GetProperties(cpputest)
83if(NOT cpputest_POPULATED)
84 message(STATUS "Fetching CppUTest")
85 FetchContent_Populate(cpputest)
86endif()
87
88# Build and install CppUTest in CMake time. This makes us able to use CppUTest as a CMake package later.
89# Memory leak detection is turned off to avoid conflict with memcheck.
90execute_process(COMMAND
91 ${CMAKE_COMMAND}
92 -DMEMORY_LEAK_DETECTION=OFF
93 -DLONGLONG=ON
94 -DC++11=ON
95 -DCMAKE_INSTALL_PREFIX=${CPPUTEST_INSTALL_PATH}
96 -GUnix\ Makefiles
97 ${cpputest_SOURCE_DIR}
98 WORKING_DIRECTORY
99 ${cpputest_BINARY_DIR}
100)
101execute_process(COMMAND ${CMAKE_COMMAND} --build ${cpputest_BINARY_DIR} -- install -j)
102
103# Finding CppUTest package. CMake will check [package name]_DIR variable.
104set(CppUTest_DIR ${CPPUTEST_PACKAGE_PATH} CACHE PATH "Path of CppUTestConfig.cmake")
105find_package(CppUTest CONFIG REQUIRED)
106
107# find_package sets the CppUTest_INCLUDE_DIRS and CppUTest_LIBRARIES variables
108include_directories(${CppUTest_INCLUDE_DIRS})
109link_libraries(${CppUTest_LIBRARIES})
110
111# Project level include directory
112include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
113
114include(tests/lib/libc/test_libc.cmake)