From c4fa5d1fdf8a8bdc03872f148b29432e8f55ae9a Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Mon, 20 Jan 2003 16:59:02 -0500 Subject: ENH: add a new command that allows exports of library dependencies from a project to a file --- Source/cmCommands.cxx | 2 + Source/cmExportLibraryDependencies.cxx | 107 ++++++++++++++++++++++++++++++ Source/cmExportLibraryDependencies.h | 85 ++++++++++++++++++++++++ Source/cmGlobalGenerator.h | 2 + Source/cmMakefile.h | 10 +-- Tests/Complex/CMakeLists.txt | 1 + Tests/ComplexOneConfig/CMakeLists.txt | 1 + Tests/ComplexRelativePaths/CMakeLists.txt | 1 + 8 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 Source/cmExportLibraryDependencies.cxx create mode 100644 Source/cmExportLibraryDependencies.h 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& 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 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 locals; + global->GetLocalGenerators(locals); + std::string libDepName; + for(std::vector::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 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 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&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 const& inArgs, std::vector& 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 m_FunctionBlockers; - /** - * Get the instance - */ - cmake *GetCMakeInstance() const; - typedef std::map 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) -- cgit v0.12