zephyr/cmake/modules/FindBabbleSim.cmake

98 lines
3.8 KiB
CMake
Raw Permalink Normal View History

# Copyright (c) 2023 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0
# FindBabbleSim module for locating BabbleSim
#
# The module defines the following variables:
#
# 'BSIM_COMPONENTS_PATH'
# Path to the BabbleSim components source folder
#
# 'BSIM_OUT_PATH'
# Path to the BabbleSim build output root path (under which libraries and binaries) are kept
#
# We first try to find it via the environment variables BSIM_OUT_PATH and BSIM_COMPONENTS_PATH.
# If these are not set, as a fallback we attempt to find it through west, in case the user
# fetched babblesim using the manifest.
# Note that what we find through the environment variables is meant to have precedence.
#
# If BabbleSim cannot be found we error right away with a message trying to guide users
zephyr_get(BSIM_COMPONENTS_PATH)
zephyr_get(BSIM_OUT_PATH)
if ((DEFINED WEST) AND (NOT DEFINED BSIM_COMPONENTS_PATH) AND (NOT DEFINED BSIM_OUT_PATH))
# Let's ask west for the bsim_project existence and its path
execute_process(COMMAND ${WEST}
status babblesim_base
OUTPUT_QUIET
ERROR_QUIET
RESULT_VARIABLE ret_val1)
execute_process(COMMAND ${WEST}
list babblesim_base -f {posixpath}
OUTPUT_VARIABLE BSIM_BASE_PATH
ERROR_QUIET
RESULT_VARIABLE ret_val2)
if (NOT (${ret_val1} OR ${ret_val2}))
string(STRIP ${BSIM_BASE_PATH} BSIM_COMPONENTS_PATH)
get_filename_component(BSIM_OUT_PATH ${BSIM_COMPONENTS_PATH}/.. ABSOLUTE)
endif()
endif()
message(STATUS "Using BSIM from BSIM_COMPONENTS_PATH=${BSIM_COMPONENTS_PATH}\
BSIM_OUT_PATH=${BSIM_OUT_PATH}")
if ((NOT DEFINED BSIM_COMPONENTS_PATH) OR (NOT DEFINED BSIM_OUT_PATH))
message(FATAL_ERROR "This board requires the BabbleSim simulator. Please either\n\
a) Enable the west babblesim group with\n\
west config manifest.group-filter +babblesim && west update\n\
and build it with\n\
cd ${ZEPHYR_BASE}/../tools/bsim\n\
make everything -j 8\n\
OR\n\
b) set the environment variable BSIM_COMPONENTS_PATH to point to your own bsim installation\n\
`components/` folder, *and* BSIM_OUT_PATH to point to the folder where the simulator\n\
is compiled to.\n\
More information can be found in https://babblesim.github.io/folder_structure_and_env.html"
)
endif()
#Many apps cmake files (in and out of tree) expect these environment variables. Lets provide them:
set(ENV{BSIM_COMPONENTS_PATH} ${BSIM_COMPONENTS_PATH})
set(ENV{BSIM_OUT_PATH} ${BSIM_OUT_PATH})
# Let's check that it is new enough and built,
# so we provide better information to users than a compile error:
# Internal function to print a descriptive error message
# Do NOT use it outside of this module. It uses variables internal to it
function(bsim_handle_not_built_error)
get_filename_component(BSIM_ROOT_PATH ${BSIM_COMPONENTS_PATH}/.. ABSOLUTE)
message(FATAL_ERROR "Please ensure you have the latest babblesim and rebuild it."
"If you got it from Zephyr's manifest, you can do:\n\
west update\n\
cd ${BSIM_ROOT_PATH}; make everything -j 8\n"
)
endfunction(bsim_handle_not_built_error)
# Internal function to check that a bsim component is at least the desired version
# Do NOT use it outside of this module. It uses variables internal to it
function(bsim_check_build_version bs_comp req_comp_ver)
set(version_file ${BSIM_OUT_PATH}/lib/${bs_comp}.version)
if (EXISTS ${version_file})
file(READ ${version_file} found_version)
string(STRIP ${found_version} found_version)
else()
message(WARNING "BabbleSim was never compiled (${version_file} not found)")
bsim_handle_not_built_error()
endif()
if (found_version VERSION_LESS req_comp_ver)
message(WARNING
"Built ${bs_comp} version = ${found_version} < ${req_comp_ver} (required version)")
bsim_handle_not_built_error()
endif()
endfunction(bsim_check_build_version)
bsim_check_build_version(bs_2G4_phy_v1 2.4)