瀏覽代碼

Merge topic 'macos-arm64'

b6c60f14b6 macOS: Default to arm64 architecture on Apple Silicon hosts
383e81aa60 Tests: Teach RunCMake to ignore Xcode internal objc warnings
8f75912176 Tests: Enable Assembler test case when CMAKE_OSX_ARCHITECTURES has one value

Acked-by: Kitware Robot <[email protected]>
Merge-request: !5291
Brad King 5 年之前
父節點
當前提交
2e8b85b040

+ 15 - 4
Modules/CMakeDetermineSystem.cmake

@@ -46,10 +46,21 @@ if(CMAKE_HOST_UNIX)
     if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|CYGWIN.*|Darwin|^GNU$|Android")
       exec_program(${CMAKE_UNAME} ARGS -m OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_PROCESSOR
         RETURN_VALUE val)
-      if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin" AND
-         CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "Power Macintosh")
-        # OS X ppc 'uname -m' may report 'Power Macintosh' instead of 'powerpc'
-        set(CMAKE_HOST_SYSTEM_PROCESSOR "powerpc")
+      if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
+        if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64")
+          # Check whether we are running under Rosetta on arm64 hardware.
+          execute_process(COMMAND sysctl -q hw.optional.arm64
+            OUTPUT_VARIABLE _sysctl_stdout
+            ERROR_VARIABLE _sysctl_stderr
+            RESULT_VARIABLE _sysctl_result
+            )
+          if(_sysctl_result EQUAL 0 AND _sysctl_stdout MATCHES "hw.optional.arm64: 1")
+            set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64")
+          endif()
+        elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "Power Macintosh")
+          # OS X ppc 'uname -m' may report 'Power Macintosh' instead of 'powerpc'
+          set(CMAKE_HOST_SYSTEM_PROCESSOR "powerpc")
+        endif()
       endif()
     elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "OpenBSD")
       exec_program(arch ARGS -s OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_PROCESSOR

+ 11 - 0
Modules/Platform/Darwin-Initialize.cmake

@@ -20,6 +20,17 @@ execute_process(COMMAND sw_vers -productVersion
 set(CMAKE_OSX_ARCHITECTURES "$ENV{CMAKE_OSX_ARCHITECTURES}" CACHE STRING
   "Build architectures for OSX")
 
+if(NOT CMAKE_CROSSCOMPILING AND
+   CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND
+   CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64" AND
+   CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
+  # When building on Apple Silicon (arm64), we need to explicitly specify
+  # the architecture to the toolchain since it will otherwise guess the
+  # architecture based on that of the build system tool.
+  # Set an *internal variable* to tell the generators to do this.
+  set(_CMAKE_APPLE_ARCHS_DEFAULT "arm64")
+endif()
+
 # macOS, iOS, tvOS, and watchOS should lookup compilers from
 # Platform/Apple-${CMAKE_CXX_COMPILER_ID}-<LANG>
 set(CMAKE_EFFECTIVE_SYSTEM_NAME "Apple")

+ 3 - 0
Source/cmGeneratorTarget.cxx

@@ -3190,6 +3190,9 @@ void cmGeneratorTarget::GetAppleArchs(const std::string& config,
   if (archs) {
     cmExpandList(*archs, archVec);
   }
+  if (archVec.empty()) {
+    this->Makefile->GetDefExpandList("_CMAKE_APPLE_ARCHS_DEFAULT", archVec);
+  }
 }
 
 void cmGeneratorTarget::AddCUDAArchitectureFlags(std::string& flags) const

+ 4 - 0
Source/cmGlobalXCodeGenerator.cxx

@@ -4022,6 +4022,10 @@ void cmGlobalXCodeGenerator::ComputeArchitectures(cmMakefile* mf)
     mf->GetDefExpandList("CMAKE_OSX_ARCHITECTURES", this->Architectures);
   }
 
+  if (this->Architectures.empty()) {
+    mf->GetDefExpandList("_CMAKE_APPLE_ARCHS_DEFAULT", this->Architectures);
+  }
+
   if (this->Architectures.empty()) {
     // With no ARCHS we use ONLY_ACTIVE_ARCH and possibly a
     // platform-specific default ARCHS placeholder value.

+ 6 - 1
Tests/Assembler/CMakeLists.txt

@@ -8,7 +8,7 @@ set(SRCS)
 # (at least) the following toolchains can process assembler files directly
 # and also generate assembler files from C:
 if("${CMAKE_GENERATOR}" MATCHES "Makefile|Xcode|Ninja" AND
-    NOT CMAKE_OSX_ARCHITECTURES)
+    NOT CMAKE_OSX_ARCHITECTURES MATCHES ";")
   if((CMAKE_C_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang|HP|SunPro|XL)$") OR (CMAKE_C_COMPILER_ID STREQUAL "Intel"  AND  UNIX)
      AND NOT (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND "x${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC"))
     set(C_FLAGS "${CMAKE_C_FLAGS}")
@@ -16,6 +16,11 @@ if("${CMAKE_GENERATOR}" MATCHES "Makefile|Xcode|Ninja" AND
     if(CMAKE_OSX_SYSROOT AND CMAKE_C_SYSROOT_FLAG AND NOT ";${C_FLAGS};" MATCHES ";${CMAKE_C_SYSROOT_FLAG};")
       list(APPEND C_FLAGS ${CMAKE_C_SYSROOT_FLAG} ${CMAKE_OSX_SYSROOT})
     endif()
+    if(CMAKE_OSX_ARCHITECTURES)
+      list(APPEND C_FLAGS -arch ${CMAKE_OSX_ARCHITECTURES})
+    elseif("${CMAKE_SYSTEM_NAME};${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "Darwin;arm64")
+      list(APPEND C_FLAGS -arch arm64)
+    endif()
     # Clang on OS X, and perhaps other compilers, do not support -g
     # for both generating and assembling, so drop it from generating.
     list(REMOVE_ITEM C_FLAGS -g)

+ 1 - 0
Tests/RunCMake/RunCMake.cmake

@@ -153,6 +153,7 @@ function(run_cmake test)
     "|contact PGI Sales at"
 
     "|[^\n]*xcodebuild[^\n]*warning: file type[^\n]*is based on missing file type"
+    "|[^\n]*objc[^\n]*: Class AMSupportURL[^\n]* One of the two will be used. Which one is undefined."
     "|[^\n]*is a member of multiple groups"
     "|[^\n]*offset in archive not a multiple of 8"
     "|[^\n]*from Time Machine by path"