Ver código fonte

Merge branch 'backport-3.28-visionOS' into visionOS

Brad King 1 ano atrás
pai
commit
871a4c5aac

+ 3 - 3
Modules/Platform/Apple-Clang.cmake

@@ -35,10 +35,10 @@ macro(__apple_compiler_clang lang)
     set(CMAKE_${lang}_OSX_DEPLOYMENT_TARGET_FLAG "-mtvos-version-min=")
   elseif(_CMAKE_OSX_SYSROOT_PATH MATCHES "/AppleTVSimulator")
     set(CMAKE_${lang}_OSX_DEPLOYMENT_TARGET_FLAG "-mtvos-simulator-version-min=")
-    elseif(_CMAKE_OSX_SYSROOT_PATH MATCHES "/XROS")
-    set(CMAKE_${lang}_OSX_DEPLOYMENT_TARGET_FLAG "-mtargetos=xros")
+  elseif(_CMAKE_OSX_SYSROOT_PATH MATCHES "/XROS")
+    set(CMAKE_${lang}_OSX_DEPLOYMENT_TARGET_FLAG "--target=<ARCH>-apple-xros<VERSION_MIN>")
   elseif(_CMAKE_OSX_SYSROOT_PATH MATCHES "/XRSimulator")
-    set(CMAKE_${lang}_OSX_DEPLOYMENT_TARGET_FLAG "-mtargetos=xros")
+    set(CMAKE_${lang}_OSX_DEPLOYMENT_TARGET_FLAG "--target=<ARCH>-apple-xros<VERSION_MIN>-simulator")
   elseif(_CMAKE_OSX_SYSROOT_PATH MATCHES "/WatchOS")
     set(CMAKE_${lang}_OSX_DEPLOYMENT_TARGET_FLAG "-mwatchos-version-min=")
   elseif(_CMAKE_OSX_SYSROOT_PATH MATCHES "/WatchSimulator")

+ 43 - 8
Source/cmLocalGenerator.cxx

@@ -2011,14 +2011,49 @@ void cmLocalGenerator::AddArchitectureFlags(std::string& flags,
 
     cmValue deploymentTarget =
       this->Makefile->GetDefinition("CMAKE_OSX_DEPLOYMENT_TARGET");
-    std::string deploymentTargetFlagVar =
-      "CMAKE_" + lang + "_OSX_DEPLOYMENT_TARGET_FLAG";
-    cmValue deploymentTargetFlag =
-      this->Makefile->GetDefinition(deploymentTargetFlagVar);
-    if (cmNonempty(deploymentTargetFlag) && cmNonempty(deploymentTarget)) {
-      flags += " ";
-      flags += *deploymentTargetFlag;
-      flags += *deploymentTarget;
+    if (cmNonempty(deploymentTarget)) {
+      std::string deploymentTargetFlagVar =
+        "CMAKE_" + lang + "_OSX_DEPLOYMENT_TARGET_FLAG";
+      cmValue deploymentTargetFlag =
+        this->Makefile->GetDefinition(deploymentTargetFlagVar);
+      if (cmNonempty(deploymentTargetFlag) &&
+          // CMAKE_<LANG>_COMPILER_TARGET overrides a --target= for
+          // CMAKE_OSX_DEPLOYMENT_TARGET, e.g., for visionOS.
+          (!cmHasLiteralPrefix(*deploymentTarget, "--target=") ||
+           this->Makefile
+             ->GetDefinition(cmStrCat("CMAKE_", lang, "_COMPILER_TARGET"))
+             .IsEmpty())) {
+        std::string flag = *deploymentTargetFlag;
+
+        // Add the deployment target architecture to the flag, if needed.
+        static const std::string kARCH = "<ARCH>";
+        std::string::size_type archPos = flag.find(kARCH);
+        if (archPos != std::string::npos) {
+          // This placeholder is meant for visionOS, so default to arm64
+          // unless only non-arm64 archs are given.
+          std::string const arch =
+            (archs.empty() || cm::contains(archs, "arm64")) ? "arm64"
+                                                            : archs[0];
+          // Replace the placeholder with its value.
+          flag = cmStrCat(flag.substr(0, archPos), arch,
+                          flag.substr(archPos + kARCH.size()));
+        }
+
+        // Add the deployment target version to the flag.
+        static const std::string kVERSION_MIN = "<VERSION_MIN>";
+        std::string::size_type verPos = flag.find(kVERSION_MIN);
+        if (verPos != std::string::npos) {
+          // Replace the placeholder with its value.
+          flag = cmStrCat(flag.substr(0, verPos), *deploymentTarget,
+                          flag.substr(verPos + kVERSION_MIN.size()));
+        } else {
+          // There is no placeholder, so append the value.
+          flag = cmStrCat(flag, *deploymentTarget);
+        }
+
+        flags += " ";
+        flags += flag;
+      }
     }
   }
 }

+ 15 - 20
Tests/RunCMake/XcFramework/RunCMakeTest.cmake

@@ -14,17 +14,15 @@ function(create_libraries type)
   create_library(${type} ios iOS "arm64" iphoneos)
   create_library(${type} tvos tvOS "arm64" appletvos)
   create_library(${type} watchos watchOS "armv7k\\\\;arm64_32" watchos)
-  #FIXME(#25266): Xcode 15.0 does not have visionOS.  Improve this condition.
-  #if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 15)
-  #  create_library(${type} visionos visionOS "arm64" xros)
-  #endif()
+  if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 15.2)
+    create_library(${type} visionos visionOS "arm64" xros)
+  endif()
   create_library(${type} ios-simulator iOS "${macos_archs_2}" iphonesimulator)
   create_library(${type} tvos-simulator tvOS "${macos_archs_2}" appletvsimulator)
   create_library(${type} watchos-simulator watchOS "${watch_sim_archs_2}" watchsimulator)
-  #FIXME(#25266): Xcode 15.0 does not have visionOS.  Improve this condition.
-  #if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 15)
-  #  create_library(${type} visionos-simulator visionOS "${macos_archs_2}" xrsimulator)
-  #endif()
+  if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 15.2)
+    create_library(${type} visionos-simulator visionOS "${macos_archs_2}" xrsimulator)
+  endif()
 endfunction()
 
 function(create_xcframework name type platforms)
@@ -62,24 +60,21 @@ function(create_executables name type)
   create_executable(${name}-ios ${type} iOS "arm64" iphoneos)
   create_executable(${name}-tvos ${type} tvOS "arm64" appletvos)
   create_executable(${name}-watchos ${type} watchOS "armv7k\\\\;arm64_32" watchos)
-  #FIXME(#25266): Xcode 15.0 does not have visionOS.  Improve this condition.
-  #if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 15)
-  #  create_executable(${name}-visionos ${type} visionOS "arm64" xros)
-  #endif()
+  if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 15.2)
+    create_executable(${name}-visionos ${type} visionOS "arm64" xros)
+  endif()
   create_executable(${name}-ios-simulator ${type} iOS "${macos_archs_2}" iphonesimulator)
   create_executable(${name}-tvos-simulator ${type} tvOS "${macos_archs_2}" appletvsimulator)
   create_executable(${name}-watchos-simulator ${type} watchOS "${watch_sim_archs_2}" watchsimulator)
-  #FIXME(#25266): Xcode 15.0 does not have visionOS.  Improve this condition.
-  #if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 15)
-  #  create_executable(${name}-visionos-simulator ${type} visionOS "${macos_archs_2}" xrsimulator)
-  #endif()
+  if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 15.2)
+    create_executable(${name}-visionos-simulator ${type} visionOS "${macos_archs_2}" xrsimulator)
+  endif()
 endfunction()
 
 set(xcframework_platforms macos ios tvos watchos ios-simulator tvos-simulator watchos-simulator)
-#FIXME(#25266): Xcode 15.0 does not have visionOS.  Improve this condition.
-#if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 15)
-#  list(APPEND xcframework_platforms visionos visionos-simulator)
-#endif()
+if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 15.2)
+  list(APPEND xcframework_platforms visionos visionos-simulator)
+endif()
 if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 12)
   set(macos_archs_1 "x86_64\\;arm64")
   set(macos_archs_2 "x86_64\\\\;arm64")

+ 2 - 2
Tests/RunCMake/XcodeProject-Device/DeploymentTarget.c

@@ -5,8 +5,8 @@
 #  if __MAC_OS_X_VERSION_MIN_REQUIRED != __MAC_10_11
 #    error macOS deployment version mismatch
 #  endif
-#elif TARGET_OS_XR
-#  if __XR_OS_VERSION_MIN_REQUIRED != __XROS_1_0
+#elif TARGET_OS_VISION
+#  if __VISION_OS_VERSION_MIN_REQUIRED != __VISIONOS_1_0
 #    error visionOS deployment version mismatch
 #  endif
 #elif TARGET_OS_IOS

+ 22 - 24
Tests/RunCMake/XcodeProject-Device/RunCMakeTest.cmake

@@ -93,25 +93,24 @@ if(NOT XCODE_VERSION VERSION_LESS 7.1)
   unset(RunCMake_TEST_OPTIONS)
 endif()
 
-#FIXME(#25266): Xcode 15.0 does not have visionOS.  Improve this condition.
-#if(NOT XCODE_VERSION VERSION_LESS 15)
-#  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/XcodeBundlesVisionOS-build)
-#  set(RunCMake_TEST_NO_CLEAN 1)
-#  set(RunCMake_TEST_OPTIONS
-#    "-DCMAKE_SYSTEM_NAME=visionOS"
-#    "-DCMAKE_INSTALL_PREFIX:PATH=${RunCMake_TEST_BINARY_DIR}/_install")
-#
-#  file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
-#  file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
-#
-#  run_cmake(XcodeBundles)
-#  run_cmake_command(XcodeBundles-build-visionOS ${CMAKE_COMMAND} --build .)
-#  run_cmake_command(XcodeBundles-install-visionOS ${CMAKE_COMMAND} --build . --target install)
-#
-#  unset(RunCMake_TEST_BINARY_DIR)
-#  unset(RunCMake_TEST_NO_CLEAN)
-#  unset(RunCMake_TEST_OPTIONS)
-#endif()
+if(NOT XCODE_VERSION VERSION_LESS 15.2)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/XcodeBundlesVisionOS-build)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  set(RunCMake_TEST_OPTIONS
+    "-DCMAKE_SYSTEM_NAME=visionOS"
+    "-DCMAKE_INSTALL_PREFIX:PATH=${RunCMake_TEST_BINARY_DIR}/_install")
+
+  file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+  file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+
+  run_cmake(XcodeBundles)
+  run_cmake_command(XcodeBundles-build-visionOS ${CMAKE_COMMAND} --build .)
+  run_cmake_command(XcodeBundles-install-visionOS ${CMAKE_COMMAND} --build . --target install)
+
+  unset(RunCMake_TEST_BINARY_DIR)
+  unset(RunCMake_TEST_NO_CLEAN)
+  unset(RunCMake_TEST_OPTIONS)
+endif()
 
 if(NOT XCODE_VERSION VERSION_LESS 7)
   set(RunCMake_TEST_OPTIONS "-DCMAKE_TOOLCHAIN_FILE=${RunCMake_SOURCE_DIR}/osx.cmake")
@@ -262,11 +261,10 @@ if(XCODE_VERSION VERSION_GREATER_EQUAL 8)
   deployment_target_test(tvOS appletvsimulator)
   deployment_target_test(watchOS watchos)
   deployment_target_test(watchOS watchsimulator)
-  #FIXME(#25266): Xcode 15.0 does not have visionOS.  Improve this condition.
-  #if(XCODE_VERSION VERSION_GREATER_EQUAL 15)
-  #  deployment_target_test(visionOS xros)
-  #  deployment_target_test(visionOS xrsimulator)
-  #endif()
+  if(XCODE_VERSION VERSION_GREATER_EQUAL 15.2)
+    deployment_target_test(visionOS xros)
+    deployment_target_test(visionOS xrsimulator)
+  endif()
 endif()
 
 if(XCODE_VERSION VERSION_GREATER_EQUAL 8)