From af1f6987571b6f8298b03e184aa4aad23882d5c8 Mon Sep 17 00:00:00 2001
From: Stephen Kelly <steveire@gmail.com>
Date: Thu, 10 Oct 2013 11:46:06 +0200
Subject: CMP0024: Store the fact of included export in global generator.

Storing it in the makefile means that the policy does not trigger
when include and export are in differing directories.
---
 Source/cmExportCommand.cxx                     |  4 +++-
 Source/cmGlobalGenerator.h                     | 13 +++++++++++++
 Source/cmIncludeCommand.cxx                    |  4 +++-
 Source/cmMakefile.h                            | 13 -------------
 Tests/RunCMake/include/CMP0024-NEW-stderr.txt  |  7 ++-----
 Tests/RunCMake/include/CMP0024-NEW.cmake       |  4 ++--
 Tests/RunCMake/include/CMP0024-WARN-stderr.txt |  6 ++----
 Tests/RunCMake/include/CMP0024-WARN.cmake      |  4 ++--
 Tests/RunCMake/include/subdir1/CMakeLists.txt  |  2 ++
 Tests/RunCMake/include/subdir2/CMakeLists.txt  |  2 ++
 10 files changed, 31 insertions(+), 28 deletions(-)
 create mode 100644 Tests/RunCMake/include/subdir1/CMakeLists.txt
 create mode 100644 Tests/RunCMake/include/subdir2/CMakeLists.txt

diff --git a/Source/cmExportCommand.cxx b/Source/cmExportCommand.cxx
index 422b038..f335b8b 100644
--- a/Source/cmExportCommand.cxx
+++ b/Source/cmExportCommand.cxx
@@ -172,7 +172,9 @@ bool cmExportCommand
   ebfg.SetCommand(this);
   ebfg.SetExportOld(this->ExportOld.IsEnabled());
 
-  this->Makefile->AddExportedTargetsFile(fname);
+  cmGlobalGenerator *gg = this->Makefile->GetLocalGenerator()
+                                        ->GetGlobalGenerator();
+  gg->AddExportedTargetsFile(fname);
 
   // Compute the set of configurations exported.
   std::vector<std::string> configurationTypes;
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 70f6e32..b8860f1 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -293,6 +293,18 @@ public:
 
   void ProcessEvaluationFiles();
 
+  void AddExportedTargetsFile(const std::string &filename)
+  {
+    this->ExportedTargetsFiles.insert(filename);
+  }
+
+  bool IsExportedTargetsFile(const std::string &filename) const
+  {
+    const std::set<std::string>::const_iterator it
+                                  = this->ExportedTargetsFiles.find(filename);
+    return it != this->ExportedTargetsFiles.end();
+  }
+
 protected:
   typedef std::vector<cmLocalGenerator*> GeneratorVector;
   // for a project collect all its targets by following depend
@@ -372,6 +384,7 @@ private:
   std::map<cmStdString, cmStdString> ExtensionToLanguage;
   std::map<cmStdString, int> LanguageToLinkerPreference;
   std::map<cmStdString, cmStdString> LanguageToOriginalSharedLibFlags;
+  std::set<std::string> ExportedTargetsFiles;
 
   // Record hashes for rules and outputs.
   struct RuleHash { char Data[32]; };
diff --git a/Source/cmIncludeCommand.cxx b/Source/cmIncludeCommand.cxx
index a3d8b83..39d4993 100644
--- a/Source/cmIncludeCommand.cxx
+++ b/Source/cmIncludeCommand.cxx
@@ -93,7 +93,9 @@ bool cmIncludeCommand
       cmSystemTools::CollapseFullPath(fname.c_str(),
                                       this->Makefile->GetStartDirectory());
 
-  if (this->Makefile->IsExportedTargetsFile(fname_abs))
+  cmGlobalGenerator *gg = this->Makefile->GetLocalGenerator()
+                                        ->GetGlobalGenerator();
+  if (gg->IsExportedTargetsFile(fname_abs))
     {
     const char *modal = 0;
     cmake::MessageType messageType = cmake::AUTHOR_WARNING;
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index 362b066..ca82336 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -489,18 +489,6 @@ public:
       return this->cmCurrentListFile.c_str();
     }
 
-  void AddExportedTargetsFile(const std::string &filename)
-  {
-    this->ExportedTargetsFiles.insert(filename);
-  }
-
-  bool IsExportedTargetsFile(const std::string &filename) const
-  {
-    const std::set<std::string>::const_iterator it
-                                  = this->ExportedTargetsFiles.find(filename);
-    return it != this->ExportedTargetsFiles.end();
-  }
-
   //@}
 
   /**
@@ -1053,7 +1041,6 @@ private:
   void EnforceDirectoryLevelRules();
 
   bool GeneratingBuildSystem;
-  std::set<std::string> ExportedTargetsFiles;
   /**
    * Old version of GetSourceFileWithOutput(const char*) kept for
    * backward-compatibility. It implements a linear search and support
diff --git a/Tests/RunCMake/include/CMP0024-NEW-stderr.txt b/Tests/RunCMake/include/CMP0024-NEW-stderr.txt
index 182c67a..059d7e4 100644
--- a/Tests/RunCMake/include/CMP0024-NEW-stderr.txt
+++ b/Tests/RunCMake/include/CMP0024-NEW-stderr.txt
@@ -1,15 +1,12 @@
-CMake Error at CMP0024-NEW.cmake:9 \(include\):
+CMake Error at subdir2/CMakeLists.txt:2 \(include\):
   Policy CMP0024 is not set: Disallow include export result.  Run "cmake
   --help-policy CMP0024" for policy details.  Use the cmake_policy command to
   set the policy and suppress this warning.
 
   The file
 
-    .*/Tests/RunCMake/include/CMP0024-NEW-build/theTargets.cmake
+    .*/Tests/RunCMake/include/CMP0024-NEW-build/subdir1/theTargets.cmake
 
   was generated by the export\(\) command.  It may not be used as the argument
   to the include\(\) command.  Use ALIAS targets instead to refer to targets by
   alternative names.
-
-Call Stack \(most recent call first\):
-  CMakeLists.txt:3 \(include\)
diff --git a/Tests/RunCMake/include/CMP0024-NEW.cmake b/Tests/RunCMake/include/CMP0024-NEW.cmake
index 0685d6c..0e03d2a 100644
--- a/Tests/RunCMake/include/CMP0024-NEW.cmake
+++ b/Tests/RunCMake/include/CMP0024-NEW.cmake
@@ -5,5 +5,5 @@ cmake_policy(SET CMP0024 NEW)
 
 add_library(foo SHARED empty.cpp)
 
-export(TARGETS foo FILE "${CMAKE_CURRENT_BINARY_DIR}/theTargets.cmake")
-include("${CMAKE_CURRENT_BINARY_DIR}/theTargets.cmake")
+add_subdirectory(subdir1)
+add_subdirectory(subdir2)
diff --git a/Tests/RunCMake/include/CMP0024-WARN-stderr.txt b/Tests/RunCMake/include/CMP0024-WARN-stderr.txt
index 2b36f17..9c79007 100644
--- a/Tests/RunCMake/include/CMP0024-WARN-stderr.txt
+++ b/Tests/RunCMake/include/CMP0024-WARN-stderr.txt
@@ -1,16 +1,14 @@
-CMake Warning \(dev\) at CMP0024-WARN.cmake:7 \(include\):
+CMake Warning \(dev\) at subdir2/CMakeLists.txt:2 \(include\):
   Policy CMP0024 is not set: Disallow include export result.  Run "cmake
   --help-policy CMP0024" for policy details.  Use the cmake_policy command to
   set the policy and suppress this warning.
 
   The file
 
-    .*/Tests/RunCMake/include/CMP0024-WARN-build/theTargets.cmake
+    .*/Tests/RunCMake/include/CMP0024-WARN-build/subdir1/theTargets.cmake
 
   was generated by the export\(\) command.  It should not be used as the
   argument to the include\(\) command.  Use ALIAS targets instead to refer to
   targets by alternative names.
 
-Call Stack \(most recent call first\):
-  CMakeLists.txt:3 \(include\)
 This warning is for project developers.  Use -Wno-dev to suppress it.
diff --git a/Tests/RunCMake/include/CMP0024-WARN.cmake b/Tests/RunCMake/include/CMP0024-WARN.cmake
index 583c7d4..783cf78 100644
--- a/Tests/RunCMake/include/CMP0024-WARN.cmake
+++ b/Tests/RunCMake/include/CMP0024-WARN.cmake
@@ -3,5 +3,5 @@ enable_language(CXX)
 
 add_library(foo SHARED empty.cpp)
 
-export(TARGETS foo FILE "${CMAKE_CURRENT_BINARY_DIR}/theTargets.cmake")
-include("${CMAKE_CURRENT_BINARY_DIR}/theTargets.cmake")
+add_subdirectory(subdir1)
+add_subdirectory(subdir2)
diff --git a/Tests/RunCMake/include/subdir1/CMakeLists.txt b/Tests/RunCMake/include/subdir1/CMakeLists.txt
new file mode 100644
index 0000000..11a76d1
--- /dev/null
+++ b/Tests/RunCMake/include/subdir1/CMakeLists.txt
@@ -0,0 +1,2 @@
+
+export(TARGETS foo FILE "${CMAKE_CURRENT_BINARY_DIR}/theTargets.cmake")
diff --git a/Tests/RunCMake/include/subdir2/CMakeLists.txt b/Tests/RunCMake/include/subdir2/CMakeLists.txt
new file mode 100644
index 0000000..7361f9c
--- /dev/null
+++ b/Tests/RunCMake/include/subdir2/CMakeLists.txt
@@ -0,0 +1,2 @@
+
+include("${CMAKE_CURRENT_BINARY_DIR}/../subdir1/theTargets.cmake")
-- 
cgit v0.12