diff options
Diffstat (limited to 'cmake')
| -rw-r--r-- | cmake/cortex_a9.cmake | 13 | ||||
| -rw-r--r-- | cmake/riscv-none-elf-rv32imc.cmake | 71 | ||||
| -rw-r--r-- | cmake/riscv32-unknown-elf-rv32imc.cmake | 93 | ||||
| -rw-r--r-- | cmake/riscv32-unknown-elf.cmake | 7 | ||||
| -rw-r--r-- | cmake/riscv32_gnu.cmake | 8 | ||||
| -rw-r--r-- | cmake/riscv64-gcc-rv32imc.cmake | 2 | ||||
| -rw-r--r-- | cmake/threadx_riscv_port.cmake | 50 | ||||
| -rw-r--r-- | cmake/win32.cmake | 12 | ||||
| -rw-r--r-- | cmake/win64.cmake | 9 | ||||
| -rw-r--r-- | cmake/xtensa.cmake | 37 |
10 files changed, 290 insertions, 12 deletions
diff --git a/cmake/cortex_a9.cmake b/cmake/cortex_a9.cmake new file mode 100644 index 00000000..b84963a4 --- /dev/null +++ b/cmake/cortex_a9.cmake @@ -0,0 +1,13 @@ +# Name of the target +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR cortex-a9) + +set(THREADX_ARCH "cortex_a9") +set(THREADX_TOOLCHAIN "gnu") + +set(MCPU_FLAGS "-marm -mcpu=cortex-a9") +set(VFP_FLAGS "") +set(SPEC_FLAGS "--specs=nosys.specs") +# set(LD_FLAGS "-nostartfiles") + +include(${CMAKE_CURRENT_LIST_DIR}/arm-none-eabi.cmake) diff --git a/cmake/riscv-none-elf-rv32imc.cmake b/cmake/riscv-none-elf-rv32imc.cmake new file mode 100644 index 00000000..647d8099 --- /dev/null +++ b/cmake/riscv-none-elf-rv32imc.cmake @@ -0,0 +1,71 @@ +# /*************************************************************************** +# * Copyright (C) 2026 Eclipse ThreadX contributors +# * +# * This program and the accompanying materials are made available under the +# * terms of the MIT License which is available at +# * https://opensource.org/licenses/MIT. +# * +# * SPDX-License-Identifier: MIT +# ***************************************************************************/ + +# CMake toolchain file for bare-metal RV32IMC targets (e.g. CORE-V MCU / CV32E40P) +# +# Uses the xPack riscv-none-elf-gcc toolchain: +# https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack +# +# This is a cross-platform (Linux/macOS/Windows), multilib-capable toolchain +# analogous to arm-none-eabi-gcc. Its multilib includes rv32imc/ilp32 +# (soft-float), so -lgcc resolves correctly without any distro package. +# +# Install via: bash ports/risc-v32/gnu/example_build/core_v_mcu/install_deps.sh +# (downloads the latest xPack release to /opt/xpack-riscv-none-elf-gcc/) +# +# Do NOT use riscv32-unknown-elf-gcc (riscv-collab riscv32-elf release) for +# this target: that toolchain is built --disable-multilib --with-abi=ilp32d, +# so its libgcc only provides ilp32d (hardware FP) helpers and cannot link +# rv32imc/ilp32 soft-float objects. +# +# Target ISA : rv32imc_zicsr (integer, multiply, compressed, Zicsr) +# ABI : ilp32 (32-bit int/long/ptr, soft-float) +# Code model : medlow (addresses in [0, 2 GiB)) + +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR riscv) + +set(THREADX_ARCH "risc-v32") +set(THREADX_TOOLCHAIN "gnu") + +set(ARCH_FLAGS "-march=rv32imc_zicsr -mabi=ilp32 -mcmodel=medlow") +set(CFLAGS "${ARCH_FLAGS}") +set(ASFLAGS "${ARCH_FLAGS}") +set(LDFLAGS "${ARCH_FLAGS}") + +# xPack riscv-none-elf multilib toolchain. +set(CMAKE_C_COMPILER riscv-none-elf-gcc) +set(CMAKE_CXX_COMPILER riscv-none-elf-g++) +set(AS riscv-none-elf-as) +set(AR riscv-none-elf-ar) +set(OBJCOPY riscv-none-elf-objcopy) +set(OBJDUMP riscv-none-elf-objdump) +set(SIZE riscv-none-elf-size) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +# Use static library for compiler feature probing (no linker script yet) +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +set(CMAKE_C_FLAGS "${CFLAGS}" CACHE INTERNAL "c compiler flags") +set(CMAKE_CXX_FLAGS "${CFLAGS}" CACHE INTERNAL "cxx compiler flags") +set(CMAKE_ASM_FLAGS "${ASFLAGS} -D__ASSEMBLER__" CACHE INTERNAL "asm compiler flags") +set(CMAKE_EXE_LINKER_FLAGS "${LDFLAGS}" CACHE INTERNAL "exe link flags") + +set(CMAKE_C_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "c debug flags") +set(CMAKE_CXX_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "cxx debug flags") +set(CMAKE_ASM_FLAGS_DEBUG "-g -ggdb3" CACHE INTERNAL "asm debug flags") + +set(CMAKE_C_FLAGS_RELEASE "-Os" CACHE INTERNAL "c release flags") +set(CMAKE_CXX_FLAGS_RELEASE "-Os" CACHE INTERNAL "cxx release flags") +set(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "asm release flags") diff --git a/cmake/riscv32-unknown-elf-rv32imc.cmake b/cmake/riscv32-unknown-elf-rv32imc.cmake new file mode 100644 index 00000000..0109799f --- /dev/null +++ b/cmake/riscv32-unknown-elf-rv32imc.cmake @@ -0,0 +1,93 @@ +# /*************************************************************************** +# * Copyright (C) 2026 Eclipse ThreadX contributors +# * +# * This program and the accompanying materials are made available under the +# * terms of the MIT License which is available at +# * https://opensource.org/licenses/MIT. +# * +# * SPDX-License-Identifier: MIT +# ***************************************************************************/ + +# CMake toolchain file for RV32GC targets (QEMU virt, etc.) +# +# Uses the dedicated riscv32-unknown-elf-gcc bare-metal toolchain from +# riscv-collab (riscv32-elf-ubuntu-24.04-gcc.tar.xz, installs to /opt/riscv +# via scripts/install_riscv.sh). +# +# IMPORTANT: the riscv-collab riscv32-elf toolchain is built +# --disable-multilib --with-abi=ilp32d, so its libgcc only provides +# ilp32d (hardware double-FP) helpers. This cmake file therefore targets +# rv32gc/ilp32d, which matches the toolchain's built-in ABI and works +# correctly with QEMU virt (which emulates hardware FP). +# +# Do NOT use this file for bare-metal targets that lack hardware FP (e.g. +# CV32E40P, rv32imc). For those, use cmake/riscv64-ubuntu-rv32imc.cmake +# which calls the Ubuntu gcc-riscv64-unknown-elf package — a multilib build +# that includes the rv32im/ilp32 (soft-float) libgcc variant. +# +# Target ISA : rv32gc (integer, multiply, atomics, FP, compressed, Zicsr) +# ABI : ilp32d (32-bit int/long/ptr, hardware double-precision FP) +# Code model : medlow (addresses in [0, 2 GiB)) + +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR riscv) + +set(THREADX_ARCH "risc-v32") +set(THREADX_TOOLCHAIN "gnu") + +set(ARCH_FLAGS "-march=rv32gc -mabi=ilp32d -mcmodel=medlow") +set(CFLAGS "${ARCH_FLAGS}") +set(ASFLAGS "${ARCH_FLAGS}") +set(LDFLAGS "${ARCH_FLAGS}") + +# Dedicated riscv32 bare-metal toolchain (riscv-collab riscv32-elf release). +set(CMAKE_C_COMPILER riscv32-unknown-elf-gcc) +set(CMAKE_CXX_COMPILER riscv32-unknown-elf-g++) +set(AS riscv32-unknown-elf-as) +set(AR riscv32-unknown-elf-ar) +set(OBJCOPY riscv32-unknown-elf-objcopy) +set(OBJDUMP riscv32-unknown-elf-objdump) +set(SIZE riscv32-unknown-elf-size) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +# Use static library for compiler feature probing (no linker script yet) +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +set(CMAKE_C_FLAGS "${CFLAGS}" CACHE INTERNAL "c compiler flags") +set(CMAKE_CXX_FLAGS "${CFLAGS}" CACHE INTERNAL "cxx compiler flags") +set(CMAKE_ASM_FLAGS "${ASFLAGS} -D__ASSEMBLER__" CACHE INTERNAL "asm compiler flags") +set(CMAKE_EXE_LINKER_FLAGS "${LDFLAGS}" CACHE INTERNAL "exe link flags") + +set(CMAKE_C_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "c debug flags") +set(CMAKE_CXX_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "cxx debug flags") +set(CMAKE_ASM_FLAGS_DEBUG "-g -ggdb3" CACHE INTERNAL "asm debug flags") + +set(CMAKE_C_FLAGS_RELEASE "-Os" CACHE INTERNAL "c release flags") +set(CMAKE_CXX_FLAGS_RELEASE "-Os" CACHE INTERNAL "cxx release flags") +set(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "asm release flags") + + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +# Use static library for compiler feature probing (no linker script yet) +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +set(CMAKE_C_FLAGS "${CFLAGS}" CACHE INTERNAL "c compiler flags") +set(CMAKE_CXX_FLAGS "${CFLAGS}" CACHE INTERNAL "cxx compiler flags") +set(CMAKE_ASM_FLAGS "${ASFLAGS} -D__ASSEMBLER__" CACHE INTERNAL "asm compiler flags") +set(CMAKE_EXE_LINKER_FLAGS "${LDFLAGS}" CACHE INTERNAL "exe link flags") + +set(CMAKE_C_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "c debug flags") +set(CMAKE_CXX_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "cxx debug flags") +set(CMAKE_ASM_FLAGS_DEBUG "-g -ggdb3" CACHE INTERNAL "asm debug flags") + +set(CMAKE_C_FLAGS_RELEASE "-Os" CACHE INTERNAL "c release flags") +set(CMAKE_CXX_FLAGS_RELEASE "-Os" CACHE INTERNAL "cxx release flags") +set(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "asm release flags") diff --git a/cmake/riscv32-unknown-elf.cmake b/cmake/riscv32-unknown-elf.cmake index cfd9f7ea..d21e729c 100644 --- a/cmake/riscv32-unknown-elf.cmake +++ b/cmake/riscv32-unknown-elf.cmake @@ -17,7 +17,12 @@ set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) set(CMAKE_C_FLAGS "${CFLAGS}" CACHE INTERNAL "c compiler flags") set(CMAKE_CXX_FLAGS "${CXXFLAGS}" CACHE INTERNAL "cxx compiler flags") -set(CMAKE_ASM_FLAGS "${ASFLAGS} -D__ASSEMBLER__ -D__riscv_float_abi_single" CACHE INTERNAL "asm compiler flags") +if(DEFINED SOFT_FLOAT) + set(CMAKE_ASM_FLAGS "${ASFLAGS} -D__ASSEMBLER__" CACHE INTERNAL "asm compiler flags") +else() + set(CMAKE_ASM_FLAGS "${ASFLAGS} -D__ASSEMBLER__ -D__riscv_float_abi_single" CACHE INTERNAL "asm compiler flags") +endif() + set(CMAKE_EXE_LINKER_FLAGS "${LDFLAGS}" CACHE INTERNAL "exe link flags") SET(CMAKE_C_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "c debug compiler flags") diff --git a/cmake/riscv32_gnu.cmake b/cmake/riscv32_gnu.cmake index 617b1276..6843423c 100644 --- a/cmake/riscv32_gnu.cmake +++ b/cmake/riscv32_gnu.cmake @@ -1,10 +1,14 @@ # Name of the target set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR risc-v32) - set(THREADX_ARCH "risc-v32") set(THREADX_TOOLCHAIN "gnu") -set(ARCH_FLAGS "-g -march=rv32gc -mabi=ilp32d -mcmodel=medany") +if(DEFINED SOFT_FLOAT) + set(ARCH_FLAGS "-g -march=rv32ima_zicsr -mabi=ilp32 -mcmodel=medany") + set(CACHE{SOFT_FLOAT} FORCE 1) +else() + set(ARCH_FLAGS "-g -march=rv32gc -mabi=ilp32d -mcmodel=medany -mrelax") +endif() set(CFLAGS "${ARCH_FLAGS}") set(ASFLAGS "${ARCH_FLAGS}") set(LDFLAGS "${ARCH_FLAGS}") diff --git a/cmake/riscv64-gcc-rv32imc.cmake b/cmake/riscv64-gcc-rv32imc.cmake new file mode 100644 index 00000000..b0916a2f --- /dev/null +++ b/cmake/riscv64-gcc-rv32imc.cmake @@ -0,0 +1,2 @@ +# This file is a compatibility alias. Use riscv-none-elf-rv32imc.cmake. +include(${CMAKE_CURRENT_LIST_DIR}/riscv-none-elf-rv32imc.cmake) diff --git a/cmake/threadx_riscv_port.cmake b/cmake/threadx_riscv_port.cmake new file mode 100644 index 00000000..99a995ac --- /dev/null +++ b/cmake/threadx_riscv_port.cmake @@ -0,0 +1,50 @@ +# threadx_riscv_port.cmake +# +# Helper function shared by the three RISC-V port CMakeLists files +# (risc-v32/gnu, risc-v32/clang, risc-v64/gnu). +# +# Usage: +# include(cmake/threadx_riscv_port.cmake) +# threadx_add_riscv_port(SRC_DIR <path-to-src> +# INC_DIR <path-to-inc> +# [EXAMPLE_DIR <path-to-example-build>]) +# +# SRC_DIR — directory containing the 8 ThreadX .S port files. +# INC_DIR — directory containing tx_port.h (added as PUBLIC include). +# EXAMPLE_DIR — optional: if provided and contains a CMakeLists.txt, +# add_subdirectory() is called on it. + +function(threadx_add_riscv_port) + cmake_parse_arguments(RISCV "" "SRC_DIR;INC_DIR;EXAMPLE_DIR" "" ${ARGN}) + + if(NOT RISCV_SRC_DIR) + message(FATAL_ERROR "threadx_add_riscv_port: SRC_DIR is required") + endif() + if(NOT RISCV_INC_DIR) + message(FATAL_ERROR "threadx_add_riscv_port: INC_DIR is required") + endif() + + target_sources(${PROJECT_NAME} + PRIVATE + # {{BEGIN_TARGET_SOURCES}} + ${RISCV_SRC_DIR}/tx_initialize_low_level.S + ${RISCV_SRC_DIR}/tx_thread_context_restore.S + ${RISCV_SRC_DIR}/tx_thread_context_save.S + ${RISCV_SRC_DIR}/tx_thread_interrupt_control.S + ${RISCV_SRC_DIR}/tx_thread_schedule.S + ${RISCV_SRC_DIR}/tx_thread_stack_build.S + ${RISCV_SRC_DIR}/tx_thread_system_return.S + ${RISCV_SRC_DIR}/tx_timer_interrupt.S + # {{END_TARGET_SOURCES}} + ) + + target_include_directories(${PROJECT_NAME} + PUBLIC + ${RISCV_INC_DIR} + ) + + if(RISCV_EXAMPLE_DIR AND + EXISTS ${RISCV_EXAMPLE_DIR}/CMakeLists.txt) + add_subdirectory(${RISCV_EXAMPLE_DIR}) + endif() +endfunction() diff --git a/cmake/win32.cmake b/cmake/win32.cmake index 974107ad..fb9d5086 100644 --- a/cmake/win32.cmake +++ b/cmake/win32.cmake @@ -1,15 +1,9 @@ set(CMAKE_SYSTEM_NAME Windows) -set(CMAKE_SYSTEM_PROCESSOR x86_64) +set(CMAKE_SYSTEM_PROCESSOR x86) set(THREADX_ARCH "win32") set(THREADX_TOOLCHAIN "vs_2019") -set(WIN32_FLAGS "") - -set(CMAKE_C_FLAGS "${WIN32_FLAGS} " CACHE INTERNAL "c compiler flags") -set(CMAKE_CXX_FLAGS "${WIN32_FLAGS} -fno-rtti -fno-exceptions" CACHE INTERNAL "cxx compiler flags") -set(CMAKE_ASM_FLAGS "${WIN32_FLAGS} -x assembler-with-cpp" CACHE INTERNAL "asm compiler flags") -set(CMAKE_EXE_LINKER_FLAGS "${WIN32_FLAGS} ${LD_FLAGS}" CACHE INTERNAL "exe link flags") - -# this makes the test compiles use static library option so that we don't need to pre-set linker flags and scripts +# This makes the test compiles use the static library option so that the +# compiler environment can be discovered from the active MSVC shell. set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) diff --git a/cmake/win64.cmake b/cmake/win64.cmake new file mode 100644 index 00000000..5ba9988c --- /dev/null +++ b/cmake/win64.cmake @@ -0,0 +1,9 @@ +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR AMD64) + +set(THREADX_ARCH "win64") +set(THREADX_TOOLCHAIN "vs_2022") + +# This makes the test compiles use the static library option so that the +# compiler environment can be discovered from the active MSVC shell. +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) diff --git a/cmake/xtensa.cmake b/cmake/xtensa.cmake new file mode 100644 index 00000000..2f5fa693 --- /dev/null +++ b/cmake/xtensa.cmake @@ -0,0 +1,37 @@ +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR xtensa) + +set(CMAKE_C_COMPILER xt-clang) +set(CMAKE_CXX_COMPILER xt-clang++) +set(AS xt-clang) +set(AR xt-ar) +set(OBJCOPY xt-objcopy) +set(OBJDUMP xt-objdump) +set(SIZE xt-size) + +set(THREADX_ARCH "xtensa") +set(THREADX_TOOLCHAIN "xcc") + +if (DEFINED ENV{XCC_OPTS}) + set(XCC_OPTS $ENV{XCC_OPTS}) +else() + set(XCC_OPTS "") +endif() + +set(XCC_FLAGS "${XCC_OPTS} -mlongcalls -mno-l32r-flix -mno-coproc -Wall -Wextra -Werror") + +set(CMAKE_C_FLAGS "${XCC_FLAGS} -Os -g" CACHE INTERNAL "c compiler flags") +set(CMAKE_CXX_FLAGS "${XCC_FLAGS} -Os -g -fno-rtti -fno-exceptions" CACHE INTERNAL "cxx compiler flags") +set(CMAKE_ASM_FLAGS "${XCC_FLAGS} -Os -g" CACHE INTERNAL "asm compiler flags") +set(CMAKE_EXE_LINKER_FLAGS "${XCC_FLAGS} ${LD_FLAGS} -Wl,--gc-sections" CACHE INTERNAL "exe link flags") + +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g" CACHE INTERNAL "c debug compiler flags") +SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE INTERNAL "cxx debug compiler flags") +SET(CMAKE_ASM_FLAGS_DEBUG "-O0 -g" CACHE INTERNAL "asm debug compiler flags") + +SET(CMAKE_C_FLAGS_RELEASE "-Os -g" CACHE INTERNAL "c release compiler flags") +SET(CMAKE_CXX_FLAGS_RELEASE "-Os -g" CACHE INTERNAL "cxx release compiler flags") +SET(CMAKE_ASM_FLAGS_RELEASE "-Os -g" CACHE INTERNAL "asm release compiler flags") + +# this makes the test compiles use static library option so that we don't need to pre-set linker flags and scripts +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) |
