Selaa lähdekoodia

ENH: add a new command that allows exports of library dependencies from a project to a file

Bill Hoffman 23 vuotta sitten
vanhempi
sitoutus
c4fa5d1fdf

+ 2 - 0
Source/cmCommands.cxx

@@ -38,6 +38,7 @@
 #include "cmEndForEachCommand.cxx"
 #include "cmEndIfCommand.cxx"
 #include "cmExecProgramCommand.cxx"
+#include "cmExportLibraryDependencies.cxx"
 #include "cmFindFileCommand.cxx"
 #include "cmFindLibraryCommand.cxx"
 #include "cmFindPathCommand.cxx"
@@ -122,6 +123,7 @@ void GetPredefinedCommands(std::list<cmCommand*>& commands)
   commands.push_back(new cmEndForEachCommand);
   commands.push_back(new cmEndIfCommand);
   commands.push_back(new cmExecProgramCommand);
+  commands.push_back(new cmExportLibraryDependenciesCommand);
   commands.push_back(new cmFindFileCommand);
   commands.push_back(new cmFindLibraryCommand);
   commands.push_back(new cmFindPathCommand);

+ 107 - 0
Source/cmExportLibraryDependencies.cxx

@@ -0,0 +1,107 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "cmExportLibraryDependencies.h"
+#include "cmGlobalGenerator.h"
+#include "cmLocalGenerator.h"
+#include "cmake.h"
+
+// cmExecutableCommand
+bool cmExportLibraryDependenciesCommand::InitialPass(std::vector<std::string> const& args)
+{
+  // First argument is the name of the test
+  // Second argument is the name of the executable to run (a target or external
+  //    program)
+  // Remaining arguments are the arguments to pass to the executable
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  
+  // store the arguments for the final pass
+  // also expand any CMake variables
+
+  m_Args = args;
+  return true;
+}
+
+
+void cmExportLibraryDependenciesCommand::FinalPass()
+{
+  // don't do anything if local mode
+  if(m_Makefile->GetLocal())
+    {
+    return;
+    }
+    
+
+  // Create a full path filename for output Testfile
+  std::string fname = m_Args[0];
+  bool append = false;
+  if(m_Args.size() > 1)
+    {
+    if(m_Args[1] == "APPEND")
+      {
+      append = true;
+      }
+    }
+  // Open the output Testfile
+  std::ofstream fout;
+  if(append)
+    {
+    fout.open(fname.c_str(), std::ios::app);
+    }
+  else
+    {
+      fout.open(fname.c_str());
+    }
+  if (!fout)
+    {
+    cmSystemTools::Error("Error Writing ", fname.c_str());
+    return;
+    }
+  cmake* cm = m_Makefile->GetCMakeInstance();
+  cmGlobalGenerator* global = cm->GetGlobalGenerator();
+  std::vector<cmLocalGenerator *> locals;
+  global->GetLocalGenerators(locals);
+  std::string libDepName;
+  for(std::vector<cmLocalGenerator *>::iterator i = locals.begin();
+      i != locals.end(); ++i)
+    {
+    cmLocalGenerator* gen = *i;
+    cmTargets &tgts = gen->GetMakefile()->GetTargets();  
+    for(cmTargets::const_iterator l = tgts.begin();
+        l != tgts.end(); ++l)
+      {
+      if ((l->second.GetType() != cmTarget::INSTALL_FILES)
+          && (l->second.GetType() != cmTarget::INSTALL_PROGRAMS))
+        {
+        libDepName = l->first;
+        libDepName += "_LIB_DEPENDS";
+        const char* def = m_Makefile->GetDefinition(libDepName.c_str());
+        if(def)
+          {
+          fout << "SET(" << libDepName << " \"" << def << "\")\n";
+          }
+        }
+      }
+    }
+  fout << ")" << std::endl;
+  fout.close();
+  return;
+}
+

+ 85 - 0
Source/cmExportLibraryDependencies.h

@@ -0,0 +1,85 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef cmExportLibraryDependenciesCommand_h
+#define cmExportLibraryDependenciesCommand_h
+
+#include "cmStandardIncludes.h"
+#include "cmCommand.h"
+
+/** \class cmExportLibraryDependenciesCommand
+ * \brief Add a test to the lists of tests to run.
+ *
+ * cmExportLibraryDependenciesCommand adds a test to the list of tests to run .
+ */
+class cmExportLibraryDependenciesCommand : public cmCommand
+{
+public:
+  /**
+   * This is a virtual constructor for the command.
+   */
+  virtual cmCommand* Clone() 
+    {
+    return new cmExportLibraryDependenciesCommand;
+    }
+
+  /**
+   * This is called when the command is first encountered in
+   * the CMakeLists.txt file.
+   */
+  virtual bool InitialPass(std::vector<std::string> const& args);
+
+  /**
+   * This is called at the end after all the information
+   * specified by the command is accumulated. 
+   */
+  virtual void FinalPass();
+
+  /**
+   * The name of the command as specified in CMakeList.txt.
+   */
+  virtual const char* GetName() { return "EXPORT_LIBRARY_DEPENDENCIES";}
+
+  /**
+   * Succinct documentation.
+   */
+  virtual const char* GetTerseDocumentation() 
+    {
+    return "Write out the dependency information for all targets of a project.";
+    }
+  
+  /**
+   * More documentation.
+   */
+  virtual const char* GetFullDocumentation()
+    {
+    return
+      "EXPORT_LIBRARY_DEPENDENCIES(FILE [APPEND])\n"
+      "Create a file that can be included into a cmakelist file with the "
+      "INCLUDE command.   The file will contain a number of SET commands "
+      "that will set all the variables needed for library dependency "
+      "information.  This should be the last command in the top level "
+      "CMakeLists.txt file of the project.";
+    }
+  
+  cmTypeMacro(cmExportLibraryDependenciesCommand, cmCommand);
+
+private:
+  std::vector<std::string> m_Args;
+};
+
+
+#endif

+ 2 - 0
Source/cmGlobalGenerator.h

@@ -98,6 +98,8 @@ public:
     return this->m_CMakeInstance; };
 
   void SetConfiguredFilesPath(const char* s){m_ConfiguredFilesPath = s;}
+  void GetLocalGenerators(std::vector<cmLocalGenerator *>&g) { g = m_LocalGenerators;}
+  
 protected:
   cmStdString m_FindMakeProgramFile;
   cmStdString m_ConfiguredFilesPath;

+ 5 - 5
Source/cmMakefile.h

@@ -547,6 +547,11 @@ public:
    */
   void ExpandArguments(std::vector<cmListFileArgument> const& inArgs,
                        std::vector<std::string>& outArgs);
+  /**
+   * Get the instance
+   */ 
+  cmake *GetCMakeInstance() const;
+
 protected:
   // add link libraries and directories to the target
   void AddGlobalLinkInformation(const char* name, cmTarget& target);
@@ -609,11 +614,6 @@ private:
   void AddDefaultDefinitions();
   std::list<cmFunctionBlocker *> m_FunctionBlockers;
 
-  /**
-   * Get the instance
-   */ 
-  cmake *GetCMakeInstance() const;
-
   typedef std::map<cmStdString, cmData*> DataMap;
   DataMap m_DataMap;
   bool m_Inheriting;

+ 1 - 0
Tests/Complex/CMakeLists.txt

@@ -236,3 +236,4 @@ ENDIF(NOT STRING_REGEX_PASSED)
 #
 SUBDIRS(Library Executable)
 SUBDIR_DEPENDS(Executable Library)
+EXPORT_LIBRARY_DEPENDENCIES(${Complex_BINARY_DIR}/ComplexLibraryDepends.cmake)

+ 1 - 0
Tests/ComplexOneConfig/CMakeLists.txt

@@ -236,3 +236,4 @@ ENDIF(NOT STRING_REGEX_PASSED)
 #
 SUBDIRS(Library Executable)
 SUBDIR_DEPENDS(Executable Library)
+EXPORT_LIBRARY_DEPENDENCIES(${Complex_BINARY_DIR}/ComplexLibraryDepends.cmake)

+ 1 - 0
Tests/ComplexRelativePaths/CMakeLists.txt

@@ -236,3 +236,4 @@ ENDIF(NOT STRING_REGEX_PASSED)
 #
 SUBDIRS(Library Executable)
 SUBDIR_DEPENDS(Executable Library)
+EXPORT_LIBRARY_DEPENDENCIES(${Complex_BINARY_DIR}/ComplexLibraryDepends.cmake)