1set(CMAKE_SYSTEM_NAME Generic)2set(CMAKE_SYSTEM_PROCESSOR arm)3set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)4set(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf")5set(CMAKE_EXECUTABLE_SUFFIX_C ".elf")6set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf")78# CMAKE_SYSTEM_* must be set on every toolchain load. Flags and find_* must not.9if(HALL_ARM_TOOLCHAIN_CONFIGURED)10 return()11endif()12set(HALL_ARM_TOOLCHAIN_CONFIGURED TRUE)1314if(CMAKE_HOST_WIN32)15 set(_HALL_HOST_EXE ".exe")16else()17 set(_HALL_HOST_EXE "")18endif()1920# Ninja is often bundled with CLion and is not on PATH.21if(NOT CMAKE_MAKE_PROGRAM)22 set(_HALL_NINJA_DIRS "")23 if(CMAKE_HOST_WIN32)24 file(GLOB _HALL_NINJA_DIRS25 "C:/Program Files/JetBrains/CLion */bin/ninja/win/x64"26 "C:/Program Files (x86)/JetBrains/CLion */bin/ninja/win/x64"27 "D:/Program Files/JetBrains/CLion */bin/ninja/win/x64"28 "D:/JetBrains/CLion */bin/ninja/win/x64"29 "$ENV{LOCALAPPDATA}/Programs/CLion/bin/ninja/win/x64"30 "D:/ClionProject/YFOCV3_LITE/tools/ninja"31 )32 if(_HALL_NINJA_DIRS)33 list(SORT _HALL_NINJA_DIRS COMPARE NATURAL ORDER DESCENDING)34 endif()35 endif()3637 find_program(CMAKE_MAKE_PROGRAM38 NAMES ninja ninja.exe39 PATHS ${_HALL_NINJA_DIRS}40 DOC "Ninja build tool"41 )42endif()4344set(_HALL_ARM_HINTS "")45if(ARM_NONE_EABI_TOOLCHAIN_PATH)46 list(APPEND _HALL_ARM_HINTS "${ARM_NONE_EABI_TOOLCHAIN_PATH}")47endif()48if(DEFINED ENV{ARM_NONE_EABI_TOOLCHAIN_PATH})49 list(APPEND _HALL_ARM_HINTS "$ENV{ARM_NONE_EABI_TOOLCHAIN_PATH}")50endif()5152if(CMAKE_HOST_WIN32)53 file(GLOB _HALL_ARM_GLOBS54 "D:/GD32EB*/GD32EB*/GD32EB/plugins/com.gd.tools_*/Tools/ARMEmbeddedGCC/bin"55 "D:/GD32EB_v1.5.11_Rel/GD32EB_v1.5.11_Rel/GD32EB/plugins/com.gd.tools_*/Tools/ARMEmbeddedGCC/bin"56 "C:/GD32EB*/GD32EB*/GD32EB/plugins/com.gd.tools_*/Tools/ARMEmbeddedGCC/bin"57 "D:/GD32EB*/GD32EB*/GD32EB/plugins/com.gd.tools.stdarmgcc*/Tools/StdARMGCC*/bin"58 "D:/GD32EB*/GD32EB*/GD32EB/plugins/com.gd.tools.gdarmgcc*/Tools/GdARMGCC*/bin"59 "D:/ClionProject/YFOCV3_LITE/tools/arm-gnu/bin"60 "D:/ClionProject/YFOCV3_LITE/tools/arm-gnu/*/bin"61 "C:/ST/STM32CubeIDE*/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.*/tools/bin"62 "D:/ST/STM32CubeIDE*/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.*/tools/bin"63 "C:/Program Files/Arm GNU Toolchain arm-none-eabi/*/bin"64 "C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/*/bin"65 "C:/Program Files (x86)/GNU Arm Embedded Toolchain/*/bin"66 )67 if(_HALL_ARM_GLOBS)68 list(SORT _HALL_ARM_GLOBS COMPARE NATURAL ORDER DESCENDING)69 list(APPEND _HALL_ARM_HINTS ${_HALL_ARM_GLOBS})70 endif()71endif()7273# Prefer the GD32EB toolchain used by this project, then any other ARM GCC.74set(_HALL_GD32_GCC_HINTS "")75if(CMAKE_HOST_WIN32)76 file(GLOB _HALL_GD32_GCC_HINTS77 "D:/GD32EB_v1.5.11_Rel/GD32EB_v1.5.11_Rel/GD32EB/plugins/com.gd.tools_*/Tools/ARMEmbeddedGCC/bin"78 "D:/GD32EB*/GD32EB*/GD32EB/plugins/com.gd.tools_*/Tools/ARMEmbeddedGCC/bin"79 "C:/GD32EB*/GD32EB*/GD32EB/plugins/com.gd.tools_*/Tools/ARMEmbeddedGCC/bin"80 )81endif()82find_program(HALL_ARM_GCC83 NAMES arm-none-eabi-gcc arm-none-eabi-gcc.exe84 PATHS ${_HALL_GD32_GCC_HINTS}85 NO_DEFAULT_PATH86 DOC "ARM GCC cross compiler"87)88if(NOT HALL_ARM_GCC)89 find_program(HALL_ARM_GCC90 NAMES arm-none-eabi-gcc arm-none-eabi-gcc.exe91 PATHS ${_HALL_ARM_HINTS}92 DOC "ARM GCC cross compiler"93 )94endif()9596if(NOT HALL_ARM_GCC)97 message(FATAL_ERROR98 "arm-none-eabi-gcc not found.\n"99 "Install GD32EB, or set ARM_NONE_EABI_TOOLCHAIN_PATH to the toolchain bin directory."100 )101endif()102103get_filename_component(HALL_ARM_TOOLCHAIN_DIR "${HALL_ARM_GCC}" DIRECTORY)104105find_program(HALL_ARM_GXX106 NAMES arm-none-eabi-g++ arm-none-eabi-g++.exe107 HINTS "${HALL_ARM_TOOLCHAIN_DIR}"108 NO_DEFAULT_PATH109)110find_program(HALL_ARM_OBJCOPY111 NAMES arm-none-eabi-objcopy arm-none-eabi-objcopy.exe112 HINTS "${HALL_ARM_TOOLCHAIN_DIR}"113 NO_DEFAULT_PATH114)115find_program(HALL_ARM_SIZE116 NAMES arm-none-eabi-size arm-none-eabi-size.exe117 HINTS "${HALL_ARM_TOOLCHAIN_DIR}"118 NO_DEFAULT_PATH119)120121if(NOT HALL_ARM_GXX)122 set(HALL_ARM_GXX "${HALL_ARM_TOOLCHAIN_DIR}/arm-none-eabi-g++${_HALL_HOST_EXE}")123endif()124if(NOT HALL_ARM_OBJCOPY)125 set(HALL_ARM_OBJCOPY "${HALL_ARM_TOOLCHAIN_DIR}/arm-none-eabi-objcopy${_HALL_HOST_EXE}")126endif()127if(NOT HALL_ARM_SIZE)128 set(HALL_ARM_SIZE "${HALL_ARM_TOOLCHAIN_DIR}/arm-none-eabi-size${_HALL_HOST_EXE}")129endif()130131set(CMAKE_C_COMPILER "${HALL_ARM_GCC}" CACHE FILEPATH "C compiler" FORCE)132set(CMAKE_ASM_COMPILER "${HALL_ARM_GCC}" CACHE FILEPATH "ASM compiler" FORCE)133set(CMAKE_CXX_COMPILER "${HALL_ARM_GXX}" CACHE FILEPATH "CXX compiler" FORCE)134set(CMAKE_LINKER "${HALL_ARM_GXX}" CACHE FILEPATH "Linker" FORCE)135set(CMAKE_OBJCOPY "${HALL_ARM_OBJCOPY}" CACHE FILEPATH "objcopy" FORCE)136set(CMAKE_SIZE "${HALL_ARM_SIZE}" CACHE FILEPATH "size" FORCE)137138message(STATUS "ARM GCC: ${HALL_ARM_GCC}")139if(CMAKE_MAKE_PROGRAM)140 message(STATUS "Ninja: ${CMAKE_MAKE_PROGRAM}")141endif()142143# GD32E230G6: Cortex-M23, no FPU. Match gcc_startup/startup_gd32e23x.S (.fpu softvfp).144set(TARGET_FLAGS "-mcpu=cortex-m23 -mthumb -mfloat-abi=soft")145146set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_FLAGS}")147set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections")148149set(CMAKE_C_FLAGS_DEBUG "-O0 -g3" CACHE STRING "Debug C flags" FORCE)150set(CMAKE_C_FLAGS_RELEASE "-Os -g" CACHE STRING "Release C flags" FORCE)151set(CMAKE_C_FLAGS_RELWITHDEBINFO "-Os -g" CACHE STRING "RelWithDebInfo C flags" FORCE)152set(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING "MinSizeRel C flags" FORCE)153154set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "Debug CXX flags" FORCE)155set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "Release CXX flags" FORCE)156set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}" CACHE STRING "RelWithDebInfo CXX flags" FORCE)157set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}" CACHE STRING "MinSizeRel CXX flags" FORCE)158159set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp")160set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")161162set(CMAKE_C_LINK_FLAGS "${TARGET_FLAGS}")163set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} --specs=nano.specs")164set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,--gc-sections")165set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,--print-memory-usage")166set(CMAKE_CXX_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")