blob: a831d0f858f00cd590cd50f7c4dc2c37e6c8187d [file] [log] [blame] [edit]
set(MCU_LINKER_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/${MCU_LINKER_SCRIPT}")
set(USER_STARTUP ${CMAKE_CURRENT_LIST_DIR}/startup_user.s ${CMAKE_CURRENT_LIST_DIR}/startup_user.cpp)
function(blit_executable_common NAME)
target_link_libraries(${NAME} BlitEngine)
set_property(TARGET ${NAME} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-Map=${NAME}.map,--cref")
add_custom_command(TARGET ${NAME} POST_BUILD
COMMENT "Building ${NAME}.bin"
COMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${NAME}> ${NAME}.hex
COMMAND ${CMAKE_OBJCOPY} -O binary -S $<TARGET_FILE:${NAME}> ${NAME}.bin
COMMAND ${CMAKE_SIZE} $<TARGET_FILE:${NAME}>
COMMAND ${CMAKE_READELF} -S $<TARGET_FILE:${NAME}>
)
endfunction()
function(blit_executable NAME SOURCES)
message(STATUS "Processing ${NAME}")
set_source_files_properties(${USER_STARTUP} PROPERTIES LANGUAGE CXX)
add_executable(${NAME} ${USER_STARTUP} ${SOURCES} ${ARGN})
# Ideally we want the .blit filename to match the .elf, but TARGET_FILE_BASE_NAME isn't always available
# (This only affects the firmware updater as it's the only thing setting a custom OUTPUT_NAME)
if(${CMAKE_VERSION} VERSION_LESS "3.15.0")
set(BLIT_FILENAME ${NAME}.blit)
else()
set(BLIT_FILENAME $<TARGET_FILE_BASE_NAME:${NAME}>.blit)
endif()
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${BLIT_FILENAME}
DESTINATION bin
)
set_target_properties(${NAME} PROPERTIES
LINK_FLAGS "-specs=nano.specs -u _printf_float -fPIC -T ${MCU_LINKER_SCRIPT} ${MCU_LINKER_FLAGS_EXT} -Wl,--emit-relocs"
)
set_target_properties(${NAME} PROPERTIES LINK_DEPENDS ${MCU_LINKER_SCRIPT} SUFFIX ".elf")
blit_executable_common(${NAME})
target_link_libraries(${NAME} ${PIC_STDLIBS})
add_custom_command(TARGET ${NAME} POST_BUILD
COMMENT "Building ${NAME}.blit"
COMMAND ${PYTHON_EXECUTABLE} -m ttblit relocs --elf-file $<TARGET_FILE:${NAME}> --bin-file ${NAME}.bin --output ${BLIT_FILENAME}
)
add_custom_target(${NAME}.flash DEPENDS ${NAME} COMMAND ${PYTHON_EXECUTABLE} -m ttblit install --port=${FLASH_PORT} --launch ${CMAKE_CURRENT_BINARY_DIR}/${BLIT_FILENAME})
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 ${PYTHON_EXECUTABLE} -m ttblit cmake --config ${FILE} --cmake ${CMAKE_CURRENT_BINARY_DIR}/metadata.cmake)
include(${CMAKE_CURRENT_BINARY_DIR}/metadata.cmake)
if(${CMAKE_VERSION} VERSION_LESS "3.15.0")
set(BLIT_FILENAME ${TARGET}.blit)
else()
set(BLIT_FILENAME $<TARGET_FILE_BASE_NAME:${TARGET}>.blit)
endif()
add_custom_command(
TARGET ${TARGET} POST_BUILD
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${PYTHON_EXECUTABLE} -m ttblit metadata --config ${FILE} --file ${CMAKE_CURRENT_BINARY_DIR}/${BLIT_FILENAME}
)
# force relink on change so that the post-build commands are rerun
set_property(TARGET ${TARGET} APPEND PROPERTY LINK_DEPENDS ${FILE} ${METADATA_DEPENDS})
endfunction()