summaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake')
-rw-r--r--cmake/cortex_a9.cmake13
-rw-r--r--cmake/riscv-none-elf-rv32imc.cmake71
-rw-r--r--cmake/riscv32-unknown-elf-rv32imc.cmake93
-rw-r--r--cmake/riscv32-unknown-elf.cmake7
-rw-r--r--cmake/riscv32_gnu.cmake8
-rw-r--r--cmake/riscv64-gcc-rv32imc.cmake2
-rw-r--r--cmake/threadx_riscv_port.cmake50
-rw-r--r--cmake/win32.cmake12
-rw-r--r--cmake/win64.cmake9
-rw-r--r--cmake/xtensa.cmake37
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)