cmake_minimum_required(VERSION 3.15)
set(PROJ_NAME "bootloader")
set(BIN_FILE ${PROJ_NAME}.bin)
set(ASM_FILE ${PROJ_NAME}.asm)
project(${PROJ_NAME} VERSION 0.1)
set(SDK_PATH ${CMAKE_CURRENT_SOURCE_DIR}/..)
set(BOOTLOADER_PATH ${CMAKE_CURRENT_SOURCE_DIR})

# toolchain path
# set(TOOLCHAIN ${CROSS_COMPILE})
set(CMAKE_C_COMPILER "${TOOLCHAIN}gcc")
set(CMAKE_ASM_COMPILER "${TOOLCHAIN}gcc")
set(CMAKE_OBJCOPY "${TOOLCHAIN}objcopy")
set(CMAKE_OBJDUMP "${TOOLCHAIN}objdump")
set(CMAKE_AR "${TOOLCHAIN}ar")
set(CMAKE_RANLIB "${TOOLCHAIN}ranlib")
set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/flash.ld")

enable_language(ASM)
add_executable(${PROJ_NAME}.elf main.c)
target_sources(${PROJ_NAME}.elf PUBLIC start.S)

set(CMAKE_C_FLAGS "                            \
-mcpu=cortex-m7                                \
-mthumb                                        \
-g3                                            \
-O2                                            \
-Wall                                          \
-nostartfiles                                  \
-mfloat-abi=hard                               \
-mfpu=fpv5-d16                                 \
-ffunction-sections                            \
-fdata-sections                                \
")

set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS}")

set(CMAKE_EXE_LINKER_FLAGS "                   \
-ffunction-sections                            \
-fdata-sections                                \
-Wl,--gc-sections                              \
-T${LINKER_SCRIPT}                             \
-Wl,-Map=${PROJ_NAME}.map                      \
--specs=nano.specs                             \
-Wl,--print-memory-usage                       \
-Wl,--print-output-format                      \
")

add_definitions(-DSTM32H750xx)

add_subdirectory(${SDK_PATH}/driver driver)
add_subdirectory(${SDK_PATH}/component component)
add_subdirectory(${BOOTLOADER_PATH}/src src)

target_link_libraries(${PROJ_NAME}.elf driver)
target_link_libraries(${PROJ_NAME}.elf component)
target_link_libraries(${PROJ_NAME}.elf src)

add_custom_command(TARGET ${PROJ_NAME}.elf POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJ_NAME}.elf> ${BIN_FILE}
    COMMAND ${CMAKE_OBJDUMP} -d -S $<TARGET_FILE:${PROJ_NAME}.elf> >${ASM_FILE}
    # COMMENT "Generate ${BIN_FILE}\r\n"
    COMMAND echo "Calculating SHA-256 checksum for ${BIN_FILE}:"
    COMMAND sha256sum ${BIN_FILE}
)

# get git tag
execute_process(
    COMMAND git describe --abbrev=40 --tags --dirty --always
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    OUTPUT_VARIABLE GIT_TAG
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_QUIET
)
if(GIT_TAG)
    set(PROJECT_SDK_VERSION ${GIT_TAG})
else()
    message(WARNING "No Valid version info found for SDK!")
    set(PROJECT_SDK_VERSION "version-unknown-panic")
endif()
message(STATUS "Project SDK Version: ${PROJECT_SDK_VERSION}")
