From 3a055546bebeee9e4e73c4a4533a7b73651ee94c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=98=B3?= <657837019@qq.com> Date: Tue, 9 Jun 2026 23:48:29 +0800 Subject: [PATCH] Add RISC-V target detection --- CMakeLists.txt | 7 +++++++ cmake/Modules/TargetArch.cmake | 29 +++++++++++++++++++++-------- cmake/config.h.in | 2 ++ cmake/test-arch.c | 9 +++++++++ 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d154e4c..d940b275 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,13 @@ add_feature_info(NEON32 BASE64_WITH_NEON32 "add NEON32 codepath") cmake_dependent_option(BASE64_WITH_NEON64 "add NEON64 codepath" ON _TARGET_ARCH_arm64 OFF) add_feature_info(NEON64 BASE64_WITH_NEON64 "add NEON64 codepath") +if (_TARGET_ARCH STREQUAL "riscv" OR _TARGET_ARCH STREQUAL "riscv64") + set(BASE64_TARGET_RISCV ON) +else() + set(BASE64_TARGET_RISCV OFF) +endif() +add_feature_info(RISC-V BASE64_TARGET_RISCV "use the portable codec on RISC-V targets") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") diff --git a/cmake/Modules/TargetArch.cmake b/cmake/Modules/TargetArch.cmake index d5b0a50b..f2e3bd11 100644 --- a/cmake/Modules/TargetArch.cmake +++ b/cmake/Modules/TargetArch.cmake @@ -15,16 +15,29 @@ set(TARGET_ARCHITECTURE_TEST_FILE "${CMAKE_CURRENT_LIST_DIR}/../test-arch.c") function(detect_target_architecture OUTPUT_VARIABLE) message(STATUS "${CMAKE_CURRENT_LIST_DIR}") - try_compile(_IGNORED "${CMAKE_CURRENT_BINARY_DIR}" - "${TARGET_ARCHITECTURE_TEST_FILE}" - OUTPUT_VARIABLE _LOG - ) + set(_TARGET_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}") + if (DEFINED CACHE{CMAKE_SYSTEM_PROCESSOR}) + list(APPEND _TARGET_PROCESSOR "$CACHE{CMAKE_SYSTEM_PROCESSOR}") + endif() + string(TOLOWER "${_TARGET_PROCESSOR}" _TARGET_PROCESSOR) + + if (_TARGET_PROCESSOR MATCHES "(^|;)(riscv64|rv64)") + set(_TARGET_ARCHITECTURE "riscv64") + elseif (_TARGET_PROCESSOR MATCHES "(^|;)(riscv32|rv32|riscv)") + set(_TARGET_ARCHITECTURE "riscv") + else() + try_compile(_IGNORED "${CMAKE_CURRENT_BINARY_DIR}" + "${TARGET_ARCHITECTURE_TEST_FILE}" + OUTPUT_VARIABLE _LOG + ) - string(REGEX MATCH "##arch=([^#]+)##" _IGNORED "${_LOG}") + string(REGEX MATCH "##arch=([^#]+)##" _IGNORED "${_LOG}") + set(_TARGET_ARCHITECTURE "${CMAKE_MATCH_1}") + endif() - set(${OUTPUT_VARIABLE} "${CMAKE_MATCH_1}" PARENT_SCOPE) - set("${OUTPUT_VARIABLE}_${CMAKE_MATCH_1}" 1 PARENT_SCOPE) - if (CMAKE_MATCH_1 STREQUAL "unknown") + set(${OUTPUT_VARIABLE} "${_TARGET_ARCHITECTURE}" PARENT_SCOPE) + set("${OUTPUT_VARIABLE}_${_TARGET_ARCHITECTURE}" 1 PARENT_SCOPE) + if (_TARGET_ARCHITECTURE STREQUAL "unknown") message(WARNING "could not detect the target architecture.") endif() endfunction() diff --git a/cmake/config.h.in b/cmake/config.h.in index c7faa94b..c2b50af3 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -25,4 +25,6 @@ #cmakedefine01 BASE64_WITH_NEON64 #define HAVE_NEON64 BASE64_WITH_NEON64 +#cmakedefine01 BASE64_TARGET_RISCV + #endif // BASE64_CONFIG_H diff --git a/cmake/test-arch.c b/cmake/test-arch.c index a62c1443..8065a435 100644 --- a/cmake/test-arch.c +++ b/cmake/test-arch.c @@ -21,6 +21,15 @@ || defined(_M_ARM) #error ##arch=arm## +// RISC-V 64-Bit +#elif defined(__riscv) \ + && __riscv_xlen == 64 +#error ##arch=riscv64## + +// RISC-V +#elif defined(__riscv) +#error ##arch=riscv## + // x86 64-Bit #elif defined(__x86_64__) \ || defined(_M_X64)