blob: 9c44ca7713c7d908d65c11b925d5e7dfb566c0ab [file] [log] [blame]
#-------------------------------------------------------------------------------
# Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
# Import libpsats into a dependent in-tree deployment build. Where another
# deployment uses libpsats, including this file in the dependent deployment
# CMake build file allows libpsats to be built and installed into the binary
# directory of the dependent.
#-------------------------------------------------------------------------------
option(CFG_FORCE_PREBUILT_LIBPSATS Off)
# Try to find a pre-build package.
version_semver_read(FILE "${CMAKE_CURRENT_LIST_DIR}/version.txt" MAJOR _major MINOR _minor PATCH _patch)
set(_verstring "${_major}.${_minor}.${_patch}")
if (COVERAGE)
set(LIBPSATS_BUILD_TYPE "DebugCoverage" CACHE STRING "Build type." FORCE)
endif()
find_package(libpsats "${_verstring}" QUIET PATHS ${CMAKE_CURRENT_BINARY_DIR}/libpsats_install/${TS_ENV}/lib/cmake/libpsats)
if(NOT libpsats_FOUND)
if (CFG_FORCE_PREBUILT_LIBPSATS)
string(CONCAT _msg "find_package() failed to find the \"libpsats\" package. Please pass -Dlibpsats_ROOT=<full path>"
" to cmake, where <full path> is the directory of the libpsatsConfig.cmake file, or "
" pass -DCMAKE_FIND_ROOT_PATH=<path>, where <path> is the INSTALL_PREFIX used"
" when building libpsats. libpsats_ROOT can be set in the environment too."
"If you wish to debug the search process pass -DCMAKE_FIND_DEBUG_MODE=ON to cmake.")
message(FATAL_ERROR ${_msg})
endif()
# Set build type, if a specific value is required. This leaves the default value in the hands of the
# libpsats deployment being built.
if (DEFINED LIBPSATS_BUILD_TYPE)
set(_libpsats_build_type_arg "-DCMAKE_BUILD_TYPE=${LIBPSATS_BUILD_TYPE}")
endif()
# If not successful, build libpsats as a sub-project.
execute_process(COMMAND
${CMAKE_COMMAND} -E env "CROSS_COMPILE=${CROSS_COMPILE}"
${CMAKE_COMMAND}
${_libpsats_build_type_arg}
-S ${TS_ROOT}/deployments/libpsats/${TS_ENV}
-B ${CMAKE_CURRENT_BINARY_DIR}/libpsats
RESULT_VARIABLE
_exec_error
)
unset(_libpsats_build_type_arg)
if (NOT _exec_error EQUAL 0)
message(FATAL_ERROR "Configuring libpsats failed. ${_exec_error}")
endif()
execute_process(COMMAND
${CMAKE_COMMAND} -E env "CROSS_COMPILE=${CROSS_COMPILE}"
${CMAKE_COMMAND}
--build ${CMAKE_CURRENT_BINARY_DIR}/libpsats
--parallel ${PROCESSOR_COUNT}
RESULT_VARIABLE
_exec_error
)
if (NOT _exec_error EQUAL 0)
message(FATAL_ERROR "Installing libpsats failed. ${_exec_error}")
endif()
execute_process(COMMAND
${CMAKE_COMMAND} -E env "CROSS_COMPILE=${CROSS_COMPILE}"
${CMAKE_COMMAND}
--install ${CMAKE_CURRENT_BINARY_DIR}/libpsats
--prefix ${CMAKE_CURRENT_BINARY_DIR}/libpsats_install
RESULT_VARIABLE
_exec_error
)
if (NOT _exec_error EQUAL 0)
message(FATAL_ERROR "Installing libpsats failed. ${_exec_error}")
endif()
install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/libpsats/cmake_install.cmake)
find_package(libpsats "${_verstring}" QUIET REQUIRED PATHS ${CMAKE_CURRENT_BINARY_DIR}/libpsats_install/${TS_ENV}/lib/cmake/libpsats)
else()
message(STATUS "Using prebuilt libpsats from ${libpsats_DIR}")
endif()
# Cmake will use the same build type of the imported target as used by the main project. If no mapping is configured and
# the matching build type is not found, cmake will fall back to any build type. Details of the fall back mechanism are not
# documented.
# If a mapping is defined, and the imported target does not define the mapped build type, cmake will treat the library
# as not found.
#
# If LIBPSATS_BUILD_TYPE is set and the main project wants to use a specific build type, configure build type mapping to
# only allow using the requested build type.
if (DEFINED LIBPSATS_BUILD_TYPE)
set_target_properties(libpsats::psats PROPERTIES
MAP_IMPORTED_CONFIG_DEBUG ${LIBPSATS_BUILD_TYPE}
MAP_IMPORTED_CONFIG_MINSIZEREL ${LIBPSATS_BUILD_TYPE}
MAP_IMPORTED_CONFIG_MINSIZWITHDEBINFO ${LIBPSATS_BUILD_TYPE}
MAP_IMPORTED_CONFIG_RELEASE ${LIBPSATS_BUILD_TYPE}
MAP_IMPORTED_CONFIG_RELWITHDEBINFO ${LIBPSATS_BUILD_TYPE}
MAP_IMPORTED_CONFIG_DEBUGCOVERAGE ${LIBPSATS_BUILD_TYPE}
)
# Do a manual check and issue a better message than the default one.
get_property(_libpsats_build_type TARGET libpsats::psats PROPERTY IMPORTED_CONFIGURATIONS)
string(TOUPPER ${LIBPSATS_BUILD_TYPE} _uc_libpsats_build_type)
if(${_uc_libpsats_build_type} IN_LIST _libpsats_build_type)
else()
message(FATAL_ERROR "Installed libpsats package does not supports required build type ${LIBPSATS_BUILD_TYPE}.")
endif()
unset(_libpsats_build_type)
unset(_uc_libpsats_build_type)
endif()
# libpsats can not be used without libts, so add the needed dependency.
include(${TS_ROOT}/deployments/libts/libts-import.cmake)
target_link_libraries(libpsats::psats INTERFACE libts::ts)