summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Hoffman <bill.hoffman@kitware.com>2003-01-20 21:59:02 (GMT)
committerBill Hoffman <bill.hoffman@kitware.com>2003-01-20 21:59:02 (GMT)
commitc4fa5d1fdf8a8bdc03872f148b29432e8f55ae9a (patch)
treead9ce56528b85193ae6f75a51b1418498e0c59b3
parentece369eaf3bb463a4a9675f1aed69199ce8b3832 (diff)
downloadCMake-c4fa5d1fdf8a8bdc03872f148b29432e8f55ae9a.zip
CMake-c4fa5d1fdf8a8bdc03872f148b29432e8f55ae9a.tar.gz
CMake-c4fa5d1fdf8a8bdc03872f148b29432e8f55ae9a.tar.bz2
ENH: add a new command that allows exports of library dependencies from a project to a file
-rw-r--r--Source/cmCommands.cxx2
-rw-r--r--Source/cmExportLibraryDependencies.cxx107
-rw-r--r--Source/cmExportLibraryDependencies.h85
-rw-r--r--Source/cmGlobalGenerator.h2
-rw-r--r--Source/cmMakefile.h10
-rw-r--r--Tests/Complex/CMakeLists.txt1
-rw-r--r--Tests/ComplexOneConfig/CMakeLists.txt1
-rw-r--r--Tests/ComplexRelativePaths/CMakeLists.txt1
8 files changed, 204 insertions, 5 deletions
diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx
index a60ff9f..f53977c 100644
--- a/Source/cmCommands.cxx
+++ b/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);
diff --git a/Source/cmExportLibraryDependencies.cxx b/Source/cmExportLibraryDependencies.cxx
new file mode 100644
index 0000000..6992b19
--- /dev/null
+++ b/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;
+}
+
diff --git a/Source/cmExportLibraryDependencies.h b/Source/cmExportLibraryDependencies.h
new file mode 100644
index 0000000..67f8e98
--- /dev/null
+++ b/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
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index ee2a1cb..8b9176c 100644
--- a/Source/cmGlobalGenerator.h
+++ b/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;
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index e0cf827..e472781 100644
--- a/Source/cmMakefile.h
+++ b/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;
diff --git a/Tests/Complex/CMakeLists.txt b/Tests/Complex/CMakeLists.txt
index a30d493..881f11a 100644
--- a/Tests/Complex/CMakeLists.txt
+++ b/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)
diff --git a/Tests/ComplexOneConfig/CMakeLists.txt b/Tests/ComplexOneConfig/CMakeLists.txt
index a30d493..881f11a 100644
--- a/Tests/ComplexOneConfig/CMakeLists.txt
+++ b/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)
diff --git a/Tests/ComplexRelativePaths/CMakeLists.txt b/Tests/ComplexRelativePaths/CMakeLists.txt
index a30d493..881f11a 100644
--- a/Tests/ComplexRelativePaths/CMakeLists.txt
+++ b/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)