# CMakeLists.txt - Main per-platform build script for sbc-harness project # # Copyright (C) 2024 Luke T. Shumaker # SPDX-License-Identifier: AGPL-3.0-or-later cmake_minimum_required(VERSION 3.30) if (NOT PICO_PLATFORM) message(FATAL_ERROR "PICO_PLATFORM must be specified; use the GNUmakefile to set this") endif() set(PICO_SDK_PATH "${CMAKE_SOURCE_DIR}/3rd-party/pico-sdk") if (PICO_PLATFORM STREQUAL "rp2040") set(PICO_CLIB "picolibc") add_library(pico_cxx_options INTERFACE) endif() include("${PICO_SDK_PATH}/external/pico_sdk_import.cmake") project(sbc_harness) pico_sdk_init() add_compile_options(-Wall -Wextra -Werror) function(target_embed_sources arg_target arg_hdrname) set(embed_objs) foreach(embed_src IN LISTS ARGN) add_custom_command( OUTPUT "${embed_src}.obj" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND mkdir -p -- "$" && ${CMAKE_LINKER} -r -b binary -o "${CMAKE_CURRENT_BINARY_DIR}/${embed_src}.obj" "${embed_src}" DEPENDS "${embed_src}" ) list(APPEND embed_objs "${embed_src}.obj") endforeach() set_source_files_properties("${embed_objs}" PROPERTIES EXTERNAL_OBJECT true GENERATED true ) set_source_files_properties("${arg_hdrname}" PROPERTIES GENERATED true ) add_custom_command( OUTPUT "${arg_hdrname}" COMMAND "${CMAKE_SOURCE_DIR}/build-aux/embed-sources.h.gen" "${embed_objs}" >"${arg_hdrname}" COMMAND_EXPAND_LISTS DEPENDS "${embed_objs}" "${CMAKE_SOURCE_DIR}/build-aux/embed-sources.h.gen" ) target_sources("${arg_target}" PRIVATE "${embed_objs}" "${arg_hdrname}") endfunction() function(add_stack_analysis arg_outfile arg_objlib_target) target_compile_options("${arg_objlib_target}" PUBLIC "-fcallgraph-info=su,da") set_source_files_properties("${arg_outfile}" PROPERTIES GENERATED true ) add_custom_command( OUTPUT "${arg_outfile}" COMMAND "${CMAKE_SOURCE_DIR}/build-aux/stack.c.gen" "$" >"${arg_outfile}" COMMAND_EXPAND_LISTS DEPENDS "$" "${CMAKE_SOURCE_DIR}/build-aux/stack.c.gen" COMMENT "Calculating ${arg_objlib_target} required stack sizes" ) endfunction() if (PICO_PLATFORM STREQUAL "rp2040") set(TESTS ON) add_subdirectory(3rd-party/picolibc) foreach(lib IN ITEMS pico_clib_interface) # cpp target_include_directories(${lib} INTERFACE ${CMAKE_BINARY_DIR}/3rd-party/picolibc/picolibc/include) target_compile_definitions(${lib} INTERFACE PICO_RUNTIME_NO_INIT_PER_CORE_TLS_SETUP=1 PICO_RUNTIME_SKIP_INIT_PER_CORE_TLS_SETUP=1 ) # cc target_compile_options(${lib} INTERFACE --specs=${CMAKE_BINARY_DIR}/3rd-party/picolibc/picolibc.specs) target_compile_options(${lib} INTERFACE -nolibc) # ld target_link_options( ${lib} INTERFACE --specs=${CMAKE_BINARY_DIR}/3rd-party/picolibc/picolibc.specs) target_link_options( ${lib} INTERFACE -nolibc -lgcc) target_link_libraries( ${lib} INTERFACE c) endforeach() target_link_options( bs2_default PRIVATE --specs=${CMAKE_BINARY_DIR}/3rd-party/picolibc/picolibc.specs -nolibc -lgcc) target_link_libraries( bs2_default c) endif() add_subdirectory(libcr) add_subdirectory(libcr_ipc) add_subdirectory(libmisc) add_subdirectory(libhw) add_subdirectory(libdhcp) add_subdirectory(libusb) add_subdirectory(lib9p) add_subdirectory(cmd/sbc_harness) add_subdirectory(cmd/srv9p)