pico_add_library(pico_runtime) target_sources(pico_runtime INTERFACE ${CMAKE_CURRENT_LIST_DIR}/runtime.c ) target_include_directories(pico_runtime_headers SYSTEM INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include) pico_mirrored_target_link_libraries(pico_runtime INTERFACE pico_base pico_runtime_init ) if (TARGET hardware_gpio_headers) target_link_libraries(pico_runtime INTERFACE hardware_gpio_headers) # to determine if we should init GPIO copro endif() if (TARGET hardware_riscv_headers) target_link_libraries(pico_runtime INTERFACE hardware_riscv_headers) endif() set(PICO_RUNTIME_LIBRARIES hardware_uart pico_bit_ops pico_divider pico_double pico_int64_ops pico_float pico_malloc pico_mem_ops pico_atomic pico_cxx_options pico_standard_binary_info pico_standard_link pico_sync pico_printf pico_crt0 pico_clib_interface pico_stdio ) foreach(LIB IN LISTS PICO_RUNTIME_LIBRARIES) if (TARGET ${LIB}) pico_mirrored_target_link_libraries(pico_runtime INTERFACE ${LIB}) endif() endforeach() # todo is this correct/needed? if (PICO_C_COMPILER_IS_GNU) target_link_options(pico_runtime INTERFACE "--specs=nosys.specs") elseif (PICO_C_COMPILER_IS_CLANG) # target_link_options(pico_runtime INTERFACE "-nostdlib") endif() # pico_minimize_runtime((INCLUDE ...) (EXCLUDE ...)) # # INCLUDE/EXCLUDE can contain any of the following (all defaulting to not included) # # DEFAULT_ALARM_POOL - default alarm pool setup # PRINTF - full printf support # PRINTF_MINIMAL - printf support without the following # PRINTF_FLOAT - to control float support if printf is enabled # PRINTF_EXPONENTIAL # PRINTF_LONG_LONG # PRINTF_PTRDIFF_T # FLOAT - support for single-precision floating point # DOUBLE - support for double-precision floating point # FPGA_CHECK - checks for FPGA which allows Raspberry Pi to run your binary on FPGA function(pico_minimize_runtime TARGET) cmake_parse_arguments(RUNTIME "" "" "INCLUDE;EXCLUDE" ${ARGN} ) foreach (INCL_EXCL IN ITEMS INCLUDE EXCLUDE) if (INCL_EXCL STREQUAL "INCLUDE") set(VAL 1) else() set(VAL 0) endif() foreach(VAR IN LISTS RUNTIME_${INCL_EXCL}) set(RUNTIME_INCLUDE_${VAR} ${VAL}) endforeach () endforeach () if (NOT RUNTIME_INCLUDE_DEFAULT_ALARM_POOL) target_compile_definitions(${TARGET} PRIVATE PICO_TIME_DEFAULT_ALARM_POOL_DISABLED=1) endif() if (NOT RUNTIME_INCLUDE_FLOAT) pico_set_float_implementation(${TARGET} none) endif() if (NOT RUNTIME_INCLUDE_DOUBLE) pico_set_double_implementation(${TARGET} none) endif() if (NOT RUNTIME_INCLUDE_AUTO_INIT_MUTEX) target_compile_definitions(${TARGET} PRIVATE PICO_RUNTIME_SKIP_INIT_MUTEX=1) endif() if (RUNTIME_INCLUDE_PRINTF) if (NOT RUNTIME_INCLUDE_PRINTF_MINIMAL) set( RUNTIME_INCLUDE_PRINTF_FLOAT 1) set( RUNTIME_INCLUDE_PRINTF_EXPONENTIAL 1) set( RUNTIME_INCLUDE_PRINTF_LONG_LONG 1) set( RUNTIME_INCLUDE_PRINTF_PTRDIFF_T 1) endif() if (NOT RUNTIME_INCLUDE_PRINTF_FLOAT) target_compile_definitions(${TARGET} PRIVATE PICO_PRINTF_SUPPORT_FLOAT=0) endif() if (NOT RUNTIME_INCLUDE_PRINTF_EXPONENTIAL) target_compile_definitions(${TARGET} PRIVATE PICO_PRINTF_SUPPORT_EXPONENTIAL=0) endif() if (NOT RUNTIME_INCLUDE_PRINTF_LONG_LONG) target_compile_definitions(${TARGET} PRIVATE PICO_PRINTF_SUPPORT_LONG_LONG=0) endif() if (NOT RUNTIME_INCLUDE_PRINTF_PTRDIFF_T) target_compile_definitions(${TARGET} PRIVATE PICO_PRINTF_SUPPORT_PTRDIFF_T=0) endif() else() pico_set_printf_implementation(${TARGET} none) endif() if (NOT RUNTIME_INCLUDE_FPGA_CHECK) target_compile_definitions(${TARGET} PRIVATE PICO_NO_FPGA_CHECK=1) endif() endfunction()