cmake_minimum_required(VERSION 3.21) include(CheckLinkerFlag) project(mnrs-bsp LANGUAGES ASM C) option(NO_INIT "use an empty init routine" OFF) set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/env/${BOARD}/link.lds" CACHE FILEPATH "Linker script to use for BSP linking") get_filename_component(LINKER_SCRIPT_DIR "${LINKER_SCRIPT}" DIRECTORY) set(BSP_STARTUP "${CMAKE_CURRENT_SOURCE_DIR}/env/start.S" CACHE FILEPATH "Path to the BSP startup assembly file") set(BSP_TRAP_HANDLER "${CMAKE_CURRENT_SOURCE_DIR}/env/entry.S" CACHE FILEPATH "Assembly file implementing trap handler") if(NOT DEFINED BOARD) message(FATAL_ERROR "No Board selected") endif() add_compile_definitions("BOARD_${BOARD}") set(TESTBENCHES "rtl" "TGCP") list(FIND TESTBENCHES ${BOARD} _index) if(NOT _index EQUAL -1) set(BOARD "testbench/${BOARD}") endif() option(SEMIHOSTING "Enable semihosting support" OFF) if(SEMIHOSTING) add_compile_definitions(SEMIHOSTING) endif() add_library(startup STATIC ${BSP_STARTUP} ${BSP_TRAP_HANDLER}) target_include_directories(startup PUBLIC env include) add_subdirectory(libwrap) add_library(runtime STATIC env/${BOARD}/init.c) target_include_directories(runtime PUBLIC env/${BOARD} env include) if(NO_INIT) target_compile_definitions(runtime PRIVATE NO_INIT) endif() check_linker_flag(C "LINKER:--no-warn-rwx-segments" HAS_NO_WARN_RWX_SEGMENTS) if(HAS_NO_WARN_RWX_SEGMENTS) target_link_options(runtime INTERFACE LINKER:--no-warn-rwx-segments) endif() target_link_options(runtime INTERFACE LINKER: -nostartfiles -T ${LINKER_SCRIPT} -L${LINKER_SCRIPT_DIR}) if(SEMIHOSTING) target_sources(runtime INTERFACE env/semihosting.c env/trap.c) endif() add_library(bsp INTERFACE) target_link_libraries(bsp INTERFACE startup runtime wrap)