Merge topic 'apple-arch-sysroots' into release-3.17

84a1e67380 Apple: Fix mapping CMAKE_APPLE_ARCH_SYSROOTS to custom OSX_ARCHITECTURES
45fa9b32ca Apple: Improve handling of missing SDKs in CMAKE_APPLE_ARCH_SYSROOTS

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !4583
diff --git a/Modules/Platform/Darwin-Initialize.cmake b/Modules/Platform/Darwin-Initialize.cmake
index 729217c..80e668e 100644
--- a/Modules/Platform/Darwin-Initialize.cmake
+++ b/Modules/Platform/Darwin-Initialize.cmake
@@ -136,7 +136,7 @@
 # Handle multi-arch sysroots. Do this before CMAKE_OSX_SYSROOT is
 # transformed into a path, so that we know the sysroot name.
 function(_apple_resolve_multi_arch_sysroots)
-  if(CMAKE_APPLE_ARCH_SYSROOTS)
+  if(DEFINED CMAKE_APPLE_ARCH_SYSROOTS)
     return() # Already cached
   endif()
 
@@ -202,7 +202,7 @@
       list(APPEND _arch_sysroots ${_arch_sysroot})
     else()
       message(WARNING "No SDK found for architecture '${arch}'")
-      list(APPEND _arch_sysroots "") # Placeholder
+      list(APPEND _arch_sysroots "${arch}-SDK-NOTFOUND")
     endif()
   endforeach()
 
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index 00ad62e..2c923dd 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -131,6 +131,28 @@
     this->LinkerSysroot = this->Makefile->GetSafeDefinition("CMAKE_SYSROOT");
   }
 
+  if (std::string const* appleArchSysroots =
+        this->Makefile->GetDef("CMAKE_APPLE_ARCH_SYSROOTS")) {
+    std::string const& appleArchs =
+      this->Makefile->GetSafeDefinition("CMAKE_OSX_ARCHITECTURES");
+    std::vector<std::string> archs;
+    std::vector<std::string> sysroots;
+    cmExpandList(appleArchs, archs);
+    cmExpandList(*appleArchSysroots, sysroots, true);
+    if (archs.size() == sysroots.size()) {
+      for (size_t i = 0; i < archs.size(); ++i) {
+        this->AppleArchSysroots[archs[i]] = sysroots[i];
+      }
+    } else {
+      std::string const e =
+        cmStrCat("CMAKE_APPLE_ARCH_SYSROOTS:\n  ", *appleArchSysroots,
+                 "\n"
+                 "is not the same length as CMAKE_OSX_ARCHITECTURES:\n  ",
+                 appleArchs);
+      this->IssueMessage(MessageType::FATAL_ERROR, e);
+    }
+  }
+
   for (std::string const& lang : enabledLanguages) {
     if (lang == "NONE") {
       continue;
@@ -1792,20 +1814,15 @@
       std::string("CMAKE_") + lang + "_SYSROOT_FLAG";
     const char* sysrootFlag = this->Makefile->GetDefinition(sysrootFlagVar);
     if (sysrootFlag && *sysrootFlag) {
-      std::vector<std::string> arch_sysroots;
-      if (const char* arch_sysroots_str =
-            this->Makefile->GetDefinition("CMAKE_APPLE_ARCH_SYSROOTS")) {
-        cmExpandList(std::string(arch_sysroots_str), arch_sysroots, true);
-      }
-      if (!arch_sysroots.empty()) {
-        assert(arch_sysroots.size() == archs.size());
-        for (size_t i = 0; i < archs.size(); ++i) {
-          if (arch_sysroots[i].empty()) {
+      if (!this->AppleArchSysroots.empty()) {
+        for (std::string const& arch : archs) {
+          std::string const& archSysroot = this->AppleArchSysroots[arch];
+          if (cmIsOff(archSysroot)) {
             continue;
           }
-          flags += " -Xarch_" + archs[i] + " ";
+          flags += " -Xarch_" + arch + " ";
           // Combine sysroot flag and path to work with -Xarch
-          std::string arch_sysroot = sysrootFlag + arch_sysroots[i];
+          std::string arch_sysroot = sysrootFlag + archSysroot;
           flags += this->ConvertToOutputFormat(arch_sysroot, SHELL);
         }
       } else if (sysroot && *sysroot) {
diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h
index 88194b7..5377be9 100644
--- a/Source/cmLocalGenerator.h
+++ b/Source/cmLocalGenerator.h
@@ -513,6 +513,7 @@
   std::map<std::string, std::string> VariableMappings;
   std::string CompilerSysroot;
   std::string LinkerSysroot;
+  std::unordered_map<std::string, std::string> AppleArchSysroots;
 
   bool EmitUniversalBinaryFlags;