[cmake-commits] alex committed cmGlobalGenerator.cxx 1.204 1.205 cmGlobalGenerator.h 1.93 1.94 cmInstallCommand.cxx 1.30 1.31 cmInstallCommand.h 1.20 1.21 cmInstallExportGenerator.cxx 1.5 1.6 cmInstallExportGenerator.h 1.3 1.4

cmake-commits at cmake.org cmake-commits at cmake.org
Mon Aug 27 16:04:59 EDT 2007


Update of /cvsroot/CMake/CMake/Source
In directory public:/mounts/ram/cvs-serv6763

Modified Files:
	cmGlobalGenerator.cxx cmGlobalGenerator.h cmInstallCommand.cxx 
	cmInstallCommand.h cmInstallExportGenerator.cxx 
	cmInstallExportGenerator.h 
Log Message:

ENH: add install files generators for targets which have PUBLIC_HEADER,
PRIVATE_HEADER or RESOURCE_FILES property, use the destination for the
public headers as include directory property for exported libraries

Alex


Index: cmInstallExportGenerator.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmInstallExportGenerator.cxx,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- cmInstallExportGenerator.cxx	22 Aug 2007 15:32:48 -0000	1.5
+++ cmInstallExportGenerator.cxx	27 Aug 2007 20:04:57 -0000	1.6
@@ -22,6 +22,7 @@
 #include "cmTarget.h"
 
 #include "cmInstallExportGenerator.h"
+#include "cmInstallFilesGenerator.h"
 
 cmInstallExportGenerator::cmInstallExportGenerator(
   const char* destination,
@@ -60,7 +61,7 @@
     std::string propertyName = prefix;
     propertyName += "LOCATION";
     // check that this property doesn't exist yet and add it then
-    if (twp->Properties.find(propertyName.c_str())== twp->Properties.end())
+    if (twp->Properties.find(propertyName.c_str()) == twp->Properties.end())
       {
       std::string destinationFilename = generator->GetDestination();
       destinationFilename += "/";
@@ -83,7 +84,7 @@
       propertyName += prefix;
       propertyName += "LOCATION";
       // check that this property doesn't exist yet and add it then
-      if (twp->Properties.find(propertyName.c_str())== twp->Properties.end())
+      if (twp->Properties.find(propertyName.c_str()) == twp->Properties.end())
         {
         std::string destinationFilename = generator->GetDestination();
         destinationFilename += "/";
@@ -100,6 +101,31 @@
 }
 
 
+bool cmInstallExportGenerator::AddInstallLocations(cmTargetWithProperties* twp,
+                                           cmInstallFilesGenerator* generator,
+                                           const char* propertyName)
+{
+  if (generator == 0) // nothing to do
+    {
+    return true;
+    }
+
+  if ((propertyName == 0) || (*propertyName == '\0'))
+    {
+    return false;
+    }
+
+  // check that this property doesn't exist yet and add it then
+  if (twp->Properties.find(propertyName) == twp->Properties.end())
+    {
+    twp->Properties[propertyName] = generator->GetDestination();
+    return true;
+    }
+
+  return false;
+}
+
+
 bool cmInstallExportGenerator::SetExportSet(const char* name,
                                        const std::vector<cmTargetExport*>* set)
 {
@@ -152,6 +178,11 @@
       {
       return false;
       }
+    if (this->AddInstallLocations(targetWithProps, (*it)->HeaderGenerator, 
+                                  "PUBLIC_HEADER_LOCATION") == false)
+      {
+      return false;
+      }
     }
 
   return true;

Index: cmGlobalGenerator.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmGlobalGenerator.h,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -d -r1.93 -r1.94
--- cmGlobalGenerator.h	22 Aug 2007 15:32:48 -0000	1.93
+++ cmGlobalGenerator.h	27 Aug 2007 20:04:57 -0000	1.94
@@ -29,6 +29,7 @@
 class cmTarget;
 class cmTargetExport;
 class cmInstallTargetGenerator;
+class cmInstallFilesGenerator;
 
 /** \class cmGlobalGenerator
  * \brief Responable for overseeing the generation process for the entire tree
@@ -144,7 +145,8 @@
                           cmInstallTargetGenerator* runTime,
                           cmInstallTargetGenerator* library,
                           cmInstallTargetGenerator* framework,
-                          cmInstallTargetGenerator* bundle);
+                          cmInstallTargetGenerator* bundle,
+                          cmInstallFilesGenerator* publicHeaders);
   ///! Get the export target set with the   given name
   const std::vector<cmTargetExport*>* GetExportSet(const char* name) const;
 

Index: cmGlobalGenerator.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmGlobalGenerator.cxx,v
retrieving revision 1.204
retrieving revision 1.205
diff -u -d -r1.204 -r1.205
--- cmGlobalGenerator.cxx	22 Aug 2007 15:32:48 -0000	1.204
+++ cmGlobalGenerator.cxx	27 Aug 2007 20:04:57 -0000	1.205
@@ -1081,12 +1081,13 @@
                                            cmInstallTargetGenerator* runTime,
                                            cmInstallTargetGenerator* library,
                                            cmInstallTargetGenerator* framework,
-                                           cmInstallTargetGenerator* bundle)
+                                           cmInstallTargetGenerator* bundle,
+                                           cmInstallFilesGenerator* headers)
 {
   if ((exportSetName) && (*exportSetName) && (target))
     {
     cmTargetExport* te = new cmTargetExport(target, archive, runTime, library,
-                                            framework, bundle);
+                                            framework, bundle, headers);
     this->ExportSets[exportSetName].push_back(te);
     }
 }

Index: cmInstallCommand.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmInstallCommand.cxx,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -d -r1.30 -r1.31
--- cmInstallCommand.cxx	24 Aug 2007 18:27:18 -0000	1.30
+++ cmInstallCommand.cxx	27 Aug 2007 20:04:57 -0000	1.31
@@ -167,7 +167,7 @@
   cmCAStringVector frameworkArgVector   (&argHelper, "FRAMEWORK", &group);
   cmCAStringVector bundleArgVector      (&argHelper, "BUNDLE", &group);
   cmCAStringVector resourcesArgVector   (&argHelper, "RESOURCE", &group);
-  cmCAStringVector publicHeaderArgVector(&argHelper, "PUBLIC_HEADER ", &group);
+  cmCAStringVector publicHeaderArgVector(&argHelper, "PUBLIC_HEADER", &group);
   cmCAStringVector privateHeaderArgVector(&argHelper,"PRIVATE_HEADER", &group);
   genericArgVector.Follows(0);
   group.Follows(&genericArgVector);
@@ -200,7 +200,7 @@
   resourcesArgs.Parse    (&resourcesArgVector.GetVector(),     &unknownArgs);
   publicHeaderArgs.Parse (&publicHeaderArgVector.GetVector(),  &unknownArgs);
   privateHeaderArgs.Parse(&privateHeaderArgVector.GetVector(), &unknownArgs);
-  
+
   if(!unknownArgs.empty())
     {
     // Unknown argument.
@@ -290,9 +290,9 @@
     cmInstallTargetGenerator* runtimeGenerator = 0;
     cmInstallTargetGenerator* frameworkGenerator = 0;
     cmInstallTargetGenerator* bundleGenerator = 0;
-    cmInstallTargetGenerator* resourcesGenerator = 0;
-    cmInstallTargetGenerator* publicHeaderGenerator = 0;
-    cmInstallTargetGenerator* privateHeaderGenerator = 0;
+    cmInstallFilesGenerator* resourcesGenerator = 0;
+    cmInstallFilesGenerator* publicHeaderGenerator = 0;
+    cmInstallFilesGenerator* privateHeaderGenerator = 0;
 
     switch(target.GetType())
       {
@@ -362,13 +362,6 @@
               }
             }
           }
-
-/*        if(target.GetPropertyAsBool("FRAMEWORK"))
-          {
-          // Create the files install generator.
-          this->Makefile->AddInstallGenerator(CreateInstallFilesGenerator(
-                                            absFiles, publicHeaderArgs, false);
-          }*/
         }
         break;
       case cmTarget::STATIC_LIBRARY:
@@ -460,25 +453,106 @@
         // Ignore the case.
         break;
       }
+
+//       if(target.GetProperty("ASSOCIATED_FILES");
+
+  const char* files = target.GetProperty("PUBLIC_HEADER");
+  if ((files) && (*files))
+    {
+    std::vector<std::string> relFiles;
+    cmSystemTools::ExpandListArgument(files, relFiles);
+    std::vector<std::string> absFiles;
+    if (!this->MakeFilesFullPath("PUBLIC_HEADER", relFiles, absFiles))
+      {
+      return false;
+      }
+
+    // Create the files install generator.
+    if (!publicHeaderArgs.GetDestination().empty())
+      {
+      publicHeaderGenerator = CreateInstallFilesGenerator(absFiles, 
+                                                      publicHeaderArgs, false);
+      }
+    else
+      {
+      cmOStringStream e;
+      e << "TARGETS given no PUBLIC_HEADER DESTINATION for header files\"" 
+          << target.GetName() << "\".";
+      this->SetError(e.str().c_str());
+      return false;
+      }
+    }
+
+  files = target.GetProperty("PRIVATE_HEADER");
+  if ((files) && (*files))
+    {
+    std::vector<std::string> relFiles;
+    cmSystemTools::ExpandListArgument(files, relFiles);
+    std::vector<std::string> absFiles;
+    if (!this->MakeFilesFullPath("PRIVATE_HEADER", relFiles, absFiles))
+      {
+      return false;
+      }
+
+    // Create the files install generator.
+    if (!privateHeaderArgs.GetDestination().empty())
+      {
+      privateHeaderGenerator = CreateInstallFilesGenerator(absFiles, 
+                                                     privateHeaderArgs, false);
+      }
+    else
+      {
+      cmOStringStream e;
+      e << "TARGETS given no PRIVATE_HEADER DESTINATION for header files\"" 
+          << target.GetName() << "\".";
+      this->SetError(e.str().c_str());
+      return false;
+      }
+    }
+
+  files = target.GetProperty("RESOURCE_FILES");
+  if ((files) && (*files))
+    {
+    std::vector<std::string> relFiles;
+    cmSystemTools::ExpandListArgument(files, relFiles);
+    std::vector<std::string> absFiles;
+    if (!this->MakeFilesFullPath("RESOURCE_FILES", relFiles, absFiles))
+      {
+      return false;
+      }
+
+    // Create the files install generator.
+    if (!privateHeaderArgs.GetDestination().empty())
+      {
+      resourcesGenerator = CreateInstallFilesGenerator(absFiles, 
+                                                       resourcesArgs, false);
+      }
+    else
+      {
+      cmOStringStream e;
+      e << "TARGETS given no RESOURCES DESTINATION for resource files\"" 
+          << target.GetName() << "\".";
+      this->SetError(e.str().c_str());
+      return false;
+      }
+    }
+
     this->Makefile->AddInstallGenerator(archiveGenerator);
     this->Makefile->AddInstallGenerator(libraryGenerator);
     this->Makefile->AddInstallGenerator(runtimeGenerator);
     this->Makefile->AddInstallGenerator(frameworkGenerator);
     this->Makefile->AddInstallGenerator(bundleGenerator);
-    this->Makefile->AddInstallGenerator(resourcesGenerator);
     this->Makefile->AddInstallGenerator(publicHeaderGenerator);
     this->Makefile->AddInstallGenerator(privateHeaderGenerator);
+    this->Makefile->AddInstallGenerator(resourcesGenerator);
 
     if (!exports.GetString().empty())
       {
       this->Makefile->GetLocalGenerator()->GetGlobalGenerator()
-                                     ->AddTargetToExports(exports.GetCString(),
-                                                          &target,
-                                                          archiveGenerator,
-                                                          runtimeGenerator,
-                                                          libraryGenerator,
-                                                          frameworkGenerator,
-                                                          bundleGenerator);
+        ->AddTargetToExports(exports.GetCString(), &target, 
+                             archiveGenerator, runtimeGenerator,
+                             libraryGenerator, frameworkGenerator,
+                             bundleGenerator, publicHeaderGenerator);
       }
     }
 
@@ -540,29 +614,9 @@
     }
 
   std::vector<std::string> absFiles;
-  for(std::vector<std::string>::const_iterator 
-      fileIt = files.GetVector().begin(); fileIt != files.GetVector().end();
-      ++fileIt)
+  if (!this->MakeFilesFullPath(args[0].c_str(), files.GetVector(), absFiles))
     {
-    // Convert this file to a full path.
-    std::string file = *fileIt;
-    if(!cmSystemTools::FileIsFullPath(file.c_str()))
-      {
-      file = this->Makefile->GetCurrentDirectory();
-      file += "/";
-      file += *fileIt;
-      }
-
-    // Make sure the file is not a directory.
-    if(cmSystemTools::FileIsDirectory(file.c_str()))
-      {
-      cmOStringStream e;
-      e << args[0] << " given directory \"" << (*fileIt) << "\" to install.";
-      this->SetError(e.str().c_str());
-      return false;
-      }
-    // Store the file for installation.
-    absFiles.push_back(file);
+    return false;
     }
 
   if (!ica.Finalize())
@@ -1011,3 +1065,33 @@
 
   return true;
 }
+
+bool cmInstallCommand::MakeFilesFullPath(const char* modeName,
+                                      const std::vector<std::string>& relFiles,
+                                      std::vector<std::string>& absFiles)
+{
+  for(std::vector<std::string>::const_iterator fileIt = relFiles.begin();
+      fileIt != relFiles.end();
+      ++fileIt)
+    {
+    std::string file = (*fileIt);
+    if(!cmSystemTools::FileIsFullPath(file.c_str()))
+      {
+      file = this->Makefile->GetCurrentDirectory();
+      file += "/";
+      file += *fileIt;
+      }
+
+    // Make sure the file is not a directory.
+    if(cmSystemTools::FileIsDirectory(file.c_str()))
+      {
+      cmOStringStream e;
+      e << modeName << " given directory \"" << (*fileIt) << "\" to install.";
+      this->SetError(e.str().c_str());
+      return false;
+      }
+    // Store the file for installation.
+    absFiles.push_back(file);
+    }
+  return true;
+}

Index: cmInstallCommand.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmInstallCommand.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- cmInstallCommand.h	3 Aug 2007 20:31:08 -0000	1.20
+++ cmInstallCommand.h	27 Aug 2007 20:04:57 -0000	1.21
@@ -252,8 +252,9 @@
   bool HandleFilesMode(std::vector<std::string> const& args);
   bool HandleDirectoryMode(std::vector<std::string> const& args);
   bool HandleExportMode(std::vector<std::string> const& args);
-  void ComputeDestination(const char* destination, std::string& dest) const;
-  bool CheckPermissions(std::string const& arg, std::string& permissions)const;
+  bool MakeFilesFullPath(const char* modeName, 
+                         const std::vector<std::string>& relFiles,
+                         std::vector<std::string>& absFiles);
 };
 
 

Index: cmInstallExportGenerator.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmInstallExportGenerator.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- cmInstallExportGenerator.h	22 Aug 2007 15:32:48 -0000	1.3
+++ cmInstallExportGenerator.h	27 Aug 2007 20:04:57 -0000	1.4
@@ -23,6 +23,7 @@
 
 
 class cmInstallTargetGenerator;
+class cmInstallFilesGenerator;
 
 /* cmInstallExportTarget is used in cmGlobalGenerator to collect the 
 install generators for the exported targets. These are then used by the 
@@ -36,10 +37,12 @@
                  cmInstallTargetGenerator* runtime, 
                  cmInstallTargetGenerator* library,
                  cmInstallTargetGenerator* framework,
-                 cmInstallTargetGenerator* bundle
+                 cmInstallTargetGenerator* bundle,
+                 cmInstallFilesGenerator* headers
                 ) : Target(tgt), ArchiveGenerator(archive),
                     RuntimeGenerator(runtime), LibraryGenerator(library),
-                    FrameworkGenerator(framework), BundleGenerator(bundle) {}
+                    FrameworkGenerator(framework), BundleGenerator(bundle),
+                    HeaderGenerator(headers) {}
 
   cmTarget* Target;
   cmInstallTargetGenerator* ArchiveGenerator;
@@ -47,6 +50,7 @@
   cmInstallTargetGenerator* LibraryGenerator;
   cmInstallTargetGenerator* FrameworkGenerator;
   cmInstallTargetGenerator* BundleGenerator;
+  cmInstallFilesGenerator* HeaderGenerator;
 private:
   cmTargetExport();
 };
@@ -85,6 +89,9 @@
   static bool AddInstallLocations(cmTargetWithProperties *twp, 
                                   cmInstallTargetGenerator* generator,
                                   const char* prefix);
+  static bool AddInstallLocations(cmTargetWithProperties* twp,
+                                           cmInstallFilesGenerator* generator,
+                                           const char* propertyName);
 
   std::string Name;
   std::string FilePermissions;



More information about the Cmake-commits mailing list