summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt52
1 files changed, 44 insertions, 8 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9d348e68..5f6be6d2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,9 +1,10 @@
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
-# Set up the project
-project(threadx
- LANGUAGES C ASM
-)
+# Declare the project with C only first so that CMake loads the toolchain file,
+# which sets THREADX_ARCH and THREADX_TOOLCHAIN as normal variables. Checking
+# those variables before project() would always fail because the toolchain is
+# not sourced until the first project() call.
+project(threadx LANGUAGES C)
if(NOT DEFINED THREADX_ARCH)
message(FATAL_ERROR "Error: THREADX_ARCH not defined")
@@ -11,6 +12,30 @@ endif()
if(NOT DEFINED THREADX_TOOLCHAIN)
message(FATAL_ERROR "Error: THREADX_TOOLCHAIN not defined")
endif()
+
+# The Windows simulation ports do not use assembly. All other ports require
+# it. enable_language() is called here rather than in project() above so that
+# the ASM toolchain is only activated when we know the target actually needs it.
+# Note: CMAKE_TRY_COMPILE_TARGET_TYPE is already set to STATIC_LIBRARY by
+# every toolchain file in cmake/, so it does not need to be repeated here.
+if(NOT ((THREADX_ARCH STREQUAL "win32") OR (THREADX_ARCH STREQUAL "win64")))
+ enable_language(ASM)
+endif()
+
+option(THREADX_SMP "Build ThreadX SMP version" OFF)
+
+if(THREADX_SMP)
+ set(TX_PORT_DIR "ports_smp")
+ set(TX_COMMON_DIR "common_smp")
+ set(TX_ARCH_DIR "${THREADX_ARCH}_smp")
+ message(STATUS "Building ThreadX SMP version")
+else()
+ set(TX_PORT_DIR "ports")
+ set(TX_COMMON_DIR "common")
+ set(TX_ARCH_DIR "${THREADX_ARCH}")
+ message(STATUS "Building standard ThreadX version")
+endif()
+
message(STATUS "THREADX_ARCH: ${THREADX_ARCH}")
message(STATUS "THREADX_TOOLCHAIN: ${THREADX_TOOLCHAIN}")
@@ -25,11 +50,11 @@ set(CUSTOM_INC_DIR ${CMAKE_CURRENT_BINARY_DIR}/custom_inc)
if(DEFINED THREADX_CUSTOM_PORT)
add_subdirectory(${THREADX_CUSTOM_PORT} threadx_port)
else()
- add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/ports/${THREADX_ARCH}/${THREADX_TOOLCHAIN})
+ add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/${TX_PORT_DIR}/${TX_ARCH_DIR}/${THREADX_TOOLCHAIN})
endif()
# Pick up the common stuff
-add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/common)
+add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/${TX_COMMON_DIR})
# Define the FreeRTOS adaptation layer
add_library(freertos-threadx EXCLUDE_FROM_ALL)
@@ -46,7 +71,7 @@ target_link_libraries(freertos-threadx PUBLIC threadx)
# If the user provided an override, copy it to the custom directory
if (NOT TX_USER_FILE)
message(STATUS "Using default tx_user.h file")
- set(TX_USER_FILE ${CMAKE_CURRENT_LIST_DIR}/common/inc/tx_user_sample.h)
+ set(TX_USER_FILE ${CMAKE_CURRENT_LIST_DIR}/${TX_COMMON_DIR}/inc/tx_user_sample.h)
else()
message(STATUS "Using custom tx_user.h file from ${TX_USER_FILE}")
endif()
@@ -56,6 +81,17 @@ target_include_directories(${PROJECT_NAME}
${CUSTOM_INC_DIR}
)
target_compile_definitions(${PROJECT_NAME} PUBLIC "TX_INCLUDE_USER_DEFINE_FILE" )
+if(THREADX_SMP)
+ target_compile_definitions(${PROJECT_NAME} PUBLIC "TX_MPCORE" )
+endif()
+
+# Optional: build for S-mode (Supervisor mode) instead of M-mode (Machine mode).
+# Required when running after OpenSBI, e.g. booted from U-Boot.
+option(TX_RISCV_SMODE "Use S-mode CSRs instead of M-mode for RISC-V targets" OFF)
+if(TX_RISCV_SMODE)
+ message(STATUS "RISC-V S-mode enabled (TX_RISCV_SMODE)")
+ target_compile_definitions(${PROJECT_NAME} PUBLIC "TX_RISCV_SMODE")
+endif()
# Enable a build target that produces a ZIP file of all sources
set(CPACK_SOURCE_GENERATOR "ZIP")
@@ -69,4 +105,4 @@ set(CPACK_SOURCE_IGNORE_FILES
".*~$"
)
set(CPACK_VERBATIM_VARIABLES YES)
-include(CPack) \ No newline at end of file
+include(CPack)