Template
Initial commit: GD32F405RET6 CMake+VSCode template
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
# The project never stores a compiler package. Each machine supplies a path.
|
||||
# TOOLCHAIN_DIRECTORY (CMake cache) has priority over the environment variable.
|
||||
# GD32_GCC_ENV_VAR lets a workstation use a different variable name if needed.
|
||||
set(TOOLCHAIN_DIRECTORY "" CACHE PATH "Path to arm-none-eabi toolchain bin directory")
|
||||
set(GD32_GCC_ENV_VAR "GD32_GCC_BIN" CACHE STRING "Environment variable containing the ARM GCC path")
|
||||
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES TOOLCHAIN_DIRECTORY GD32_GCC_ENV_VAR)
|
||||
|
||||
if(GD32_GCC_ENV_VAR AND NOT GD32_GCC_ENV_VAR MATCHES "^GD32_[A-Za-z0-9_]+$")
|
||||
message(FATAL_ERROR "GD32_GCC_ENV_VAR must use the GD32_ prefix: ${GD32_GCC_ENV_VAR}")
|
||||
endif()
|
||||
|
||||
if(NOT TOOLCHAIN_DIRECTORY AND GD32_GCC_ENV_VAR)
|
||||
if(DEFINED ENV{${GD32_GCC_ENV_VAR}} AND NOT "$ENV{${GD32_GCC_ENV_VAR}}" STREQUAL "")
|
||||
file(TO_CMAKE_PATH "$ENV{${GD32_GCC_ENV_VAR}}" TOOLCHAIN_DIRECTORY)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT TOOLCHAIN_DIRECTORY)
|
||||
message(FATAL_ERROR
|
||||
"Cannot find ARM GCC toolchain. Set ${GD32_GCC_ENV_VAR} in the machine environment "
|
||||
"or pass -DTOOLCHAIN_DIRECTORY=<toolchain-bin>.")
|
||||
endif()
|
||||
|
||||
file(TO_CMAKE_PATH "${TOOLCHAIN_DIRECTORY}" TOOLCHAIN_DIRECTORY)
|
||||
get_filename_component(TOOLCHAIN_DIRECTORY "${TOOLCHAIN_DIRECTORY}" ABSOLUTE)
|
||||
|
||||
if(WIN32)
|
||||
set(TOOLCHAIN_SUFFIX ".exe")
|
||||
else()
|
||||
set(TOOLCHAIN_SUFFIX "")
|
||||
endif()
|
||||
|
||||
# Accept either the package root or its bin directory.
|
||||
if(NOT EXISTS "${TOOLCHAIN_DIRECTORY}/arm-none-eabi-gcc${TOOLCHAIN_SUFFIX}" AND
|
||||
EXISTS "${TOOLCHAIN_DIRECTORY}/bin/arm-none-eabi-gcc${TOOLCHAIN_SUFFIX}")
|
||||
set(TOOLCHAIN_DIRECTORY "${TOOLCHAIN_DIRECTORY}/bin")
|
||||
endif()
|
||||
|
||||
set(_ARM_GCC_EXECUTABLE "${TOOLCHAIN_DIRECTORY}/arm-none-eabi-gcc${TOOLCHAIN_SUFFIX}")
|
||||
|
||||
set(_TOOLCHAIN_BINARIES
|
||||
arm-none-eabi-gcc
|
||||
arm-none-eabi-g++
|
||||
arm-none-eabi-gdb
|
||||
arm-none-eabi-ar
|
||||
arm-none-eabi-ranlib
|
||||
arm-none-eabi-as
|
||||
arm-none-eabi-ld
|
||||
arm-none-eabi-objcopy
|
||||
arm-none-eabi-objdump
|
||||
arm-none-eabi-size
|
||||
)
|
||||
foreach(_binary IN LISTS _TOOLCHAIN_BINARIES)
|
||||
if(NOT EXISTS "${TOOLCHAIN_DIRECTORY}/${_binary}${TOOLCHAIN_SUFFIX}")
|
||||
message(FATAL_ERROR
|
||||
"ARM GCC toolchain is incomplete; missing ${_binary}${TOOLCHAIN_SUFFIX} in ${TOOLCHAIN_DIRECTORY}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
set(CMAKE_C_FLAGS_DEBUG "")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "")
|
||||
set(CMAKE_ASM_FLAGS_DEBUG "")
|
||||
set(CMAKE_C_FLAGS_RELEASE "")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "")
|
||||
set(CMAKE_ASM_FLAGS_RELEASE "")
|
||||
|
||||
set(CMAKE_COLOR_DIAGNOSTICS ON)
|
||||
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")
|
||||
|
||||
set(CMAKE_SYSTEM_NAME Generic)
|
||||
set(CMAKE_SYSTEM_PROCESSOR arm)
|
||||
|
||||
set(TOOLCHAIN_PREFIX "arm-none-eabi-")
|
||||
if(DEFINED TOOLCHAIN_DIRECTORY)
|
||||
set(TOOLCHAIN_PREFIX "${TOOLCHAIN_DIRECTORY}/${TOOLCHAIN_PREFIX}")
|
||||
endif()
|
||||
|
||||
set(FLAGS "-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -std=gnu11 -fstack-usage -fdata-sections -ffunction-sections -fmessage-length=0 -fsigned-char -mthumb -Wall -Wno-missing-braces -Wno-format -Wno-strict-aliasing -Wl,--gc-sections")
|
||||
set(ASM_FLAGS "-x assembler-with-cpp")
|
||||
set(CPP_FLAGS "-fno-rtti -fno-exceptions -fno-threadsafe-statics")
|
||||
|
||||
set(_REQUESTED_C_COMPILER "${TOOLCHAIN_PREFIX}gcc${TOOLCHAIN_SUFFIX}")
|
||||
if(DEFINED CMAKE_C_COMPILER AND CMAKE_C_COMPILER AND
|
||||
IS_ABSOLUTE "${CMAKE_C_COMPILER}" AND
|
||||
NOT CMAKE_C_COMPILER STREQUAL "${_REQUESTED_C_COMPILER}")
|
||||
message(FATAL_ERROR
|
||||
"The build directory is already configured for a different ARM GCC compiler:\n"
|
||||
" cached: ${CMAKE_C_COMPILER}\n"
|
||||
" selected: ${_REQUESTED_C_COMPILER}\n"
|
||||
"Delete the build directory or run CMake Tools 'Delete Cache and Reconfigure'.")
|
||||
endif()
|
||||
|
||||
set(CMAKE_C_COMPILER "${_REQUESTED_C_COMPILER}")
|
||||
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PREFIX}g++${TOOLCHAIN_SUFFIX}")
|
||||
set(CMAKE_ASM_COMPILER "${TOOLCHAIN_PREFIX}gcc${TOOLCHAIN_SUFFIX}")
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS} ${CPP_FLAGS}")
|
||||
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${FLAGS} ${ASM_FLAGS}")
|
||||
set(CMAKE_AR "${TOOLCHAIN_PREFIX}ar${TOOLCHAIN_SUFFIX}")
|
||||
set(CMAKE_RANLIB "${TOOLCHAIN_PREFIX}ranlib${TOOLCHAIN_SUFFIX}")
|
||||
set(CMAKE_OBJCOPY "${TOOLCHAIN_PREFIX}objcopy${TOOLCHAIN_SUFFIX}")
|
||||
set(CMAKE_SIZE "${TOOLCHAIN_PREFIX}size${TOOLCHAIN_SUFFIX}")
|
||||
set(CMAKE_OBJDUMP "${TOOLCHAIN_PREFIX}objdump${TOOLCHAIN_SUFFIX}")
|
||||
set(CMAKE_AS "${TOOLCHAIN_PREFIX}as${TOOLCHAIN_SUFFIX}")
|
||||
set(CMAKE_LD "${TOOLCHAIN_PREFIX}ld${TOOLCHAIN_SUFFIX}")
|
||||
set(CMAKE_LINKER "${TOOLCHAIN_PREFIX}ld${TOOLCHAIN_SUFFIX}")
|
||||
|
||||
execute_process(
|
||||
COMMAND "${_ARM_GCC_EXECUTABLE}" --version
|
||||
OUTPUT_VARIABLE _ARM_GCC_VERSION_OUTPUT
|
||||
ERROR_VARIABLE _ARM_GCC_VERSION_ERROR
|
||||
RESULT_VARIABLE _ARM_GCC_VERSION_RESULT
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
if(NOT _ARM_GCC_VERSION_RESULT EQUAL 0)
|
||||
message(FATAL_ERROR "Unable to execute ${_ARM_GCC_EXECUTABLE}: ${_ARM_GCC_VERSION_ERROR}")
|
||||
endif()
|
||||
string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" _ARM_GCC_VERSION "${_ARM_GCC_VERSION_OUTPUT}")
|
||||
message(STATUS "Using ARM GCC ${_ARM_GCC_VERSION} from ${TOOLCHAIN_DIRECTORY}")
|
||||
|
||||
set(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf")
|
||||
set(CMAKE_EXECUTABLE_SUFFIX_C ".elf")
|
||||
set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf")
|
||||
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
||||
@@ -0,0 +1,47 @@
|
||||
function(project_add_target_properties TARGET_NAME)
|
||||
|
||||
target_compile_definitions(${TARGET_NAME} PRIVATE
|
||||
"$<$<CONFIG:Debug>:DEBUG>"
|
||||
"$<$<NOT:$<CONFIG:Debug>>:RELEASE>"
|
||||
GD32F405
|
||||
)
|
||||
|
||||
target_compile_options(${TARGET_NAME} PRIVATE
|
||||
"$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:ASM>>:-g3>"
|
||||
"$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:C>>:-g3>"
|
||||
"$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CXX>>:-g3>"
|
||||
"$<$<AND:$<NOT:$<CONFIG:Debug>>,$<COMPILE_LANGUAGE:ASM>>:-g0>"
|
||||
"$<$<AND:$<NOT:$<CONFIG:Debug>>,$<COMPILE_LANGUAGE:C>>:-g0>"
|
||||
"$<$<AND:$<NOT:$<CONFIG:Debug>>,$<COMPILE_LANGUAGE:CXX>>:-g0>"
|
||||
|
||||
"$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:C>>:-O0>"
|
||||
"$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CXX>>:-O0>"
|
||||
"$<$<AND:$<NOT:$<CONFIG:Debug>>,$<COMPILE_LANGUAGE:C>>:-Os>"
|
||||
"$<$<AND:$<NOT:$<CONFIG:Debug>>,$<COMPILE_LANGUAGE:CXX>>:-Os>"
|
||||
|
||||
-ffunction-sections
|
||||
-fdata-sections
|
||||
|
||||
-mcpu=cortex-m4
|
||||
-mfpu=fpv4-sp-d16
|
||||
-mfloat-abi=hard
|
||||
)
|
||||
|
||||
target_link_options(${TARGET_NAME} PRIVATE
|
||||
-mcpu=cortex-m4
|
||||
-mthumb
|
||||
-mfpu=fpv4-sp-d16
|
||||
-mfloat-abi=hard
|
||||
# -u _printf_float
|
||||
-static
|
||||
--specs=nano.specs
|
||||
--specs=nosys.specs
|
||||
-Wl,--gc-sections
|
||||
-Wl,--start-group -lc -lm -Wl,--end-group
|
||||
)
|
||||
|
||||
target_link_libraries(${TARGET_NAME} PRIVATE
|
||||
m # To use C math library. -lm should be end of the linker script.
|
||||
)
|
||||
|
||||
endfunction()
|
||||
@@ -0,0 +1,25 @@
|
||||
# Project basic info
|
||||
set(PROJECT_NAME "GD32F4xx_StdPeriph_Template")
|
||||
set(BOARD_TYPE_CODE 40)
|
||||
set(VERSION_MAJOR 0)
|
||||
set(VERSION_MINOR 0)
|
||||
set(VERSION_PATCH 1)
|
||||
set(VERSION "V${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
|
||||
string(TIMESTAMP BUILD_DATE "%Y-%m-%d")
|
||||
|
||||
# 目标芯片 Flash 容量档位(编译期决定链接脚本与 GD32_FLASH_SIZE_KB 宏)
|
||||
# 可选值:xE(512K) / xG(1024K) / xK(2048K),切换方式:
|
||||
# cmake --preset Debug -DGD32_FLASH_CAPACITY=xG
|
||||
set(GD32_FLASH_CAPACITY "xE" CACHE STRING "GD32F4xx flash capacity grade: xE/xG/xK")
|
||||
set_property(CACHE GD32_FLASH_CAPACITY PROPERTY STRINGS xE xG xK)
|
||||
|
||||
# 编译条件(如IIC类型等)
|
||||
# Example: HW-IIC_APP / HW-IIC_Bootloader
|
||||
# set(BUILD_VARIANT "AutoDetectDriveCurrent")
|
||||
# set(BUILD_VARIANT "HW-IIC")
|
||||
set(BUILD_VARIANT "APP")
|
||||
|
||||
# 其它自定义宏
|
||||
add_definitions(-DBUILD_VARIANT=${BUILD_VARIANT})
|
||||
add_definitions(-DPROJECT_VERSION="${VERSION}")
|
||||
add_definitions(-DBUILD_DATE="${BUILD_DATE}")
|
||||
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
/* Auto-generated from CMake VERSION_* variables. Do not edit directly. */
|
||||
#define BOARD_TYPE_CODE @BOARD_TYPE_CODE@
|
||||
#define FW_VERSION_MAJOR @VERSION_MAJOR@
|
||||
#define FW_VERSION_MINOR @VERSION_MINOR@
|
||||
#define FW_VERSION_PATCH @VERSION_PATCH@
|
||||
Reference in New Issue
Block a user