cmake_minimum_required(VERSION 3.22)
project(bootloader)
enable_language(C ASM)

# Setup compiler settings
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)

# Define the build type
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
endif()

# Include toolchain file
include("gcc-arm-none-eabi.cmake")

# Enable compile command to ease indexing with e.g. clangd
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
message("Build type: " ${CMAKE_BUILD_TYPE})

add_executable(bootloader)

target_sources(bootloader PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common/cpu_endian.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common/os_port_none.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common/date_time.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common/str.c

        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/core/crc32.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/drivers/mcu_core/stm32h7xx_mcu_driver.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/drivers/flash/internal/stm32h7xx_flash_driver.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/modules/image/image.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/modules/memory/memory.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/modules/security/cipher.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/bootloader/second_stage/boot.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/bootloader/second_stage/boot_common.c

        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_crypto/hash/sha256.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_crypto/cipher/aes.c

        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards/stm32h7xx_nucleo/stm32h7xx_nucleo.c

        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_adc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_adc_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_cec.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_comp.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_cortex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_crc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_crc_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_cryp.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_cryp_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dac.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dac_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dcmi.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dfsdm.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dma.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dma_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dma2d.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dsi.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_exti.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_fdcan.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_flash.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_flash_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_gpio.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_hash.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_hash_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_hcd.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_hrtim.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_hsem.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_i2c.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_i2c_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_i2s.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_i2s_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_irda.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_iwdg.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_jpeg.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_lptim.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_ltdc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_ltdc_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_mdios.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_mdma.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_mmc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_mmc_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_nand.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_nor.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_opamp.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_opamp_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_pcd.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_pcd_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_pwr.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_pwr_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_qspi.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_ramecc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_rcc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_rcc_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_rng.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_rtc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_rtc_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_sai.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_sai_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_sd.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_sdram.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_sd_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_smartcard.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_smartcard_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_smbus.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_spdifrx.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_spi.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_spi_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_sram.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_swpmi.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_tim.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_tim_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_uart.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_uart_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_usart.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_usart_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_wwdg.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_adc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_bdma.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_comp.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_crc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_dac.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_delayblock.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_dma.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_dma2d.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_exti.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_fmc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_gpio.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_hrtim.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_i2c.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_lptim.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_lpuart.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_mdma.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_opamp.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_pwr.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_rcc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_rng.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_rtc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_sdmmc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_spi.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_swpmi.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_tim.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_usart.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_usb.c

        ${CMAKE_CURRENT_SOURCE_DIR}/startup_stm32h743xx.S
        ${CMAKE_CURRENT_SOURCE_DIR}/syscalls.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../src/system_stm32h7xx.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../src/stm32h7xx_it.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../src/main.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../src/debug.c
)

target_include_directories(bootloader PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/../src
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/cmsis/include
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/devices/stm32h7xx
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/inc
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards/stm32h7xx_nucleo
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/freertos/include

        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_crypto
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/modules
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/bootloader
)

target_compile_definitions(bootloader PRIVATE
    STM32H743xx
    USE_HAL_DRIVER
    USE_NUCLEO_H743ZI2
    STM32H743xI

    $<$<CONFIG:Debug>:DEBUG>
)

# Add the map file to the list of files to be removed with 'clean' target
set_target_properties(bootloader PROPERTIES ADDITIONAL_CLEAN_FILES ${CMAKE_PROJECT_NAME}.map)

# Convert .elf to .bin
add_custom_command(TARGET bootloader POST_BUILD
        COMMAND ${CMAKE_OBJCOPY} -O binary
        ${CMAKE_CURRENT_BINARY_DIR}/bootloader.elf
        ${CMAKE_CURRENT_BINARY_DIR}/bootloader.bin
        COMMENT "Generating binary file from ELF"
)

# Copy the generated .bin file to ../
add_custom_command(TARGET bootloader POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy
            ${CMAKE_CURRENT_BINARY_DIR}/bootloader.bin
            ${CMAKE_CURRENT_SOURCE_DIR}/../
    COMMENT "Copying bootloader.bin to parent directory"
)
