1 2# cmake options: TARGET_C_ARCH / TARGET_CPP_ARCH: 3# and optionally: TARGET_C_EXTRA TARGET_CXX_EXTRA 4# 5# provided: 6# - function: target_set_c_arch_flags(<target>) # uses options TARGET_C_ARCH and TARGET_C_EXTRA 7# - function: target_set_cxx_arch_flags(<target>) # uses options TARGET_CXX_ARCH and TARGET_CXX_EXTRA 8# - macro: target_set_cxx_arch_option(<target> <gcc/clang_march> <gcc/clang_extra> <msvc_arch>) 9# 10# see https://en.wikichip.org/wiki/x86/extensions 11# and https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html 12# for gcc specific architecture options 13# and https://docs.microsoft.com/en-us/cpp/build/reference/arch-x64 14# or https://docs.microsoft.com/en-us/cpp/build/reference/arch-x86 15# for msvc specific architecture options 16 17# https://en.wikichip.org/wiki/arm/versions 18# https://en.wikipedia.org/wiki/Raspberry_Pi 19# https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html#ARM-Options 20# https://en.wikipedia.org/wiki/Comparison_of_ARMv7-A_cores 21# https://en.wikipedia.org/wiki/Comparison_of_ARMv8-A_cores 22 23# arm32_rpi1 untested 24# -mcpu=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp -mtune=arm1176jzf-s 25# arm32_rpi2 untested 26# "-march=armv7-a" "-mfloat-abi=hard" "-mfpu=neon-vfpv4" 27# "-march=armv8-a" "-mfloat-abi=hard" "-mfpu=neon-vfpv4" 28# arm32_rpi3 with "armv7-a" tested on Raspbian GNU/Linux 10 (buster), 32-bit => MIPP test reports: NEONv1, 128 bits 29# "-march=armv7-a" "-mfloat-abi=hard" "-mfpu=neon-vfpv4" 30# arm32_rpi3 with "armv8-a" tested on Raspbian GNU/Linux 10 (buster), 32-bit => MIPP test reports: NEONv1, 128 bits 31# "-march=armv8-a" "-mfloat-abi=hard" "-mfpu=neon-vfpv4" 32# arm32_rpi3 with "armv8-a" tested on Raspbian GNU/Linux 10 (buster), 32-bit => MIPP test reports: NEONv1, 128 bits 33# "-march=armv8-a" "-mfloat-abi=hard" "-mfpu=neon-vfpv4" "-mtune=cortex-a53" 34# arm32_rpi4 untested 35# RPi 4 Model B: Cortex-A72 => "-mtune=cortex-a72" ? 36# "-mcpu=cortex-a72 -mfloat-abi=hard -mfpu=neon-fp-armv8 -mneon-for-64bits -mtune=cortex-a72" 37 38set(MSVC_EXTRA_OPT_none "") 39set(GCC_EXTRA_OPT_none "") 40set(GCC_EXTRA_OPT_neon_vfpv4 "-mfloat-abi=hard" "-mfpu=neon-vfpv4") 41set(GCC_EXTRA_OPT_neon_rpi3_a53 "-mfloat-abi=hard" "-mfpu=neon-vfpv4" "-mtune=cortex-a53") 42set(GCC_EXTRA_OPT_neon_rpi4_a72 "-mfloat-abi=hard" "-mfpu=neon-fp-armv8" "-mtune=cortex-a72") 43 44if ( (CMAKE_SYSTEM_PROCESSOR STREQUAL "i686") OR (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") ) 45 set(GCC_MARCH_DESC "native/SSE2:pentium4/SSE3:core2/SSE4:nehalem/AVX:sandybridge/AVX2:haswell") 46 set(GCC_MARCH_VALUES "none;native;pentium4;core2;nehalem;sandybridge;haswell" CACHE INTERNAL "List of possible architectures") 47 set(GCC_EXTRA_VALUES "" CACHE INTERNAL "List of possible EXTRA options") 48elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") 49 set(GCC_MARCH_DESC "native/ARMwNEON:armv8-a") 50 set(GCC_MARCH_VALUES "none;native;armv8-a" CACHE INTERNAL "List of possible architectures") 51 set(GCC_EXTRA_VALUES "" CACHE INTERNAL "List of possible additional options") 52elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "armv7l") 53 set(GCC_MARCH_DESC "native/ARMwNEON:armv7-a") 54 set(GCC_MARCH_VALUES "none;native;armv7-a" CACHE INTERNAL "List of possible architectures") 55 set(GCC_EXTRA_VALUES "none;neon_vfpv4;neon_rpi3_a53;neon_rpi4_a72" CACHE INTERNAL "List of possible additional options") 56else() 57 message(WARNING "unsupported CMAKE_SYSTEM_PROCESSOR '${CMAKE_SYSTEM_PROCESSOR}'") 58 # other PROCESSORs could be "ppc", "ppc64", "arm" - or something else?! 59 set(GCC_MARCH_DESC "native") 60 set(GCC_MARCH_VALUES "none;native" CACHE INTERNAL "List of possible architectures") 61 set(GCC_EXTRA_VALUES "" CACHE INTERNAL "List of possible additional options") 62endif() 63 64# cmake options - depending on C/C++ compiler 65# how are chances, that C and C++ compilers are from different vendors? 66if (CMAKE_C_COMPILER_ID STREQUAL "GNU") 67 set(TARGET_C_ARCH "none" CACHE STRING "gcc target C architecture (-march): ${GCC_MARCH_DESC}") 68 set_property(CACHE TARGET_C_ARCH PROPERTY STRINGS ${GCC_MARCH_VALUES}) 69 if ( NOT (GCC_EXTRA_VALUES STREQUAL "") ) 70 set(TARGET_C_EXTRA "none" CACHE STRING "gcc additional options for C") 71 set_property(CACHE TARGET_C_EXTRA PROPERTY STRINGS ${GCC_EXTRA_VALUES}) 72 endif() 73elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang") 74 set(TARGET_C_ARCH "none" CACHE STRING "clang target C architecture (-march): ${GCC_MARCH_DESC}") 75 set_property(CACHE TARGET_C_ARCH PROPERTY STRINGS ${GCC_MARCH_VALUES}) 76 if ( NOT (GCC_EXTRA_VALUES STREQUAL "") ) 77 set(TARGET_C_EXTRA "none" CACHE STRING "gcc additional options for C") 78 set_property(CACHE TARGET_C_EXTRA PROPERTY STRINGS ${GCC_EXTRA_VALUES}) 79 endif() 80elseif (CMAKE_C_COMPILER_ID MATCHES "MSVC") 81 set(TARGET_C_ARCH "none" CACHE STRING "msvc target C architecture (/arch): SSE2/AVX/AVX2/AVX512") 82 set(TARGET_C_EXTRA "none" CACHE STRING "msvc additional options") 83else() 84 message(WARNING "unsupported C compiler '${CMAKE_C_COMPILER_ID}', see https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html") 85endif() 86 87if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 88 set(TARGET_CXX_ARCH "none" CACHE STRING "gcc target C++ architecture (-march): ${GCC_MARCH_DESC}") 89 set_property(CACHE TARGET_CXX_ARCH PROPERTY STRINGS ${GCC_MARCH_VALUES}) 90 if ( NOT (GCC_EXTRA_VALUES STREQUAL "") ) 91 set(TARGET_CXX_EXTRA "none" CACHE STRING "gcc additional options for C++") 92 set_property(CACHE TARGET_CXX_EXTRA PROPERTY STRINGS ${GCC_EXTRA_VALUES}) 93 endif() 94elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 95 set(TARGET_CXX_ARCH "none" CACHE STRING "clang target C++ architecture (-march): ${GCC_MARCH_DESC}") 96 set_property(CACHE TARGET_CXX_ARCH PROPERTY STRINGS ${GCC_MARCH_VALUES}) 97 if ( NOT (GCC_EXTRA_VALUES STREQUAL "") ) 98 set(TARGET_CXX_EXTRA "none" CACHE STRING "clang additional options for C++") 99 set_property(CACHE TARGET_CXX_EXTRA PROPERTY STRINGS ${GCC_EXTRA_VALUES}) 100 endif() 101elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") 102 set(TARGET_CXX_ARCH "none" CACHE STRING "msvc target C++ architecture (/arch): SSE2/AVX/AVX2/AVX512") 103 set(TARGET_CXX_EXTRA "none" CACHE STRING "msvc additional options") 104else() 105 message(WARNING "unsupported C++ compiler '${CMAKE_CXX_COMPILER_ID}', see https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html") 106endif() 107 108###################################################### 109 110function(target_set_c_arch_flags target) 111 if ( ("${TARGET_C_ARCH}" STREQUAL "") OR ("${TARGET_C_ARCH}" STREQUAL "none") ) 112 message(STATUS "C ARCH for target ${target} is not set!") 113 else() 114 if ( (CMAKE_C_COMPILER_ID STREQUAL "GNU") OR (CMAKE_C_COMPILER_ID STREQUAL "Clang") ) 115 target_compile_options(${target} PRIVATE "-march=${TARGET_C_ARCH}") 116 message(STATUS "C ARCH for target ${target} set: ${TARGET_C_ARCH}") 117 elseif (CMAKE_C_COMPILER_ID MATCHES "MSVC") 118 target_compile_options(${target} PRIVATE "/arch:${TARGET_C_ARCH}") 119 message(STATUS "C ARCH for target ${target} set: ${TARGET_C_ARCH}") 120 else() 121 message(WARNING "unsupported C compiler '${CMAKE_C_COMPILER_ID}' for target_set_c_arch_flags(), see https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html") 122 endif() 123 endif() 124 if ( ("${TARGET_C_EXTRA}" STREQUAL "") OR ("${TARGET_C_EXTRA}" STREQUAL "none") ) 125 message(STATUS "C additional options for target ${target} is not set!") 126 else() 127 if ( (CMAKE_C_COMPILER_ID STREQUAL "GNU") OR (CMAKE_C_COMPILER_ID STREQUAL "Clang") ) 128 target_compile_options(${target} PRIVATE "${GCC_EXTRA_OPT_${TARGET_C_EXTRA}}") 129 message(STATUS "C additional options for target ${target} set: ${GCC_EXTRA_OPT_${TARGET_C_EXTRA}}") 130 elseif (CMAKE_C_COMPILER_ID MATCHES "MSVC") 131 # target_compile_options(${target} PRIVATE "${MSVC_EXTRA_OPT_${TARGET_C_EXTRA}}") 132 message(STATUS "C additional options for target ${target} not usable with MSVC") 133 else() 134 message(WARNING "unsupported C compiler '${CMAKE_C_COMPILER_ID}' for target_set_c_arch_flags(), see https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html") 135 endif() 136 if ( ("${TARGET_C_EXTRA}" MATCHES "^neon_.*") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") ) 137 message(STATUS "additional option contains neon: setting PFFFT_ENABLE_NEON for C target ${target}") 138 target_compile_definitions(${target} PRIVATE PFFFT_ENABLE_NEON=1) 139 endif() 140 endif() 141endfunction() 142 143function(target_set_cxx_arch_flags target) 144 if ( ("${TARGET_CXX_ARCH}" STREQUAL "") OR ("${TARGET_CXX_ARCH}" STREQUAL "none") ) 145 message(STATUS "C++ ARCH for target ${target} is not set!") 146 else() 147 if ( (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") ) 148 target_compile_options(${target} PRIVATE "-march=${TARGET_CXX_ARCH}") 149 message(STATUS "C++ ARCH for target ${target} set: ${TARGET_CXX_ARCH}") 150 elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") 151 target_compile_options(${target} PRIVATE "/arch:${TARGET_CXX_ARCH}") 152 message(STATUS "C++ ARCH for target ${target} set: ${TARGET_CXX_ARCH}") 153 else() 154 message(WARNING "unsupported C++ compiler '${CMAKE_CXX_COMPILER_ID}' for target_set_cxx_arch_flags(), see https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html") 155 endif() 156 endif() 157 if ( ("${TARGET_CXX_EXTRA}" STREQUAL "") OR ("${TARGET_CXX_EXTRA}" STREQUAL "none") ) 158 message(STATUS "C++ additional options for target ${target} is not set!") 159 else() 160 if ( (CMAKE_C_COMPILER_ID STREQUAL "GNU") OR (CMAKE_C_COMPILER_ID STREQUAL "Clang") ) 161 target_compile_options(${target} PRIVATE "${GCC_EXTRA_OPT_${TARGET_CXX_EXTRA}}") 162 message(STATUS "C++ additional options for target ${target} set: ${GCC_EXTRA_OPT_${TARGET_CXX_EXTRA}}") 163 elseif (CMAKE_C_COMPILER_ID MATCHES "MSVC") 164 # target_compile_options(${target} PRIVATE "${MSVC_EXTRA_OPT_${TARGET_CXX_EXTRA}}") 165 message(STATUS "C++ additional options for target ${target} not usable with MSVC") 166 else() 167 message(WARNING "unsupported C compiler '${CMAKE_C_COMPILER_ID}' for target_set_c_arch_flags(), see https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html") 168 endif() 169 if ( ("${TARGET_CXX_EXTRA}" MATCHES "^neon_.*") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") ) 170 message(STATUS "additional option contains 'neon': setting PFFFT_ENABLE_NEON for C++ target ${target}") 171 target_compile_definitions(${target} PRIVATE PFFFT_ENABLE_NEON=1) 172 endif() 173 endif() 174endfunction() 175 176 177macro(target_set_cxx_arch_option target gcc_clang_arch gcc_clang_extra msvc_arch ) 178 if ( (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") ) 179 180 if ( NOT (("${gcc_clang_arch}" STREQUAL "") OR ("${gcc_clang_arch}" STREQUAL "none") ) ) 181 target_compile_options(${target} PRIVATE "-march=${gcc_clang_arch}") 182 message(STATUS "C++ ARCH for target ${target}: ${gcc_clang_arch}") 183 endif() 184 if (NOT ( ("${gcc_clang_extra}" STREQUAL "") OR ("${gcc_clang_extra}" STREQUAL "none") ) ) 185 target_compile_options(${target} PRIVATE "${GCC_EXTRA_OPT_${gcc_clang_extra}}") 186 message(STATUS "C++ additional options for target ${target}: ${GCC_EXTRA_OPT_${gcc_clang_extra}}") 187 endif() 188 elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") 189 if ( NOT (("${msvc_arch}" STREQUAL "") OR ("${msvc_arch}" STREQUAL "none") ) ) 190 target_compile_options(${target} PRIVATE "/arch:${msvc_arch}") 191 message(STATUS "C++ ARCH for target ${target} set: ${msvc_arch}") 192 endif() 193 else() 194 message(WARNING "unsupported C++ compiler '${CMAKE_CXX_COMPILER_ID}' for target_set_cxx_arch_option(), see https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html") 195 endif() 196endmacro() 197 198