blob: 4ef35406bbc4b370b9d53bb5c7754e7f8942e2a2 [file] [log] [blame]
cmake_policy(SET CMP0079 NEW) # target_link_libraries() allows use with targets in other directories.
set(CMAKE_C_STANDARD 11)
# Initialise the Pico SDK
set(PICO_BOARD_HEADER_DIRS ${CMAKE_CURRENT_LIST_DIR}/board)
include (${CMAKE_CURRENT_LIST_DIR}/pico_sdk_import.cmake)
set(32BLIT_PICO 1)
if(PICO_PLATFORM MATCHES "^rp2350")
set(32BLIT_PICO_2350 1)
endif()
# make sure BlitEngine is built with the right exception flags
target_link_libraries(BlitEngine PUBLIC pico_cxx_options pico_base_headers)
# also enable function/data sectons
target_compile_options(BlitEngine PRIVATE -ffunction-sections -fdata-sections)
include(${CMAKE_CURRENT_LIST_DIR}/board-config.cmake)
# late SDK init
# (pico_sdk_init needs to be after importing extras, which we don't know if we'll need until now)
if(BLIT_REQUIRE_PICO_EXTRAS)
include(${CMAKE_CURRENT_LIST_DIR}/pico_extras_import.cmake)
endif()
pico_sdk_init()
# some file paths we need later
if(32BLIT_PICO_2350)
set(LINKER_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/memmap_blit_2350.ld.in)
else()
set(LINKER_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/memmap_blit.ld.in)
endif()
set(STARTUP_SRC ${CMAKE_CURRENT_LIST_DIR}/startup.S ${CMAKE_CURRENT_LIST_DIR}/startup.cpp)
set(LAUNCHERSHARED_DIR ${CMAKE_CURRENT_LIST_DIR}/../launcher-shared)
set(HAL_DIR ${CMAKE_CURRENT_LIST_DIR})
# functions
function(blit_executable NAME)
message(STATUS "Processing ${NAME}")
blit_executable_args(${ARGN})
add_executable(${NAME} ${SOURCES})
target_link_libraries(${NAME} BlitEngine pico_platform_headers)
if(PICO_STANDALONE_UF2)
# standalone .uf2
if(NOT TARGET BlitHalPico)
add_subdirectory(${HAL_DIR} 32blit-pico)
endif()
if(NOT TARGET LauncherShared)
add_subdirectory(${LAUNCHERSHARED_DIR} launcher-shared)
endif()
pico_enable_stdio_uart(${NAME} 1)
if(NOT BLIT_USB_DRIVER STREQUAL "host")
pico_enable_stdio_usb(${NAME} 1)
# re-enable baud rate reset (we don't define our own tud_cdc_line_coding_cb)
# we have to set all the defines to compile? (something broken with the defaults?)
target_compile_definitions(${NAME} PRIVATE PICO_STDIO_USB_ENABLE_RESET_VIA_BAUD_RATE=1 PICO_STDIO_USB_RESET_MAGIC_BAUD_RATE=1200 PICO_STDIO_USB_RESET_BOOTSEL_INTERFACE_DISABLE_MASK=0)
endif()
target_compile_definitions(${NAME} PRIVATE BLIT_PICO_STANDALONE=1 PICO_EMBED_XIP_SETUP=1)
target_link_libraries(${NAME} BlitHalPico)
pico_add_extra_outputs(${NAME})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.uf2
DESTINATION bin
)
elseif(PICO_BLIT)
# loadable .blit
set_property(TARGET ${NAME} PROPERTY BLIT_PICO_BLIT TRUE)
# calculate and verify flash offset
if(NOT PICO_BLIT_OFFSET_KB)
if(32BLIT_PICO_2350)
# if we build the file for a 4MB offset, we can use address translation
set(PICO_BLIT_OFFSET_KB 4096)
else()
set(PICO_BLIT_OFFSET_KB 512)
endif()
endif()
math(EXPR offset_mod "${PICO_BLIT_OFFSET_KB} % 64")
if(${PICO_BLIT_OFFSET_KB} LESS 256 OR offset_mod)
message(FATAL_ERROR "Blit offset should be >= 256k and a multiple of 64k")
endif()
math(EXPR FLASH_OFFSET_BYTES "${PICO_BLIT_OFFSET_KB} * 1024")
# customise linker script
configure_file(${LINKER_SCRIPT} memmap_blit.ld)
set(LINKER_SCRIPT_OUT ${CMAKE_CURRENT_BINARY_DIR}/memmap_blit.ld)
target_compile_definitions(${NAME} PRIVATE ${BLIT_BOARD_DEFINITIONS}) # need these for framebuffer config
target_compile_options(${NAME} PRIVATE -ffunction-sections -fdata-sections)
# set device id in header, these should match the BlitDevice enum
if(32BLIT_PICO_2350)
set_source_files_properties(${STARTUP_SRC} PROPERTIES COMPILE_DEFINITIONS DEVICE_ID=3)
else()
set_source_files_properties(${STARTUP_SRC} PROPERTIES COMPILE_DEFINITIONS DEVICE_ID=2)
endif()
# minimal pico-sdk libs
target_link_libraries(${NAME} boot_picobin_headers pico_bit_ops pico_clib_interface pico_cxx_options pico_divider pico_double pico_int64_ops pico_float pico_malloc pico_mem_ops pico_runtime_headers)
target_compile_definitions(${NAME} PRIVATE PICO_TIME_DEFAULT_ALARM_POOL_DISABLED) # avoid pulling timer and irq code
target_link_options(${NAME} PRIVATE --specs=nosys.specs LINKER:--script=${LINKER_SCRIPT_OUT} LINKER:--gc-sections)
set_property(TARGET ${NAME} APPEND PROPERTY LINK_DEPENDS ${LINKER_SCRIPT_OUT})
target_sources(${NAME} PRIVATE ${STARTUP_SRC})
pico_add_bin_output(${NAME})
pico_add_dis_output(${NAME})
set(BLIT_FILENAME $<TARGET_FILE_BASE_NAME:${NAME}>.blit)
# no relocs, just copy it
set(BIN_NAME "$<IF:$<BOOL:$<TARGET_PROPERTY:${NAME},OUTPUT_NAME>>,$<TARGET_PROPERTY:${NAME},OUTPUT_NAME>,$<TARGET_PROPERTY:${NAME},NAME>>.bin")
add_custom_command(TARGET ${NAME} POST_BUILD
VERBATIM
COMMENT "Building ${NAME}.blit"
COMMAND cp ${BIN_NAME} ${BLIT_FILENAME}
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${BLIT_FILENAME}
DESTINATION bin
)
endif()
endfunction()
function(blit_metadata TARGET FILE)
if(NOT IS_ABSOLUTE ${FILE})
set(FILE ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
endif()
# cause cmake to reconfigure whenever the asset list changes
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${FILE})
# get the inputs/outputs for the asset tool (at configure time)
execute_process(
COMMAND ${32BLIT_TOOLS_EXECUTABLE} cmake --config ${FILE} --cmake ${CMAKE_CURRENT_BINARY_DIR}/metadata.cmake
RESULT_VARIABLE TOOL_RESULT
)
if(${TOOL_RESULT})
message(FATAL_ERROR "Reading metadata config failed!\n")
endif()
include(${CMAKE_CURRENT_BINARY_DIR}/metadata.cmake)
get_property(PICO_BLIT TARGET ${TARGET} PROPERTY BLIT_PICO_BLIT)
if(NOT PICO_BLIT)
# create metadata/binary info source at build time
set(METADATA_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_binary_info.cpp")
add_custom_command(
OUTPUT ${METADATA_SOURCE}
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${32BLIT_TOOLS_EXECUTABLE} metadata --force --config ${FILE} --pico-bi ${METADATA_SOURCE}
DEPENDS ${FILE}
VERBATIM
)
# add the generated source
target_sources(${TARGET} PRIVATE ${METADATA_SOURCE})
# avoid the fallback to target name
target_compile_definitions(${TARGET} PRIVATE PICO_NO_BI_PROGRAM_NAME=1)
else()
# real .blit metadata
set(BLIT_FILENAME $<TARGET_FILE_BASE_NAME:${TARGET}>.blit)
add_custom_command(
TARGET ${TARGET} POST_BUILD
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${32BLIT_TOOLS_EXECUTABLE} metadata --config ${FILE} --file ${CMAKE_CURRENT_BINARY_DIR}/${BLIT_FILENAME}
VERBATIM
)
# force relink on change so that the post-build commands are rerun
set_property(TARGET ${TARGET} APPEND PROPERTY LINK_DEPENDS ${FILE} ${METADATA_DEPENDS})
endif()
endfunction()