cmake_minimum_required(VERSION 3.15)
project(microbit_puf_demo C ASM)

set(CMAKE_EXECUTABLE_SUFFIX ".elf")

# Random seed
if(NOT SRAM_PUF_RANDOM_SEED_HEX)
    string(RANDOM LENGTH 16 ALPHABET 0123456789abcdef SRAM_PUF_RANDOM_SEED_HEX)
endif()
message(STATUS "SRAM PUF random seed: 0x${SRAM_PUF_RANDOM_SEED_HEX}")
add_compile_definitions(SRAM_PUF_RANDOM_SEED=0x${SRAM_PUF_RANDOM_SEED_HEX}ULL)

# Test trials
if(TEST_TRIALS)
    add_compile_definitions(TEST_TRIALS=${TEST_TRIALS})
    message(STATUS "TEST_TRIALS: ${TEST_TRIALS}")
endif()

include_directories(
    ${CMAKE_SOURCE_DIR}/components/sram_puf_demo/include
    ${CMAKE_SOURCE_DIR}/components/sram_puf_demo/src
    ${CMAKE_SOURCE_DIR}/components/sram_puf_demo/src/sram_puf_para
)

set(COMMON_SOURCES
    main.c
    components/sram_puf_demo/src/sram_puf_demo.c
    components/sram_puf_demo/src/sha256.c
    components/sram_puf_demo/src/sram_puf_bin_comm.c
)

set(TARGET_NAME microbit_puf)

set(ARCH_SOURCES
    startup_m0.c
    components/sram_puf_demo/src/sram_puf_code_bin_enroll_recon_m0.c
)

add_executable(${TARGET_NAME}
    ${COMMON_SOURCES}
    ${ARCH_SOURCES}
)

target_compile_options(${TARGET_NAME} PRIVATE
    -mcpu=cortex-m0 -mthumb
    -nostdlib -nostartfiles -ffreestanding
    -O2 -Wall -Werror
    -DTARGET_MPS2
)

target_link_options(${TARGET_NAME} PRIVATE
    -mcpu=cortex-m0 -mthumb
    -nostdlib -nostartfiles -ffreestanding
    -T ${CMAKE_SOURCE_DIR}/microbit.ld
)

target_link_libraries(${TARGET_NAME} PRIVATE gcc)

set(TARGET_ELF ${TARGET_NAME}.elf)

add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} -O binary ${TARGET_ELF} ${TARGET_NAME}.bin
    COMMAND ${CMAKE_OBJDUMP} -d ${TARGET_ELF} > ${TARGET_NAME}.dis
    COMMENT "Generating ${TARGET_NAME}.bin and ${TARGET_NAME}.dis"
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

add_custom_target(qemu_run
    COMMAND qemu-system-arm
        -machine microbit -nographic -semihosting
        -kernel ${TARGET_ELF}
    DEPENDS ${TARGET_NAME}
    COMMENT "Running ${TARGET_NAME} in QEMU micro:bit (Cortex-M0)"
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

message(STATUS "Target      : ${TARGET_NAME}")
message(STATUS "CC          : ${CMAKE_C_COMPILER}")
message(STATUS "Binary dir  : ${CMAKE_BINARY_DIR}")
