cmake_minimum_required(VERSION 3.15)

project(HonComm7F79Isp C ASM)

set(CMAKE_EXECUTABLE_SUFFIX ".elf")

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=cortex-m0 -mthumb -ffunction-sections -fdata-sections -g")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mcpu=cortex-m0 -mthumb -g -x assembler-with-cpp")

add_compile_options($<$<C_COMPILER_ID:GNU>:-Os>)
add_compile_options($<$<C_COMPILER_ID:Clang>:-Oz>)

include_directories(${CMAKE_SOURCE_DIR})

set(COMMON_OBJECTS nlib_asm.S nlib_c.c)
set(LOADER_SOURCES HonCommLoadermain.c vscode/startupLoader.S)
set(ISP_SOURCES
    HonCommAppmain.c
    HonCommAppInfomationTables.c
    HonCommIspAppPage0.c
    HonCommIspAppPage1.c
    HonCommIspAppPage2.c
    HonCommIspAppPage3.c
    HonCommIspAppPage4.c
    HonCommIspAppPage5.c
    HonCommIspAppPage6.c
    HonCommIspAppPage7.c
    HonCommIspAppPage8.c
    HonCommIspAppPage9.c
    vscode/startupIsp.S
    vscode/startupIspInit.S
)

add_library(common OBJECT ${COMMON_OBJECTS})

add_executable(HonCommLoader ${LOADER_SOURCES} $<TARGET_OBJECTS:common>)
target_compile_definitions(HonCommLoader PRIVATE LINKER_SIM_MODE=0)
target_link_options(HonCommLoader PRIVATE
    -T ${CMAKE_SOURCE_DIR}/vscode/linkerLoader.ld
    $<$<C_COMPILER_ID:GNU>:-lc> $<$<C_COMPILER_ID:GNU>:-lgcc> $<$<C_COMPILER_ID:GNU>:-lm> $<$<C_COMPILER_ID:GNU>:-lnosys>
    $<$<C_COMPILER_ID:GNU>:--specs=nano.specs>
    $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>
    $<$<C_COMPILER_ID:Clang>:-nostartfiles>
    $<$<C_COMPILER_ID:Clang>:-lc_nano>
    $<$<C_COMPILER_ID:Clang>:-lgcc>
    $<$<C_COMPILER_ID:Clang>:-lnosys>
    -Wl,--gc-sections
    -Wl,--strip-all
    -Wl,--strip-debug
    -Wl,-Map=${CMAKE_BINARY_DIR}/BuildLoader/HonCommLoader.map
    -Wl,--cref
    -Wl,--print-memory-usage
)
set_target_properties(HonCommLoader PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/BuildLoader
)

add_executable(HonCommIsp ${ISP_SOURCES} $<TARGET_OBJECTS:common>)
target_compile_definitions(HonCommIsp PRIVATE LINKER_SIM_MODE=0)
target_link_options(HonCommIsp PRIVATE
    -T ${CMAKE_SOURCE_DIR}/vscode/linkerIsp.ld
    -nostartfiles
    -s
    $<$<C_COMPILER_ID:GNU>:--specs=nano.specs>
    -Wl,--gc-sections
    -Wl,-Map=${CMAKE_BINARY_DIR}/BuildIsp/HonCommIsp.map
    -Wl,--cref
    -Wl,--print-memory-usage
)
set_target_properties(HonCommIsp PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/BuildIsp
)

add_custom_command(TARGET HonCommLoader POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} -O ihex
        $<TARGET_FILE:HonCommLoader>
        ${CMAKE_BINARY_DIR}/BuildLoader/HonCommLoader.hex
    COMMENT "Generate HonCommLoader.hex"
)

add_custom_command(TARGET HonCommIsp POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} -O ihex
        $<TARGET_FILE:HonCommIsp>
        ${CMAKE_BINARY_DIR}/BuildIsp/HonCommIsp.hex
    COMMENT "Generate HonCommIsp.hex"
)

add_custom_target(HonCommTest.HonApp ALL
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/BuildLoader/HonCommLoader.hex ${CMAKE_BINARY_DIR}/HonCommTest.HonApp
    COMMAND ${CMAKE_COMMAND} -E cat ${CMAKE_BINARY_DIR}/BuildIsp/HonCommIsp.hex >> ${CMAKE_BINARY_DIR}/HonCommTest.HonApp
    COMMENT "Generate HonCommTest.HonApp"
    DEPENDS HonCommLoader HonCommIsp
)

add_custom_target(clean-all
    COMMAND ${CMAKE_COMMAND} -E rm -rf ${CMAKE_BINARY_DIR}/BuildLoader
    COMMAND ${CMAKE_COMMAND} -E rm -rf ${CMAKE_BINARY_DIR}/BuildIsp
    COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_BINARY_DIR}/HonCommTest.HonApp
    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/BuildLoader
    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/BuildIsp
    COMMENT "Clean all build artifacts (ELF, HEX, map, HonApp)"
)

add_custom_target(size ALL
    COMMAND ${CMAKE_SIZE} ${CMAKE_BINARY_DIR}/BuildLoader/HonCommLoader.elf
    COMMAND ${CMAKE_SIZE} ${CMAKE_BINARY_DIR}/BuildIsp/HonCommIsp.elf
    COMMENT "Show ELF section sizes"
    DEPENDS HonCommLoader HonCommIsp
)
