# ############################### # WCH(RISC-V) toolchain file for the ch32v003 # ############################### # ---------------------------------------- # File: riscv64-toolchain.cmake # Description: Cmake file for the WCH controllers. It has two differnt # types of kinds things it can output. It can output or build release binaries # or it output debug builds. # ---------------------------------------- ################################################## # Configurable Section ################################################## # Specify the cross-compiler #set(CROSS_TOOLCHAIN riscv32-unknown-elf-) #set(CROSS_TOOLCHAIN riscv64-unknown-elf-) set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR riscv) set(CMAKE_SYSTEM_PROCESSOR "CUSTOM") set(DEBUG_BINARY 1) set(CMAKE_SYSTEM_VERSION 1) # This logic checks the operating system. if(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "FreeBSD") message("OS:: FreeBSD") set(NEWLIB /usr/local/riscv/riscv64-unknown-elf/include) set(CMAKE_C_COMPILER riscv64-unknown-elf-gcc) set(CMAKE_CXX_COMPILER riscv64-unknown-elf-g++) set(CMAKE_FIND_ROOT_PATH /usr/local/riscv/) #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${NEWLIB}") #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${NEWLIB}") # Without these two lines it freaks out. set(CMAKE_C_STANDARD_COMPUTED_DEFAULT GNU) set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT GNU) elseif(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux") message("OS:: LINUX") else() message("OS:: UNKNOWN?") message("Please add your OS details to the toolchain file.") endif() # Find the Newlib # Find the ch32v003fun # # ---------------------------------------- # MCU Setup # ---------------------------------------- #this really shouldn't be needed as it's also defined in the # `/inc/funconfig.h` file. # Specify the exact Chip #set(MCU CH32V003J4M6) #set(MCU CH32V003A4M6) #set(MCU CH32V003F4P6) #set(MCU CH32V003F4U6) set(MCU CH32V003) #Define it for the preprocessor as well. add_compile_definitions(${MCU}) #add_definitions(-D${MCU}) ################################################## # Advanced Section ################################################## #------------------- # General Flags #------------------- set(OBJECT_GEN_FLAGS "\ -g \ -Os \ -flto \ -ffunction-sections \ -fdata-sections \ -fmessage-length=0 \ -msmall-data-limit=8 ") #------------------- # CFLAGS for ARCH #------------------- set(C_FLAGS_ARCH "\ -march=rv32ec \ -mabi=ilp32e \ -I${NEWLIB} \ -nostdlib") #------------------- # CFLAGS #------------------- # I'm appending to the existing cflags from the cmake file in the root dir. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ ${C_FLAGS_ARCH} \ ${OBJECT_GEN_FLAGS}") #------------------- # ASMFLAGS for cross #------------------- #------------------- # LFLAGS for cross #------------------- #set(LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/${LINKER_SCRIPT}) set(LINKER_SCRIPT "./src/ch32v003.ld") #set(LD_FLAGS "-lgcc") set(LD_FLAGS " \ -Wl,--print-memory-usage \ -Wl,-Map=${PROJECT_NAME}.map \ -lgcc \ -T ${LINKER_SCRIPT} \ -Wl,--gc-sections") #------------------- # Print out info #------------------- message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}") message(STATUS "CMAKE_INCLUDE_PATH: ${CMAKE_INCLUDE_PATH}") message(STATUS "CMAKE_FIND_ROOT_PATH: ${CMAKE_FIND_ROOT_PATH}") # Unset all cache unset(SEMIHOSTING) unset(CMAKE_TOOLCHAIN_FILE) unset(CMAKE_BUILD_TYPE)