cmake_minimum_required(VERSION 3.22)
project(iap_demo)

set(SRC_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/)
set(COMMON ${SRC_ROOT}/common)
set(CRYPTO ${SRC_ROOT}/cyclone_crypto)
set(UPDATE ${SRC_ROOT}/cyclone_boot)
set(TCP ${SRC_ROOT}/cyclone_tcp)
set(THIRD_PARTY ${CMAKE_SOURCE_DIR}/../../../../../third_party)
set(TOOLS ${CMAKE_SOURCE_DIR}/../../../../../tools)

set(RESOURCE_COMPILER ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../tools/ResourceCompiler)

# 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(iap_demo)

target_sources(iap_demo PRIVATE
        ${COMMON}/cpu_endian.c
        ${COMMON}/os_port_freertos.c
        ${COMMON}/date_time.c
        ${COMMON}/str.c
        ${COMMON}/path.c
        ${COMMON}/resource_manager.c
        ${UPDATE}/core/crc32.c
        ${UPDATE}/drivers/mcu_core/stm32h5xx_mcu_driver.c
        ${UPDATE}/drivers/flash/internal/stm32h5xx_flash_driver.c
        ${UPDATE}/modules/image/image.c
        ${UPDATE}/modules/image/image_process.c
        ${UPDATE}/modules/image/image_utils.c
        ${UPDATE}/modules/memory/memory.c
        ${UPDATE}/modules/memory/memory_ex.c
        ${UPDATE}/core/verify.c
        ${UPDATE}/modules/security/verify_auth.c
        ${UPDATE}/modules/security/verify_sign.c
        ${UPDATE}/modules/security/cipher.c
        ${UPDATE}/update/update.c
        ${UPDATE}/update/update_misc.c
        ${UPDATE}/update/update_fallback.c
        ${TCP}/core/net.c
        ${TCP}/core/net_mem.c
        ${TCP}/core/net_misc.c
        ${TCP}/drivers/mac/stm32h5xx_eth_driver.c
        ${TCP}/drivers/phy/lan8742_driver.c
        ${TCP}/core/nic.c
        ${TCP}/core/ethernet.c
        ${TCP}/core/ethernet_misc.c
        ${TCP}/ipv4/arp.c
        ${TCP}/ipv4/arp_cache.c
        ${TCP}/ipv4/ipv4.c
        ${TCP}/ipv4/ipv4_frag.c
        ${TCP}/ipv4/ipv4_misc.c
        ${TCP}/ipv4/icmp.c
        ${TCP}/ipv4/ipv4_multicast.c
        ${TCP}/igmp/igmp_host.c
        ${TCP}/igmp/igmp_host_misc.c
        ${TCP}/igmp/igmp_common.c
        ${TCP}/igmp/igmp_debug.c
        ${TCP}/ipv6/ipv6.c
        ${TCP}/ipv6/ipv6_frag.c
        ${TCP}/ipv6/ipv6_misc.c
        ${TCP}/ipv6/ipv6_pmtu.c
        ${TCP}/ipv6/icmpv6.c
        ${TCP}/ipv6/ipv6_multicast.c
        ${TCP}/mld/mld_node.c
        ${TCP}/mld/mld_node_misc.c
        ${TCP}/mld/mld_common.c
        ${TCP}/mld/mld_debug.c
        ${TCP}/ipv6/ndp.c
        ${TCP}/ipv6/ndp_cache.c
        ${TCP}/ipv6/ndp_misc.c
        ${TCP}/ipv6/slaac.c
        ${TCP}/ipv6/slaac_misc.c
        ${TCP}/core/ip.c
        ${TCP}/core/tcp.c
        ${TCP}/core/tcp_fsm.c
        ${TCP}/core/tcp_misc.c
        ${TCP}/core/tcp_timer.c
        ${TCP}/core/udp.c
        ${TCP}/core/socket.c
        ${TCP}/core/socket_misc.c
        ${TCP}/core/bsd_socket.c
        ${TCP}/core/bsd_socket_options.c
        ${TCP}/core/bsd_socket_misc.c
        ${TCP}/core/raw_socket.c
        ${TCP}/dns/dns_cache.c
        ${TCP}/dns/dns_client.c
        ${TCP}/dns/dns_common.c
        ${TCP}/dns/dns_debug.c
        ${TCP}/mdns/mdns_client.c
        ${TCP}/mdns/mdns_responder.c
        ${TCP}/mdns/mdns_responder_misc.c
        ${TCP}/mdns/mdns_common.c
        ${TCP}/netbios/nbns_client.c
        ${TCP}/netbios/nbns_responder.c
        ${TCP}/netbios/nbns_common.c
        ${TCP}/llmnr/llmnr_client.c
        ${TCP}/llmnr/llmnr_responder.c
        ${TCP}/llmnr/llmnr_common.c
        ${TCP}/dhcp/dhcp_client.c
        ${TCP}/dhcp/dhcp_client_fsm.c
        ${TCP}/dhcp/dhcp_client_misc.c
        ${TCP}/dhcp/dhcp_common.c
        ${TCP}/dhcp/dhcp_debug.c
        ${TCP}/http/http_server.c
        ${TCP}/http/http_server_auth.c
        ${TCP}/http/http_server_misc.c
        ${TCP}/http/mime.c
        ${TCP}/http/ssi.c

        ${CRYPTO}/hardware/stm32h5xx/stm32h5xx_crypto.c
        ${CRYPTO}/hardware/stm32h5xx/stm32h5xx_crypto_trng.c
        ${CRYPTO}/hash/md5.c
        ${CRYPTO}/hash/sha1.c
        ${CRYPTO}/hash/sha224.c
        ${CRYPTO}/hash/sha256.c
        ${CRYPTO}/hash/sha384.c
        ${CRYPTO}/hash/sha512.c
        ${CRYPTO}/mac/hmac.c
        ${CRYPTO}/cipher/rc4.c
        ${CRYPTO}/cipher/idea.c
        ${CRYPTO}/cipher/des.c
        ${CRYPTO}/cipher/des3.c
        ${CRYPTO}/cipher/aes.c
        ${CRYPTO}/cipher/camellia.c
        ${CRYPTO}/cipher/seed.c
        ${CRYPTO}/cipher/aria.c
        ${CRYPTO}/cipher_modes/cbc.c
        ${CRYPTO}/aead/ccm.c
        ${CRYPTO}/aead/gcm.c
        ${CRYPTO}/cipher/chacha.c
        ${CRYPTO}/mac/poly1305.c
        ${CRYPTO}/aead/chacha20_poly1305.c
        ${CRYPTO}/pkc/dh.c
        ${CRYPTO}/pkc/rsa.c
        ${CRYPTO}/pkc/dsa.c
        ${CRYPTO}/ecc/ec.c
        ${CRYPTO}/ecc/ec_curves.c
        ${CRYPTO}/ecc/ecdh.c
        ${CRYPTO}/ecc/ecdsa.c
        ${CRYPTO}/ecc/eddsa.c
        ${CRYPTO}/ecc/curve25519.c
        ${CRYPTO}/ecc/curve448.c
        ${CRYPTO}/ecc/x25519.c
        ${CRYPTO}/ecc/x448.c
        ${CRYPTO}/ecc/ed25519.c
        ${CRYPTO}/ecc/ed448.c
        ${CRYPTO}/mpi/mpi.c
        ${CRYPTO}/mpi/mpi_misc.c
        ${CRYPTO}/encoding/base64.c
        ${CRYPTO}/encoding/asn1.c
        ${CRYPTO}/encoding/oid.c
        ${CRYPTO}/pkix/pem_import.c
        ${CRYPTO}/pkix/pem_key_import.c
        ${CRYPTO}/pkix/pem_decrypt.c
        ${CRYPTO}/pkix/pem_common.c
        ${CRYPTO}/pkix/pkcs5_decrypt.c
        ${CRYPTO}/pkix/pkcs5_common.c
        ${CRYPTO}/pkix/pkcs8_key_parse.c
        ${CRYPTO}/pkix/x509_key_parse.c
        ${CRYPTO}/pkix/x509_cert_parse.c
        ${CRYPTO}/pkix/x509_cert_validate.c
        ${CRYPTO}/pkix/x509_cert_ext_parse.c
        ${CRYPTO}/pkix/x509_common.c
        ${CRYPTO}/pkix/x509_sign_parse.c
        ${CRYPTO}/pkix/x509_sign_verify.c
        ${CRYPTO}/kdf/hkdf.c
        
        ${CRYPTO}/ecc/ec_misc.c
        ${CRYPTO}/pkc/rsa_misc.c

        ${THIRD_PARTY}/freertos/portable/gcc/arm_cm33_ntz/non_secure/port.c
        ${THIRD_PARTY}/freertos/portable/gcc/arm_cm33_ntz/non_secure/portasm.c
        ${THIRD_PARTY}/freertos/croutine.c
        ${THIRD_PARTY}/freertos/list.c
        ${THIRD_PARTY}/freertos/queue.c
        ${THIRD_PARTY}/freertos/tasks.c
        ${THIRD_PARTY}/freertos/timers.c
        ${THIRD_PARTY}/freertos/portable/memmang/heap_3.c

        ${THIRD_PARTY}/st/boards2/stm32h573i_discovery/stm32h573i_discovery.c
        ${THIRD_PARTY}/st/boards2/stm32h573i_discovery/stm32h573i_discovery_audio.c
        ${THIRD_PARTY}/st/boards2/stm32h573i_discovery/stm32h573i_discovery_bus.c
        ${THIRD_PARTY}/st/boards2/stm32h573i_discovery/stm32h573i_discovery_lcd.c
        ${THIRD_PARTY}/st/boards2/stm32h573i_discovery/stm32h573i_discovery_sd.c
        ${THIRD_PARTY}/st/boards2/stm32h573i_discovery/stm32h573i_discovery_ts.c
        ${THIRD_PARTY}/st/boards2/stm32h573i_discovery/stm32h573i_discovery_usbpd_pwr.c
        ${THIRD_PARTY}/st/boards2/components/cs42l51/cs42l51.c
        ${THIRD_PARTY}/st/boards2/components/cs42l51/cs42l51_reg.c
        ${THIRD_PARTY}/st/boards2/components/ft6x06/ft6x06.c
        ${THIRD_PARTY}/st/boards2/components/ft6x06/ft6x06_reg.c
        ${THIRD_PARTY}/st/boards2/components/st7789h2/st7789h2.c
        ${THIRD_PARTY}/st/boards2/components/st7789h2/st7789h2_reg.c
        ${THIRD_PARTY}/st/boards2/components/tcpp0203/tcpp0203.c
        ${THIRD_PARTY}/st/boards2/components/tcpp0203/tcpp0203_reg.c
        ${THIRD_PARTY}/st/boards2/utilities/lcd/stm32_lcd.c

        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_adc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_adc_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_cec.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_comp.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_cordic.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_cortex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_crc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_crc_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_cryp.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_cryp_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_dac.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_dac_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_dcache.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_dcmi.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_dma.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_dma_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_dts.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_eth.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_eth_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_exti.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_fdcan.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_flash.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_flash_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_fmac.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_gpio.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_gtzc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_hash.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_hcd.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_i2c.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_i2c_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_i2s.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_i2s_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_i3c.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_icache.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_irda.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_iwdg.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_lptim.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_mmc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_mmc_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_nand.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_nor.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_opamp.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_opamp_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_otfdec.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_pcd.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_pcd_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_pka.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_pssi.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_pwr.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_pwr_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_ramcfg.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_rcc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_rcc_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_rng.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_rng_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_rtc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_rtc_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_sai.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_sai_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_sd.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_sdram.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_sd_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_smartcard.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_smartcard_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_smbus.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_smbus_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_spi.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_spi_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_sram.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_tim.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_tim_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_uart.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_uart_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_usart.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_usart_ex.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_wwdg.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_hal_xspi.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_adc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_comp.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_cordic.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_crc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_crs.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_dac.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_dlyb.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_dma.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_exti.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_fmac.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_fmc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_gpio.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_i2c.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_i3c.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_icache.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_lptim.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_lpuart.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_opamp.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_pka.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_pwr.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_rcc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_rng.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_rtc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_sdmmc.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_spi.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_tim.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_ucpd.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_usart.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_usb.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_ll_utils.c
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/src/stm32h5xx_util_i3c.c

        ${CMAKE_SOURCE_DIR}/cmake/startup_stm32h573xx.S
        ${CMAKE_SOURCE_DIR}/cmake/syscalls.c
        ${CMAKE_SOURCE_DIR}/src/system_stm32h5xx.c
        ${CMAKE_SOURCE_DIR}/src/stm32h5xx_it.c
        ${CMAKE_SOURCE_DIR}/src/stm32h5xx_hal_timebase_tim.c
        ${CMAKE_SOURCE_DIR}/src/main.c
        ${CMAKE_SOURCE_DIR}/src/http_server_callbacks.c
        ${CMAKE_SOURCE_DIR}/src/debug.c
        ${CMAKE_SOURCE_DIR}/src/res.c
)

target_include_directories(iap_demo PRIVATE
        ${CMAKE_SOURCE_DIR}/src
        ${THIRD_PARTY}/cmsis/include
        ${THIRD_PARTY}/st/devices/stm32h5xx
        ${THIRD_PARTY}/st/drivers/stm32h5xx_hal_driver/inc
        ${THIRD_PARTY}/st/boards2/stm32h573i_discovery
        ${THIRD_PARTY}/st/boards2/components/common
        ${THIRD_PARTY}/st/boards2/utilities/lcd
        ${THIRD_PARTY}/freertos/include
        ${THIRD_PARTY}/freertos/portable/gcc/arm_cm33_ntz/non_secure
        ${COMMON}
        ${CRYPTO}
        ${TCP}
        ${UPDATE}
        ${UPDATE}/modules
)

target_compile_definitions(iap_demo PRIVATE
    STM32H573xx
    USE_HAL_DRIVER
    FLASH_DB_MODE
    USE_STM32H573I_DK
    __USE_C99_MATH

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

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

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

# Pre-build step: Generate res.c using ResourceCompiler
if(WIN32)
    add_custom_command(
        OUTPUT ${CMAKE_SOURCE_DIR}/src/res.c
        COMMAND ${RESOURCE_COMPILER}/bin/rc.exe
                ${CMAKE_SOURCE_DIR}/resources/
                ${CMAKE_SOURCE_DIR}/src/res.c
        DEPENDS ${CMAKE_SOURCE_DIR}/resources/
        COMMENT "Running Resource Compiler to generate res.c"
    )
else()
    add_custom_command(
        OUTPUT ${CMAKE_SOURCE_DIR}/src/res.c
        COMMAND ${RESOURCE_COMPILER}/bin/rc
                ${CMAKE_SOURCE_DIR}/resources/
                ${CMAKE_SOURCE_DIR}/src/res.c
        DEPENDS ${CMAKE_SOURCE_DIR}/resources/
        COMMENT "Running Resource Compiler to generate res.c"
    )
endif()

# Copy the generated .bin file to ../
set(VERSION_HEADER "${CMAKE_SOURCE_DIR}/src/version.h")
# Read the contents of the header
file(READ "${VERSION_HEADER}" VERSION_HEADER_CONTENT)
# Extract the version string from e.g., #define APP_VERSION "1.0.0"
string(REGEX MATCH "#define APP_VERSION_STRING \"([0-9\\.]+)\"" _ UNUSED ${VERSION_HEADER_CONTENT})
set(APP_VERSION_RAW "${CMAKE_MATCH_1}")
string(REPLACE "." "_" APP_VERSION "${APP_VERSION_RAW}")

configure_file(${VERSION_HEADER} ${CMAKE_CURRENT_BINARY_DIR}/version.h COPYONLY)

message("Detected application version: ${APP_VERSION_RAW}")
add_custom_command(TARGET iap_demo POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
        ${CMAKE_CURRENT_BINARY_DIR}/iap_demo.bin
        ${CMAKE_CURRENT_SOURCE_DIR}/../iap_demo_${APP_VERSION}.bin
        COMMENT "Copying iap_demo.bin to parent directory"
)

if(WIN32)
    add_custom_command(TARGET iap_demo POST_BUILD
            COMMAND ${TOOLS}/ImageBuilder/bin/image_builder_windows.exe
            --input ${CMAKE_CURRENT_SOURCE_DIR}/../iap_demo_${APP_VERSION}.bin
            --output ${CMAKE_CURRENT_SOURCE_DIR}/../iap_demo_${APP_VERSION}.img.bin

            COMMAND ${TOOLS}/ImageBuilder/bin/image_builder_windows.exe
            --input ${CMAKE_CURRENT_SOURCE_DIR}/../iap_demo_${APP_VERSION}.bin
            --output ${CMAKE_CURRENT_SOURCE_DIR}/../iap_demo_${APP_VERSION}_update.img
            --enc-algo aes-cbc
            --enc-key aa3ff7d43cc015682c7dfd00de9379e7
            --sign-algo rsa-sha256
            --sign-key  ./resources/keys/rsa_private_key.pem

            COMMENT "Generating iap_demo images using ImageBuilder"
    )
else()
    add_custom_command(TARGET iap_demo POST_BUILD
            COMMAND ${TOOLS}/ImageBuilder/bin/image_builder_linux
            --input ${CMAKE_CURRENT_SOURCE_DIR}/../iap_demo_${APP_VERSION}.bin
            --output ${CMAKE_CURRENT_SOURCE_DIR}/../iap_demo_${APP_VERSION}.img.bin

            COMMAND ${TOOLS}/ImageBuilder/bin/image_builder_linux
            --input ${CMAKE_CURRENT_SOURCE_DIR}/../iap_demo_${APP_VERSION}.bin
            --output ${CMAKE_CURRENT_SOURCE_DIR}/../iap_demo_${APP_VERSION}_update.img
            --enc-algo aes-cbc
            --enc-key aa3ff7d43cc015682c7dfd00de9379e7
            --sign-algo rsa-sha256
            --sign-key  ${CMAKE_SOURCE_DIR}/resources/keys/rsa_private_key.pem

            COMMENT "Generating iap_demo images using ImageBuilder"
    )
endif()

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND python3 ${CMAKE_SOURCE_DIR}/footprint.py
        --map "${CMAKE_CURRENT_BINARY_DIR}/iap_demo.map"
        --ld "${CMAKE_SOURCE_DIR}/cmake/stm32h573_flash.ld"
        --elf "${CMAKE_CURRENT_BINARY_DIR}/iap_demo.elf"
        --output-summary "${CMAKE_SOURCE_DIR}/reports/footprint_summary.json"
        --folders ${UPDATE} ${TCP} ${CRYPTO} ${COMMON} ${SSL}
)