From a91eebebdb2a012c233db7869ec0ade534c4dd57 Mon Sep 17 00:00:00 2001
From: Gregor Jasny <gjasny@googlemail.com>
Date: Fri, 23 Oct 2015 22:19:43 +0200
Subject: Xcode: Recognise Watch and TV OS as embedded platforms

---
 Source/cmMakefile.cxx                          | 21 +++++++++++++----
 Tests/RunCMake/XcodeProject/RunCMakeTest.cmake | 32 ++++++++++++++++++++++++++
 Tests/RunCMake/XcodeProject/XcodeBundles.cmake | 30 +++++++++++++++++++-----
 3 files changed, 73 insertions(+), 10 deletions(-)

diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index a1f143a..148b4a8 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -2407,10 +2407,23 @@ bool cmMakefile::PlatformIsAppleIos() const
   sdkRoot = this->GetSafeDefinition("CMAKE_OSX_SYSROOT");
   sdkRoot = cmSystemTools::LowerCase(sdkRoot);
 
-  return sdkRoot.find("iphoneos") == 0 ||
-         sdkRoot.find("/iphoneos") != std::string::npos ||
-         sdkRoot.find("iphonesimulator") == 0 ||
-         sdkRoot.find("/iphonesimulator") != std::string::npos;
+  const std::string embedded[] =
+    {
+    "appletvos", "appletvsimulator",
+    "iphoneos", "iphonesimulator",
+    "watchos", "watchsimulator",
+    };
+
+  for(size_t i = 0; i < sizeof(embedded) / sizeof(embedded[0]); ++i)
+    {
+    if(sdkRoot.find(embedded[i]) == 0 ||
+       sdkRoot.find(std::string("/") + embedded[i]) != std::string::npos)
+      {
+      return true;
+      }
+    }
+
+   return false;
 }
 
 const char* cmMakefile::GetSONameFlag(const std::string& language) const
diff --git a/Tests/RunCMake/XcodeProject/RunCMakeTest.cmake b/Tests/RunCMake/XcodeProject/RunCMakeTest.cmake
index 8ab618b..3b7b9f4 100644
--- a/Tests/RunCMake/XcodeProject/RunCMakeTest.cmake
+++ b/Tests/RunCMake/XcodeProject/RunCMakeTest.cmake
@@ -55,6 +55,38 @@ if(NOT XCODE_VERSION VERSION_LESS 5)
 endif()
 
 if(NOT XCODE_VERSION VERSION_LESS 7)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/XcodeBundlesWatchOS-build)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  set(RunCMake_TEST_OPTIONS "-DTEST_WATCHOS=ON")
+
+  file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+  file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+
+  run_cmake(XcodeBundles)
+  run_cmake_command(XcodeBundles-build ${CMAKE_COMMAND} --build .)
+
+  unset(RunCMake_TEST_BINARY_DIR)
+  unset(RunCMake_TEST_NO_CLEAN)
+  unset(RunCMake_TEST_OPTIONS)
+endif()
+
+if(NOT XCODE_VERSION VERSION_LESS 7.1)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/XcodeBundlesTvOS-build)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  set(RunCMake_TEST_OPTIONS "-DTEST_TVOS=ON")
+
+  file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+  file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+
+  run_cmake(XcodeBundles)
+  run_cmake_command(XcodeBundles-build ${CMAKE_COMMAND} --build .)
+
+  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")
   run_cmake(XcodeTbdStub)
   unset(RunCMake_TEST_OPTIONS)
diff --git a/Tests/RunCMake/XcodeProject/XcodeBundles.cmake b/Tests/RunCMake/XcodeProject/XcodeBundles.cmake
index 2cbccfa..0fdc6af 100644
--- a/Tests/RunCMake/XcodeProject/XcodeBundles.cmake
+++ b/Tests/RunCMake/XcodeProject/XcodeBundles.cmake
@@ -10,6 +10,22 @@ if(TEST_IOS)
   set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "NO")
 endif(TEST_IOS)
 
+if(TEST_WATCHOS)
+  set(CMAKE_OSX_SYSROOT watchos)
+  set(CMAKE_OSX_ARCHITECTURES "armv7k")
+  set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO")
+  set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "")
+  set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "YES")
+endif()
+
+if(TEST_TVOS)
+  set(CMAKE_OSX_SYSROOT appletvos)
+  set(CMAKE_OSX_ARCHITECTURES "arm64")
+  set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO")
+  set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "")
+  set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "YES")
+endif()
+
 # App Bundle
 
 add_executable(AppBundle MACOSX_BUNDLE main.m)
@@ -35,11 +51,13 @@ endif()
 
 # Bundle
 
-add_library(Bundle MODULE main.c)
-set_target_properties(Bundle PROPERTIES BUNDLE TRUE)
+if(NOT CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE)
+  add_library(Bundle MODULE main.c)
+  set_target_properties(Bundle PROPERTIES BUNDLE TRUE)
 
-add_custom_target(BundleTest ALL
-  COMMAND ${CMAKE_COMMAND} -E copy
-    "$<TARGET_FILE:Bundle>" "$<TARGET_FILE:Bundle>.old")
+  add_custom_target(BundleTest ALL
+    COMMAND ${CMAKE_COMMAND} -E copy
+      "$<TARGET_FILE:Bundle>" "$<TARGET_FILE:Bundle>.old")
 
-add_dependencies(BundleTest Bundle)
+  add_dependencies(BundleTest Bundle)
+endif()
-- 
cgit v0.12