Skip to content

Commit 4c81e17

Browse files
authored
Merge pull request opencv#25901 from mshabunin:fix-riscv-aarch-baseline
RISC-V/AArch64: disable CPU features detection opencv#25901 This PR is the first step in fixing current issues with NEON/RVV, FP16, BF16 and other CPU features on AArch64 and RISC-V platforms. On AArch64 and RISC-V platforms we usually have the platform set by default in the toolchain when we compile it or in the cmake toolchain file or in CMAKE_CXX_FLAGS by user. Then, there are two ways to set platform options: a) "-mcpu=<some_cpu>" ; b) "-march=<arch description>" (e.g. "rv64gcv"). Furthermore, there are no similar "levels" of optimizations as for x86_64, instead we have features (RVV, FP16,...) which can be enabled or disabled. So, for example, if a user has "rv64gc" set by the toolchain and we want to enable RVV. Then we need to somehow parse their current feature set and append "v" (vector optimizations) to this string. This task is quite hard and the whole procedure is prone to errors. I propose to use "CPU_BASELINE=DETECT" by default on AArch64 and RISC-V platforms. And somehow remove other features or make them read-only/detect-only, so that OpenCV wouldn't add any extra "-march" flags to the default configuration. We would rely only on the flags provided by the compiler and cmake toolchain file. We can have some predefined configurations in our cmake toolchain files. Changes made by this PR: - `CMakeLists.txt`: - use `CMAKE_CROSSCOMPILING` instead of `CMAKE_TOOLCHAIN_FILE` to detect cross-compilation. This might be useful in cases of native compilation with a toolchain file - removed obsolete variables `ENABLE_NEON` and `ENABLE_VFPV3`, the first one have been turned ON by default on AArch64 platform which caused setting `CPU_BASELINE=NEON` - raise minimum cmake version allowed to 3.7 to allow using `CMAKE_CXX_FLAGS_INIT` in toolchain files - added separate files with arch flags for native compilation on AArch64 and RISC-V, these files will be used in our toolchain files and in regular cmake - use `DETECT` as default value for `CPU_BASELINE` also allow `NATIVE`, warn user if other values were used (only for AArch64 and RISC-V) - for each feature listed in `CPU_DISPATCH` check if corresponding `CPU_${opt}_FLAGS_ON` has been provided, warn user if it is empty (only for AArch64 and RISC-V) - use `CPU_BASELINE_DISABLE` variable to actually turn off macros responsible for corresponding features even if they are enabled by compiler - removed Aarch64 feature merge procedure (it didn't support `-mcpu` and built-in `-march`) - reworked AArch64 and two RISC-V cmake toolchain files (does not affect Android/OSX/iOS/Win): - use `CMAKE_CXX_FLAGS_INIT` to set compiler flags - use variables `ENABLE_BF16`, `ENABLE_DOTPROD`, `ENABLE_RVV`, `ENABLE_FP16` to control `-march` - AArch64: removed other compiler and linker flags - `-fdata-sections`, `-fsigned-char`, `-Wl,--no-undefined`, `-Wl,--gc-sections` - already set by OpenCV - `-Wa,--noexecstack`, `-Wl,-z,noexecstack`, `-Wl,-z,relro`, `-Wl,-z,now` - can be enabled by OpenCV via `ENABLE_HARDENING` - `-Wno-psabi` - this option used to disable some warnings on older ARM platforms, shouldn't harm - ARM: removed same common flags as for AArch64, but left `-mthumb` and `--fix-cortex-a8`, `-z nocopyreloc`
1 parent 85923c8 commit 4c81e17

11 files changed

+115
-81
lines changed

CMakeLists.txt

+1-5
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ if(NOT OPENCV_SKIP_CMAKE_SYSTEM_FILE)
145145
endif()
146146

147147
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) # https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT.html
148-
if(NOT CMAKE_TOOLCHAIN_FILE)
148+
if(NOT CMAKE_CROSSCOMPILING)
149149
if(WIN32)
150150
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory" FORCE)
151151
else()
@@ -513,10 +513,6 @@ OCV_OPTION(OPENCV_ENABLE_MEMORY_SANITIZER "Better support for memory/address san
513513
OCV_OPTION(ENABLE_OMIT_FRAME_POINTER "Enable -fomit-frame-pointer for GCC" ON IF CV_GCC )
514514
OCV_OPTION(ENABLE_POWERPC "Enable PowerPC for GCC" ON IF (CV_GCC AND CMAKE_SYSTEM_PROCESSOR MATCHES powerpc.*) )
515515
OCV_OPTION(ENABLE_FAST_MATH "Enable compiler options for fast math optimizations on FP computations (not recommended)" OFF)
516-
if(NOT IOS AND (NOT ANDROID OR OPENCV_ANDROID_USE_LEGACY_FLAGS) AND CMAKE_CROSSCOMPILING) # Use CPU_BASELINE instead
517-
OCV_OPTION(ENABLE_NEON "Enable NEON instructions" (NEON OR ANDROID_ARM_NEON OR AARCH64) IF (CV_GCC OR CV_CLANG) AND (ARM OR AARCH64 OR IOS OR XROS) )
518-
OCV_OPTION(ENABLE_VFPV3 "Enable VFPv3-D32 instructions" OFF IF (CV_GCC OR CV_CLANG) AND (ARM OR AARCH64 OR IOS OR XROS) )
519-
endif()
520516
OCV_OPTION(ENABLE_NOISY_WARNINGS "Show all warnings even if they are too noisy" OFF )
521517
OCV_OPTION(OPENCV_WARNINGS_ARE_ERRORS "Treat warnings as errors" OFF )
522518
OCV_OPTION(ANDROID_EXAMPLES_WITH_LIBS "Build binaries of Android examples with native libraries" OFF IF ANDROID )

cmake/OpenCVCompilerOptimizations.cmake

+35-37
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ ocv_optimization_process_obsolete_option(ENABLE_AVX2 AVX2 ON)
104104
ocv_optimization_process_obsolete_option(ENABLE_FMA3 FMA3 ON)
105105

106106
ocv_optimization_process_obsolete_option(ENABLE_VFPV3 VFPV3 OFF)
107-
ocv_optimization_process_obsolete_option(ENABLE_NEON NEON OFF)
107+
ocv_optimization_process_obsolete_option(ENABLE_NEON NEON ON)
108108

109109
ocv_optimization_process_obsolete_option(ENABLE_VSX VSX ON)
110110

@@ -170,7 +170,29 @@ elseif(" ${CMAKE_CXX_FLAGS} " MATCHES " -march=native | -xHost | /QxHost ")
170170
set(CPU_BASELINE_DETECT ON)
171171
endif()
172172

173+
# For platforms which don't allow enabling of extra instruction sets with separate compiler options.
174+
# E.g. GCC/Clang for RISC-V/AArch64 use suffixes for -march option. So we should avoid using existing
175+
# CPU features mechanisms and rely on cmake-toolchain files or flags provided via command-line.
176+
macro(ocv_default_baseline_detect_and_check_dispatch)
177+
set(CPU_BASELINE "DETECT" CACHE STRING "${HELP_CPU_BASELINE}")
178+
if(NOT CPU_BASELINE MATCHES "^(DETECT|NATIVE|)$")
179+
message(WARNING "CPU_BASELINE is set to '${CPU_BASELINE}', but '${CMAKE_SYSTEM_PROCESSOR}' "
180+
"platform is designed to work with DETECT|NATIVE|<empty>, "
181+
"otherwise target CPU architecture may be changed unexpectedly. "
182+
"Please check your resulting compiler flags in the CMake output.")
183+
endif()
184+
foreach(opt ${CPU_DISPATCH})
185+
if(NOT DEFINED CPU_${opt}_FLAGS_ON)
186+
message(WARNING "${opt} is in the CPU_DISPATCH list, but 'CPU_${opt}_FLAGS_ON' is not set. "
187+
"Please provide feature-specific compiler options explicitly.")
188+
endif()
189+
endforeach()
190+
endmacro()
191+
192+
#===================================================================================================
193+
173194
if(X86 OR X86_64)
195+
174196
ocv_update(CPU_KNOWN_OPTIMIZATIONS "SSE;SSE2;SSE3;SSSE3;SSE4_1;POPCNT;SSE4_2;AVX;FP16;AVX2;FMA3;AVX_512F;AVX512_COMMON;AVX512_KNL;AVX512_KNM;AVX512_SKX;AVX512_CNL;AVX512_CLX;AVX512_ICL")
175197

176198
ocv_update(CPU_AVX512_COMMON_GROUP "AVX_512F;AVX_512CD")
@@ -330,6 +352,7 @@ if(X86 OR X86_64)
330352
endif()
331353

332354
elseif(ARM OR AARCH64)
355+
333356
ocv_update(CPU_NEON_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_neon.cpp")
334357
ocv_update(CPU_FP16_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_fp16.cpp")
335358
ocv_update(CPU_NEON_FP16_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_neon_fp16.cpp")
@@ -347,7 +370,6 @@ elseif(ARM OR AARCH64)
347370
ocv_update(CPU_FP16_IMPLIES "NEON")
348371
else()
349372
ocv_update(CPU_KNOWN_OPTIMIZATIONS "NEON;FP16;NEON_DOTPROD;NEON_FP16;NEON_BF16")
350-
ocv_update(CPU_NEON_FLAGS_ON "")
351373
ocv_update(CPU_FP16_IMPLIES "NEON")
352374
ocv_update(CPU_NEON_DOTPROD_IMPLIES "NEON")
353375
ocv_update(CPU_NEON_FP16_IMPLIES "NEON")
@@ -361,15 +383,19 @@ elseif(ARM OR AARCH64)
361383
ocv_update(CPU_NEON_FP16_FLAGS_ON "-march=armv8.2-a+fp16")
362384
ocv_update(CPU_NEON_BF16_FLAGS_ON "-march=armv8.2-a+bf16")
363385
endif()
364-
set(CPU_BASELINE "NEON;FP16" CACHE STRING "${HELP_CPU_BASELINE}")
365386
set(CPU_DISPATCH "NEON_FP16;NEON_BF16;NEON_DOTPROD" CACHE STRING "${HELP_CPU_DISPATCH}")
387+
ocv_default_baseline_detect_and_check_dispatch()
366388
endif()
389+
367390
elseif(MIPS)
391+
368392
ocv_update(CPU_MSA_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_msa.cpp")
369393
ocv_update(CPU_KNOWN_OPTIMIZATIONS "MSA")
370394
ocv_update(CPU_MSA_FLAGS_ON "-mmsa")
371395
set(CPU_BASELINE "DETECT" CACHE STRING "${HELP_CPU_BASELINE}")
396+
372397
elseif(PPC64LE)
398+
373399
ocv_update(CPU_KNOWN_OPTIMIZATIONS "VSX;VSX3")
374400
ocv_update(CPU_VSX_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_vsx.cpp")
375401
ocv_update(CPU_VSX3_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_vsx3.cpp")
@@ -390,15 +416,13 @@ elseif(PPC64LE)
390416
set(CPU_BASELINE "VSX" CACHE STRING "${HELP_CPU_BASELINE}")
391417

392418
elseif(RISCV)
393-
ocv_update(CPU_RVV_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_rvv.cpp")
394-
ocv_update(CPU_KNOWN_OPTIMIZATIONS "RVV")
395-
ocv_update(CPU_RVV_FLAGS_ON "-march=rv64gcv")
396-
ocv_update(CPU_RVV_FLAGS_CONFLICT "-march=[^ ]*")
397419

398-
set(CPU_DISPATCH "" CACHE STRING "${HELP_CPU_DISPATCH}")
399-
set(CPU_BASELINE "DETECT" CACHE STRING "${HELP_CPU_BASELINE}")
420+
ocv_update(CPU_KNOWN_OPTIMIZATIONS "RVV")
421+
ocv_update(CPU_RVV_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_rvv.cpp")
422+
ocv_default_baseline_detect_and_check_dispatch()
400423

401424
elseif(LOONGARCH64)
425+
402426
ocv_update(CPU_LSX_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_lsx.cpp")
403427
ocv_update(CPU_LASX_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_lasx.cpp")
404428
ocv_update(CPU_KNOWN_OPTIMIZATIONS "LSX;LASX")
@@ -440,7 +464,7 @@ macro(ocv_check_compiler_optimization OPT)
440464
set(_varname "")
441465
if(CPU_${OPT}_TEST_FILE)
442466
set(__available 0)
443-
if(__is_from_baseline OR CPU_BASELINE_DETECT)
467+
if(NOT __is_disabled AND (__is_from_baseline OR CPU_BASELINE_DETECT))
444468
set(_varname "HAVE_CPU_${OPT}_SUPPORT")
445469
ocv_check_compiler_flag(CXX "${CPU_BASELINE_FLAGS}" "${_varname}" "${CPU_${OPT}_TEST_FILE}")
446470
if(${_varname})
@@ -478,23 +502,6 @@ macro(ocv_check_compiler_optimization OPT)
478502
endif()
479503
endmacro()
480504

481-
macro(ocv_cpu_aarch64_baseline_merge_feature_options FEATURE_NAME_LIST FLAG_STRING COMMON_OPTION)
482-
unset(_POSTFIX)
483-
# Check each feature option
484-
foreach(OPT IN LISTS ${FEATURE_NAME_LIST})
485-
string(FIND "${${FLAG_STRING}}" "${CPU_${OPT}_FLAGS_ON}" OPT_FOUND)
486-
if(NOT ${OPT_FOUND} EQUAL -1)
487-
string(REPLACE "${COMMON_OPTION}" "" TRAILING_PART "${CPU_${OPT}_FLAGS_ON}")
488-
string(APPEND _POSTFIX "${TRAILING_PART}")
489-
string(REPLACE " ${CPU_${OPT}_FLAGS_ON}" "" ${FLAG_STRING} ${${FLAG_STRING}})
490-
endif()
491-
endforeach()
492-
# If more than one option found, merge them
493-
if(NOT "x${_POSTFIX}" STREQUAL "x")
494-
set(${FLAG_STRING} "${${FLAG_STRING}} ${COMMON_OPTION}${_POSTFIX}")
495-
endif()
496-
endmacro()
497-
498505
foreach(OPT ${CPU_KNOWN_OPTIMIZATIONS})
499506
set(CPU_${OPT}_USAGE_COUNT 0 CACHE INTERNAL "")
500507
if("${CPU_${OPT}_FLAGS_ON}" STREQUAL "disabled")
@@ -577,7 +584,7 @@ foreach(OPT ${CPU_KNOWN_OPTIMIZATIONS})
577584
if(CPU_${OPT}_SUPPORTED)
578585
if(";${CPU_DISPATCH};" MATCHES ";${OPT};" AND NOT __is_from_baseline)
579586
list(APPEND CPU_DISPATCH_FINAL ${OPT})
580-
elseif(__is_from_baseline)
587+
elseif(__is_from_baseline AND NOT __is_disabled)
581588
if(NOT ";${CPU_BASELINE_FINAL};" MATCHES ";${OPT};")
582589
list(APPEND CPU_BASELINE_FINAL ${OPT})
583590
endif()
@@ -588,15 +595,6 @@ foreach(OPT ${CPU_KNOWN_OPTIMIZATIONS})
588595
endif()
589596
endforeach()
590597

591-
if(AARCH64)
592-
if(NOT MSVC)
593-
# Define the list of NEON options to check
594-
set(NEON_OPTIONS_LIST NEON_DOTPROD NEON_FP16 NEON_BF16)
595-
set(BASE_ARCHITECTURE "-march=armv8.2-a")
596-
ocv_cpu_aarch64_baseline_merge_feature_options(NEON_OPTIONS_LIST CPU_BASELINE_FLAGS ${BASE_ARCHITECTURE})
597-
endif()
598-
endif()
599-
600598
foreach(OPT ${CPU_BASELINE_REQUIRE})
601599
if(NOT ";${CPU_BASELINE_FINAL};" MATCHES ";${OPT};")
602600
message(SEND_ERROR "Required baseline optimization is not supported: ${OPT} (CPU_BASELINE_REQUIRE=${CPU_BASELINE_REQUIRE})")

cmake/OpenCVCompilerOptions.cmake

+11
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ macro(add_env_definitions option)
7777
add_definitions("-D${option}=\"${value}\"")
7878
endmacro()
7979

80+
# Use same flags for native AArch64 and RISC-V compilation as for cross-compile (Linux)
81+
if(NOT CMAKE_CROSSCOMPILING AND NOT CMAKE_TOOLCHAIN_FILE AND COMMAND ocv_set_platform_flags)
82+
unset(platform_flags)
83+
ocv_set_platform_flags(platform_flags)
84+
# externally-provided flags should have higher priority - prepend our flags
85+
if(platform_flags)
86+
set(CMAKE_CXX_FLAGS "${platform_flags} ${CMAKE_CXX_FLAGS}")
87+
set(CMAKE_C_FLAGS "${platform_flags} ${CMAKE_C_FLAGS}")
88+
endif()
89+
endif()
90+
8091
if(NOT MSVC)
8192
# OpenCV fails some tests when 'char' is 'unsigned' by default
8293
add_extra_compiler_option(-fsigned-char)

cmake/OpenCVMinDepVersions.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
if(NOT DEFINED MIN_VER_CMAKE)
2-
set(MIN_VER_CMAKE 3.5.1)
2+
set(MIN_VER_CMAKE 3.7)
33
endif()
44
set(MIN_VER_CUDA 6.5)
55
set(MIN_VER_CUDNN 7.5)

cmake/platforms/OpenCV-Linux.cmake

+9-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1-
# empty
1+
if((CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
2+
AND NOT CMAKE_CROSSCOMPILING
3+
AND NOT CMAKE_TOOLCHAIN_FILE)
4+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") # Maybe use AARCH64 variable?
5+
include(${CMAKE_CURRENT_LIST_DIR}/../../platforms/linux/flags-aarch64.cmake)
6+
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64")
7+
include(${CMAKE_CURRENT_LIST_DIR}/../../platforms/linux/flags-riscv64.cmake)
8+
endif()
9+
endif()

platforms/linux/arm.toolchain.cmake

+14-23
Original file line numberDiff line numberDiff line change
@@ -48,32 +48,23 @@ if(NOT DEFINED ARM_LINUX_SYSROOT AND DEFINED GNU_MACHINE)
4848
set(ARM_LINUX_SYSROOT /usr/${GNU_MACHINE}${FLOAT_ABI_SUFFIX})
4949
endif()
5050

51-
if(NOT DEFINED CMAKE_CXX_FLAGS)
52-
set(CMAKE_CXX_FLAGS "" CACHE INTERNAL "")
53-
set(CMAKE_C_FLAGS "" CACHE INTERNAL "")
54-
set(CMAKE_SHARED_LINKER_FLAGS "" CACHE INTERNAL "")
55-
set(CMAKE_MODULE_LINKER_FLAGS "" CACHE INTERNAL "")
56-
set(CMAKE_EXE_LINKER_FLAGS "" CACHE INTERNAL "")
57-
58-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
59-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
60-
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
61-
set(CMAKE_CXX_FLAGS "-mthumb ${CMAKE_CXX_FLAGS}")
62-
set(CMAKE_C_FLAGS "-mthumb ${CMAKE_C_FLAGS}")
63-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,nocopyreloc")
64-
endif()
65-
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
66-
set(ARM_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
67-
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
68-
set(ARM_LINKER_FLAGS "-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
51+
# == Compiler flags
52+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
53+
set(CMAKE_CXX_FLAGS_INIT "-mthumb")
54+
set(CMAKE_C_FLAGS_INIT "-mthumb")
55+
set(common_ld_opt "-Wl,--fix-cortex-a8")
56+
set(CMAKE_SHARED_LINKER_FLAGS_INIT "${common_ld_opt}")
57+
set(CMAKE_MODULE_LINKER_FLAGS_INIT "${common_ld_opt}")
58+
set(CMAKE_EXE_LINKER_FLAGS_INIT "${common_ld_opt} -Wl,-z,nocopyreloc")
59+
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
60+
include("${CMAKE_CURRENT_LIST_DIR}/flags-aarch64.cmake")
61+
if(COMMAND ocv_set_platform_flags)
62+
ocv_set_platform_flags(CMAKE_CXX_FLAGS_INIT)
63+
ocv_set_platform_flags(CMAKE_C_FLAGS_INIT)
6964
endif()
70-
set(CMAKE_SHARED_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
71-
set(CMAKE_MODULE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
72-
set(CMAKE_EXE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
73-
else()
74-
#message(WARNING "CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}' is defined")
7565
endif()
7666

67+
7768
if(USE_NEON)
7869
message(WARNING "You use obsolete variable USE_NEON to enable NEON instruction set. Use -DENABLE_NEON=ON instead." )
7970
set(ENABLE_NEON TRUE)

platforms/linux/flags-aarch64.cmake

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# see https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html#index-march
2+
function(ocv_set_platform_flags VAR)
3+
unset(flags)
4+
if(ENABLE_BF16)
5+
set(flags "${flags}+bf16")
6+
endif()
7+
if(ENABLE_DOTPROD)
8+
set(flags "${flags}+dotprod")
9+
endif()
10+
if(ENABLE_FP16)
11+
set(flags "${flags}+fp16")
12+
endif()
13+
if(DEFINED ENABLE_NEON AND NOT ENABLE_NEON)
14+
set(flags "${flags}+nosimd")
15+
endif()
16+
if(flags)
17+
set(${VAR} "-march=armv8.2-a${flags}" PARENT_SCOPE)
18+
endif()
19+
endfunction()

platforms/linux/flags-riscv64.cmake

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# see https://gcc.gnu.org/onlinedocs/gcc/RISC-V-Options.html#index-march-14
2+
function(ocv_set_platform_flags VAR)
3+
if(ENABLE_RVV OR RISCV_RVV_SCALABLE)
4+
set(flags "-march=rv64gcv")
5+
else()
6+
set(flags "-march=rv64gc")
7+
endif()
8+
set(${VAR} "${flags}" PARENT_SCOPE)
9+
endfunction()

platforms/linux/riscv64-andes-gcc.toolchain.cmake

+4-8
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,12 @@ set(CMAKE_C_COMPILER ${RISCV_GCC_INSTALL_ROOT}/bin/riscv64-linux-gcc)
1010
set(CMAKE_CXX_COMPILER ${RISCV_GCC_INSTALL_ROOT}/bin/riscv64-linux-g++)
1111

1212
# fix toolchain macro
13-
14-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__ANDES=1")
15-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__ANDES=1")
16-
1713
# enable rvp
1814

19-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=rv64gc -mext-dsp")
20-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv64gc -mext-dsp")
15+
set(CMAKE_C_FLAGS_INIT "-march=rv64gc -mext-dsp -D__ANDES=1")
16+
set(CMAKE_CXX_FLAGS_INIT "-march=rv64gc -mext-dsp -D__ANDES=1")
2117

2218
# fix segment address
2319

24-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Ttext-segment=0x50000")
25-
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-Ttext-segment=0x50000")
20+
set(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,-Ttext-segment=0x50000")
21+
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-Wl,-Ttext-segment=0x50000")

platforms/linux/riscv64-clang.toolchain.cmake

+7-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,13 @@ set(CMAKE_ASM_COMPILER_TARGET ${CLANG_TARGET_TRIPLE})
1717
# Don't run the linker on compiler check
1818
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
1919

20-
set(CMAKE_C_FLAGS "-march=rv64gc --gcc-toolchain=${RISCV_GCC_INSTALL_ROOT} -w ${CMAKE_C_FLAGS}")
21-
set(CMAKE_CXX_FLAGS "-march=rv64gc --gcc-toolchain=${RISCV_GCC_INSTALL_ROOT} -w ${CMAKE_CXX_FLAGS}")
20+
include("${CMAKE_CURRENT_LIST_DIR}/flags-riscv64.cmake")
21+
if(COMMAND ocv_set_platform_flags)
22+
ocv_set_platform_flags(CMAKE_CXX_FLAGS_INIT)
23+
ocv_set_platform_flags(CMAKE_C_FLAGS_INIT)
24+
endif()
25+
set(CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS_INIT} --gcc-toolchain=${RISCV_GCC_INSTALL_ROOT} -w")
26+
set(CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS_INIT} --gcc-toolchain=${RISCV_GCC_INSTALL_ROOT} -w")
2227

2328
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
2429
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+5-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
set(CMAKE_SYSTEM_NAME Linux)
2-
set(CMAKE_SYSTEM_VERSION 1)
2+
set(CMAKE_SYSTEM_PROCESSOR riscv64)
33
set(GNU_MACHINE riscv64-unknown-linux-gnu CACHE STRING "GNU compiler triple")
44

5-
if(NOT DEFINED CMAKE_CXX_FLAGS) # guards toolchain multiple calls
6-
set(CMAKE_C_FLAGS "-march=rv64gc")
7-
set(CMAKE_CXX_FLAGS "-march=rv64gc")
5+
include("${CMAKE_CURRENT_LIST_DIR}/flags-riscv64.cmake")
6+
if(COMMAND ocv_set_platform_flags)
7+
ocv_set_platform_flags(CMAKE_CXX_FLAGS_INIT)
8+
ocv_set_platform_flags(CMAKE_C_FLAGS_INIT)
89
endif()
910

1011
include("${CMAKE_CURRENT_LIST_DIR}/riscv-gnu.toolchain.cmake")

0 commit comments

Comments
 (0)