• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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