[cmake-developers] [CMake 0015669]: XCTest for iOS target has incorrect TEST_HOST

Gregor Jasny gjasny at googlemail.com
Thu Jul 30 07:38:55 EDT 2015


Hello,

On 29/07/15 14:07, Mantis Bug Tracker wrote:
> ======================================================================
> http://www.cmake.org/Bug/view.php?id=15669
> ======================================================================

this bug caused by different App Bundle layout in MacOSX and iOS. 
Attached you'll find my proposed patch.

Do you have a better idea to detect the usage of iphone/simulator SDK?
Maybe we should handle this in the platform Darwin modules?

Thanks,
Gregor
-------------- next part --------------
>From fdbef203172af5d5603de9383077fbb503661f3f Mon Sep 17 00:00:00 2001
From: Gregor Jasny <gjasny at googlemail.com>
Date: Thu, 30 Jul 2015 13:26:10 +0200
Subject: [PATCH] Fix iOS App Bundle layout

In contrast to Mac OS X App bundle layout the iOS one lacks the
Contents/MacOSX structure. See also the Bundle Structures
documentation in Mac Developer Library:

https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html
---
 Source/cmTarget.cxx | 26 +++++++++++++++++++++++---
 Source/cmTarget.h   |  3 +++
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index cf33791..c39f9c0 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -632,6 +632,22 @@ bool cmTarget::IsBundleOnApple() const
 }
 
 //----------------------------------------------------------------------------
+bool cmTarget::IsIosSdkOnApple() const
+{
+  if (!this->IsApple)
+    {
+    return false;
+    }
+
+  std::string sdkRoot;
+  sdkRoot = this->GetMakefile()->GetSafeDefinition("CMAKE_OSX_SYSROOT");
+  sdkRoot = cmSystemTools::LowerCase(sdkRoot);
+
+  return sdkRoot.find("iphoneos") == 0 ||
+         sdkRoot.find("/iphoneos") != std::string::npos;
+}
+
+//----------------------------------------------------------------------------
 static bool processSources(cmTarget const* tgt,
       const std::vector<cmTargetInternals::TargetPropertyEntry*> &entries,
       std::vector<std::string> &srcs,
@@ -6707,9 +6723,13 @@ std::string cmTarget::GetAppBundleDirectory(const std::string& config,
                                             bool contentOnly) const
 {
   std::string fpath = this->GetFullName(config, false);
-  fpath += ".app/Contents";
-  if(!contentOnly)
-    fpath += "/MacOS";
+  fpath += ".app";
+  if(!this->IsIosSdkOnApple())
+    {
+    fpath += "/Contents";
+    if(!contentOnly)
+      fpath += "/MacOS";
+    }
   return fpath;
 }
 
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index f567d50..d383219 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -524,6 +524,9 @@ public:
       or CFBundle on Apple.  */
   bool IsBundleOnApple() const;
 
+  /** Return whether this target uses iOS SDK on Apple */
+  bool IsIosSdkOnApple() const;
+
   /** Return the framework version string.  Undefined if
       IsFrameworkOnApple returns false.  */
   std::string GetFrameworkVersion() const;
-- 
2.4.3



More information about the cmake-developers mailing list