Mercurial > thymian
comparison 3rdparty/vmime/cmake/TargetArch.cmake @ 0:a4671277546c tip
created the repository for the thymian project
| author | ferencd |
|---|---|
| date | Tue, 17 Aug 2021 11:19:54 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:a4671277546c |
|---|---|
| 1 # https://github.com/petroules/solar-cmake | |
| 2 # | |
| 3 # Based on the Qt 5 processor detection code, so should be very accurate | |
| 4 # https://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/global/qprocessordetection.h | |
| 5 # Currently handles arm (v5, v6, v7), x86 (32/64), ia64, and ppc (32/64) | |
| 6 | |
| 7 # Regarding POWER/PowerPC, just as is noted in the Qt source, | |
| 8 # "There are many more known variants/revisions that we do not handle/detect." | |
| 9 | |
| 10 set(archdetect_c_code " | |
| 11 #if defined(__arm__) || defined(__TARGET_ARCH_ARM) | |
| 12 #if defined(__ARM_ARCH_7__) \\ | |
| 13 || defined(__ARM_ARCH_7A__) \\ | |
| 14 || defined(__ARM_ARCH_7R__) \\ | |
| 15 || defined(__ARM_ARCH_7M__) \\ | |
| 16 || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 7) | |
| 17 #error cmake_ARCH armv7 | |
| 18 #elif defined(__ARM_ARCH_6__) \\ | |
| 19 || defined(__ARM_ARCH_6J__) \\ | |
| 20 || defined(__ARM_ARCH_6T2__) \\ | |
| 21 || defined(__ARM_ARCH_6Z__) \\ | |
| 22 || defined(__ARM_ARCH_6K__) \\ | |
| 23 || defined(__ARM_ARCH_6ZK__) \\ | |
| 24 || defined(__ARM_ARCH_6M__) \\ | |
| 25 || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 6) | |
| 26 #error cmake_ARCH armv6 | |
| 27 #elif defined(__ARM_ARCH_5TEJ__) \\ | |
| 28 || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 5) | |
| 29 #error cmake_ARCH armv5 | |
| 30 #else | |
| 31 #error cmake_ARCH arm | |
| 32 #endif | |
| 33 #elif defined(__i386) || defined(__i386__) || defined(_M_IX86) | |
| 34 #error cmake_ARCH i386 | |
| 35 #elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) | |
| 36 #error cmake_ARCH x86_64 | |
| 37 #elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64) | |
| 38 #error cmake_ARCH ia64 | |
| 39 #elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \\ | |
| 40 || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \\ | |
| 41 || defined(_M_MPPC) || defined(_M_PPC) | |
| 42 #if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__) | |
| 43 #error cmake_ARCH ppc64 | |
| 44 #else | |
| 45 #error cmake_ARCH ppc | |
| 46 #endif | |
| 47 #endif | |
| 48 | |
| 49 #error cmake_ARCH unknown | |
| 50 ") | |
| 51 | |
| 52 # Set ppc_support to TRUE before including this file or ppc and ppc64 | |
| 53 # will be treated as invalid architectures since they are no longer supported by Apple | |
| 54 | |
| 55 function(target_architecture output_var) | |
| 56 if(APPLE AND CMAKE_OSX_ARCHITECTURES) | |
| 57 # On OS X we use CMAKE_OSX_ARCHITECTURES *if* it was set | |
| 58 # First let's normalize the order of the values | |
| 59 | |
| 60 # Note that it's not possible to compile PowerPC applications if you are using | |
| 61 # the OS X SDK version 10.6 or later - you'll need 10.4/10.5 for that, so we | |
| 62 # disable it by default | |
| 63 # See this page for more information: | |
| 64 # http://stackoverflow.com/questions/5333490/how-can-we-restore-ppc-ppc64-as-well-as-full-10-4-10-5-sdk-support-to-xcode-4 | |
| 65 | |
| 66 # Architecture defaults to i386 or ppc on OS X 10.5 and earlier, depending on the CPU type detected at runtime. | |
| 67 # On OS X 10.6+ the default is x86_64 if the CPU supports it, i386 otherwise. | |
| 68 | |
| 69 foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES}) | |
| 70 if("${osx_arch}" STREQUAL "ppc" AND ppc_support) | |
| 71 set(osx_arch_ppc TRUE) | |
| 72 elseif("${osx_arch}" STREQUAL "i386") | |
| 73 set(osx_arch_i386 TRUE) | |
| 74 elseif("${osx_arch}" STREQUAL "x86_64") | |
| 75 set(osx_arch_x86_64 TRUE) | |
| 76 elseif("${osx_arch}" STREQUAL "ppc64" AND ppc_support) | |
| 77 set(osx_arch_ppc64 TRUE) | |
| 78 else() | |
| 79 message(FATAL_ERROR "Invalid OS X arch name: ${osx_arch}") | |
| 80 endif() | |
| 81 endforeach() | |
| 82 | |
| 83 # Now add all the architectures in our normalized order | |
| 84 if(osx_arch_ppc) | |
| 85 list(APPEND ARCH ppc) | |
| 86 endif() | |
| 87 | |
| 88 if(osx_arch_i386) | |
| 89 list(APPEND ARCH i386) | |
| 90 endif() | |
| 91 | |
| 92 if(osx_arch_x86_64) | |
| 93 list(APPEND ARCH x86_64) | |
| 94 endif() | |
| 95 | |
| 96 if(osx_arch_ppc64) | |
| 97 list(APPEND ARCH ppc64) | |
| 98 endif() | |
| 99 else() | |
| 100 file(WRITE "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/arch.c" "${archdetect_c_code}") | |
| 101 | |
| 102 enable_language(C) | |
| 103 | |
| 104 # Detect the architecture in a rather creative way... | |
| 105 # This compiles a small C program which is a series of ifdefs that selects a | |
| 106 # particular #error preprocessor directive whose message string contains the | |
| 107 # target architecture. The program will always fail to compile (both because | |
| 108 # file is not a valid C program, and obviously because of the presence of the | |
| 109 # #error preprocessor directives... but by exploiting the preprocessor in this | |
| 110 # way, we can detect the correct target architecture even when cross-compiling, | |
| 111 # since the program itself never needs to be run (only the compiler/preprocessor) | |
| 112 try_run( | |
| 113 run_result_unused | |
| 114 compile_result_unused | |
| 115 "${CMAKE_BINARY_DIR}" | |
| 116 "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/arch.c" | |
| 117 COMPILE_OUTPUT_VARIABLE ARCH | |
| 118 CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} | |
| 119 ) | |
| 120 | |
| 121 # Parse the architecture name from the compiler output | |
| 122 string(REGEX MATCH "cmake_ARCH ([a-zA-Z0-9_]+)" ARCH "${ARCH}") | |
| 123 | |
| 124 # Get rid of the value marker leaving just the architecture name | |
| 125 string(REPLACE "cmake_ARCH " "" ARCH "${ARCH}") | |
| 126 | |
| 127 # If we are compiling with an unknown architecture this variable should | |
| 128 # already be set to "unknown" but in the case that it's empty (i.e. due | |
| 129 # to a typo in the code), then set it to unknown | |
| 130 if (NOT ARCH) | |
| 131 set(ARCH unknown) | |
| 132 endif() | |
| 133 endif() | |
| 134 | |
| 135 set(${output_var} "${ARCH}" PARENT_SCOPE) | |
| 136 endfunction() |
