From d4fdbeed6442d4df507d5fe4045435afc698fc96 Mon Sep 17 00:00:00 2001
From: Bill Hoffman <bill.hoffman@kitware.com>
Date: Mon, 28 Apr 2008 13:53:14 -0400
Subject: ENH: allow users to set sysroot

---
 Modules/Platform/Darwin.cmake     |  1 +
 Source/cmGlobalXCodeGenerator.cxx | 23 ++++++++++++++++++++++-
 Source/cmLocalGenerator.cxx       | 12 +++++++++++-
 3 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/Modules/Platform/Darwin.cmake b/Modules/Platform/Darwin.cmake
index dfdc8eb..ecc465c 100644
--- a/Modules/Platform/Darwin.cmake
+++ b/Modules/Platform/Darwin.cmake
@@ -57,6 +57,7 @@ IF(_CMAKE_OSX_SDKS)
   LIST(SORT _CMAKE_OSX_SDKS)
   LIST(REVERSE _CMAKE_OSX_SDKS)
   LIST(GET _CMAKE_OSX_SDKS 0 _CMAKE_OSX_SDKS)
+  SET(CMAKE_OSX_SYSROOT_DEFAULT "${_CMAKE_OSX_SDKS}")
   # use the environment variable CMAKE_OSX_SYSROOT if it is set
   IF(NOT "$ENV{CMAKE_OSX_SYSROOT}" STREQUAL "") 
     SET(_CMAKE_OSX_SDKS "$ENV{CMAKE_OSX_SYSROOT}")
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx
index 33820aa..3e31a42 100644
--- a/Source/cmGlobalXCodeGenerator.cxx
+++ b/Source/cmGlobalXCodeGenerator.cxx
@@ -2451,14 +2451,29 @@ void cmGlobalXCodeGenerator
       this->CurrentMakefile->GetDefinition("CMAKE_OSX_ARCHITECTURES");
   const char* sysroot = 
       this->CurrentMakefile->GetDefinition("CMAKE_OSX_SYSROOT");
+  const char* sysrootDefault = 
+    this->CurrentMakefile->GetDefinition("CMAKE_OSX_SYSROOT_DEFAULT");
   if(osxArch && sysroot)
     {
+    bool flagsUsed = false;
     // recompute this as it may have been changed since enable language
     this->Architectures.clear();
     cmSystemTools::ExpandListArgument(std::string(osxArch),
                                       this->Architectures);
-    if(this->Architectures.size() > 1)
+    bool addArchFlag = true;
+    if(this->Architectures.size() == 1)
       {
+      const char* archOrig = 
+        this->
+        CurrentMakefile->GetSafeDefinition("CMAKE_OSX_ARCHITECTURES_DEFAULT");
+      if(this->Architectures[0] == archOrig)
+        {
+        addArchFlag = false;
+        }
+      }
+    if(addArchFlag)
+      {
+      flagsUsed = true;
       buildSettings->AddAttribute("SDKROOT", 
                                   this->CreateString(sysroot));
       std::string archString;
@@ -2472,6 +2487,12 @@ void cmGlobalXCodeGenerator
       buildSettings->AddAttribute("ARCHS", 
                                   this->CreateString(archString.c_str()));
       }
+    if(!flagsUsed && sysrootDefault &&
+       strcmp(sysroot, sysrootDefault) != 0)
+      {
+      buildSettings->AddAttribute("SDKROOT", 
+                                  this->CreateString(sysroot));
+      }
     }
   for( std::vector<cmXCodeObject*>::iterator i = configs.begin();
        i != configs.end(); ++i)
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index d806978..0a03028 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -1627,6 +1627,9 @@ void cmLocalGenerator::AddLanguageFlags(std::string& flags,
       this->Makefile->GetDefinition("CMAKE_OSX_ARCHITECTURES");
     const char* sysroot = 
       this->Makefile->GetDefinition("CMAKE_OSX_SYSROOT");
+    const char* sysrootDefault = 
+      this->Makefile->GetDefinition("CMAKE_OSX_SYSROOT_DEFAULT");
+    bool flagsUsed = false;
     if(osxArch && sysroot  && lang && lang[0] =='C')
       { 
       std::vector<std::string> archs;
@@ -1656,10 +1659,17 @@ void cmLocalGenerator::AddLanguageFlags(std::string& flags,
           }
         flags += " -isysroot ";
         flags += sysroot;
+        flagsUsed = true;
         }
       }
+    if(!flagsUsed && sysroot && sysrootDefault &&
+       strcmp(sysroot, sysrootDefault) != 0)
+      {
+      flags += " -isysroot ";
+      flags += sysroot;
+      }
+    this->AddConfigVariableFlags(flags, flagsVar.c_str(), config);
     }
-  this->AddConfigVariableFlags(flags, flagsVar.c_str(), config);
 }
 
 //----------------------------------------------------------------------------
-- 
cgit v0.12