cmake_minimum_required(VERSION 3.16) if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE MiniSizeRel) endif() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if (NOT DEFINED DEVICE_TYPE) set(DEVICE_TYPE "GD32F407RK") endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/lib") if (NOT DEFINED CMAKE_TOOLCHAIN_FILE) set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/lib/arm-elf.cmake) endif() set(GD32F4X_CHIP_TYPE GD32F407) set(gd32f40x_root ${CMAKE_CURRENT_LIST_DIR}/Firmware) include(gd32f40x_periph) set(tgt_name "gd32f40x") project(${tgt_name} C CXX ASM) add_executable(${tgt_name}) set_target_properties(${tgt_name} PROPERTIES CXX_STANDARD 20) target_sources(${tgt_name} PRIVATE src/main.c src/gd32f4xx_it.c src/board.c src/pinctrl.c src/usart0.c core/printfi.c core/ymodem.c core/console_ymodem.c core/console.c core/retarget.c core/commands.c core/gpio.c core/ringbuf.c core/terminal.c core/tick.c core/abi.cpp core/new.cpp ) execute_process(COMMAND git rev-parse --short HEAD OUTPUT_VARIABLE _git_commit) #execute_process(COMMAND git log -1 --format=%cd --date=format:%Y%m%d OUTPUT_VARIABLE _git_date) string(STRIP ${_git_commit} git_commit) #string(STRIP ${_git_date} git_date) #string(JOIN - TGT_COMMIT ${git_date} ${git_commit}) target_include_directories(${tgt_name} PRIVATE ${PROJECT_SOURCE_DIR}/core ) target_link_libraries(${tgt_name} PRIVATE gd32f40x_periph ) target_compile_definitions(${tgt_name} PRIVATE _GNU_SOURCE GIT_COMMIT="commit ${git_commit}" ) target_link_options(${tgt_name} PRIVATE -mthumb -mcpu=cortex-m4 -march=armv7e-m -mfloat-abi=hard -mfpu=fpv4-sp-d16 -nostartfiles -Wl,--gc-sections -Wl,--cref -Wl,--sort-section=alignment -Wl,-Map,${tgt_name}.map # -Wl,-pie -Wl,--no-dynamic-linker -specs=nosys.specs -specs=nano.specs $<$>:-s>) set(lds_name ${CMAKE_BINARY_DIR}/linker.ld) tgt_add_linker_script(${tgt_name} PRIVATE ${lds_name}) # gcc -E -P -x -c -o # -E: gcc only run preprocessor # -P: prevents preprocessor from generating linemarkers (#line directives) #-x c: tells GCC treat linker script as C source file add_custom_target(gen_lds ${CMAKE_C_COMPILER} -E -P -x c ${PROJECT_SOURCE_DIR}/lib/gd32f4xx_linker.ld -o ${lds_name} COMMENT "Generate link script" VERBATIM) add_dependencies(${tgt_name} gen_lds) set(OUTPUT_NAME $) add_custom_command(TARGET ${tgt_name} POST_BUILD COMMAND ${CMAKE_OBJCOPY} -O ihex ${OUTPUT_NAME} ${tgt_name}.hex COMMAND ${CMAKE_OBJCOPY} -O binary ${OUTPUT_NAME} ${tgt_name}.bin COMMENT "Create Hex & Binary File" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} VERBATIM ) add_custom_target(flash COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/lib/gdbscript.txt gdbscript.txt COMMAND sed${CMAKE_EXECUTABLE_SUFFIX} -i "s#%DEVICE_TYPE%#${DEVICE_TYPE}#;s#%TARGET_FILE%#${OUTPUT_NAME}#" gdbscript.txt COMMAND ${CMAKE_GDB} --batch -nx -x gdbscript.txt ${OUTPUT_NAME} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} DEPENDS ${tgt_name} COMMENT "Flash elf to device" VERBATIM) install(TARGETS ${tgt_name} DESTINATION ${PROJECT_SOURCE_DIR}/out)