Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand Down
29 changes: 21 additions & 8 deletions cmake/Modules/TargetArch.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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()
2 changes: 2 additions & 0 deletions cmake/config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,6 @@
#cmakedefine01 BASE64_WITH_NEON64
#define HAVE_NEON64 BASE64_WITH_NEON64

#cmakedefine01 BASE64_TARGET_RISCV

#endif // BASE64_CONFIG_H
9 changes: 9 additions & 0 deletions cmake/test-arch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down