diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx index a60ff9f7d..f53977ca1 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 000000000..6992b1941 --- /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 000000000..67f8e985e --- /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 ee2a1cb74..8b9176cb3 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 e0cf82744..e472781d8 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 a30d493e5..881f11a27 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 a30d493e5..881f11a27 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 a30d493e5..881f11a27 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)