From 73f04d1409ec4dfcb3b8db3e104da2a894d019a2 Mon Sep 17 00:00:00 2001 From: Ken Martin Date: Tue, 24 Apr 2001 16:49:12 -0400 Subject: many fixes and cleanup and features --- Source/CMakeLib.dsp | 156 +------------------ Source/MFCDialog/CMakeSetupDialog.cpp | 20 +-- Source/Makefile.in | 6 +- Source/cmAbstractFilesCommand.cxx | 10 +- Source/cmAuxSourceDirectoryCommand.cxx | 6 +- Source/cmCablePackageCommand.cxx | 8 +- Source/cmCableSourceFilesCommand.cxx | 6 +- Source/cmCacheManager.cxx | 25 +++- Source/cmCacheManager.h | 20 ++- Source/cmClassFile.cxx | 125 ---------------- Source/cmClassFile.h | 99 ------------ Source/cmCommands.cxx | 6 +- Source/cmDSPMakefile.cxx | 19 ++- Source/cmDSPMakefile.h | 4 +- Source/cmDSPWriter.cxx | 19 ++- Source/cmDSPWriter.h | 4 +- Source/cmMakeDepend.cxx | 38 +++-- Source/cmMakeDepend.h | 4 +- Source/cmMakefile.cxx | 54 ++----- Source/cmMakefile.h | 36 ++--- Source/cmOptionCommand.cxx | 2 +- Source/cmSourceFile.cxx | 125 ++++++++++++++++ Source/cmSourceFile.h | 117 +++++++++++++++ Source/cmSourceFilesCommand.cxx | 6 +- Source/cmSourceFilesRequireCommand.cxx | 14 +- Source/cmTarget.cxx | 44 ++++++ Source/cmTarget.h | 18 ++- Source/cmUnixDefinesCommand.cxx | 8 +- Source/cmUnixLibrariesCommand.cxx | 8 +- Source/cmUnixMakefileGenerator.cxx | 48 ++---- Source/cmVTKWrapPythonCommand.cxx | 213 ++++++++++++++++++++++++++ Source/cmVTKWrapPythonCommand.h | 82 ++++++++++ Source/cmVTKWrapTclCommand.cxx | 240 ++++++++++++++++++++++++++++++ Source/cmVTKWrapTclCommand.h | 83 +++++++++++ Source/cmWin32DefinesCommand.cxx | 8 +- Source/cmWin32IncludeDirectoryCommand.cxx | 8 +- Source/cmWin32LibrariesCommand.cxx | 8 +- Source/cmWrapExcludeFilesCommand.cxx | 10 +- Source/cmWrapTclCommand.cxx | 239 ----------------------------- Source/cmWrapTclCommand.h | 83 ----------- 40 files changed, 1108 insertions(+), 921 deletions(-) delete mode 100644 Source/cmClassFile.cxx delete mode 100644 Source/cmClassFile.h create mode 100644 Source/cmSourceFile.cxx create mode 100644 Source/cmSourceFile.h create mode 100644 Source/cmTarget.cxx create mode 100644 Source/cmVTKWrapPythonCommand.cxx create mode 100644 Source/cmVTKWrapPythonCommand.h create mode 100644 Source/cmVTKWrapTclCommand.cxx create mode 100644 Source/cmVTKWrapTclCommand.h delete mode 100644 Source/cmWrapTclCommand.cxx delete mode 100644 Source/cmWrapTclCommand.h diff --git a/Source/CMakeLib.dsp b/Source/CMakeLib.dsp index c7168db..41e18a1 100644 --- a/Source/CMakeLib.dsp +++ b/Source/CMakeLib.dsp @@ -89,10 +89,6 @@ SOURCE=.\cmCacheManager.cxx # End Source File # Begin Source File -SOURCE=.\cmClassFile.cxx -# End Source File -# Begin Source File - SOURCE=.\cmCommands.cxx # End Source File # Begin Source File @@ -129,288 +125,152 @@ SOURCE=.\cmRegularExpression.cxx # End Source File # Begin Source File +SOURCE=.\cmSourceFile.cxx +# End Source File +# Begin Source File + SOURCE=.\cmSourceGroup.cxx # End Source File # Begin Source File SOURCE=.\cmSystemTools.cxx # End Source File +# Begin Source File + +SOURCE=.\cmTarget.cxx +# End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File -SOURCE=..\cmAbstractFilesCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmAbstractFilesCommand.h # End Source File # Begin Source File -SOURCE=..\cmAddTargetCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmAddTargetCommand.h # End Source File # Begin Source File -SOURCE=..\cmAuxSourceDirectoryCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmAuxSourceDirectoryCommand.h # End Source File # Begin Source File -SOURCE=..\cmCacheManager.h -# End Source File -# Begin Source File - SOURCE=.\cmCacheManager.h # End Source File # Begin Source File -SOURCE=..\cmClassFile.h -# End Source File -# Begin Source File - -SOURCE=.\cmClassFile.h -# End Source File -# Begin Source File - -SOURCE=..\cmCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmCommand.h # End Source File # Begin Source File -SOURCE=..\cmDirectory.h -# End Source File -# Begin Source File - SOURCE=.\cmDirectory.h # End Source File # Begin Source File -SOURCE=..\cmDSPMakefile.h -# End Source File -# Begin Source File - SOURCE=.\cmDSPMakefile.h # End Source File # Begin Source File -SOURCE=..\cmDSWMakefile.h -# End Source File -# Begin Source File - SOURCE=.\cmDSWMakefile.h # End Source File # Begin Source File -SOURCE=..\cmExecutablesCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmExecutablesCommand.h # End Source File # Begin Source File -SOURCE=..\cmFindIncludeCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmFindIncludeCommand.h # End Source File # Begin Source File -SOURCE=..\cmFindLibraryCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmFindLibraryCommand.h # End Source File # Begin Source File -SOURCE=..\cmFindProgramCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmFindProgramCommand.h # End Source File # Begin Source File -SOURCE=..\cmIncludeDirectoryCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmIncludeDirectoryCommand.h # End Source File # Begin Source File -SOURCE=..\cmLibraryCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmLibraryCommand.h # End Source File # Begin Source File -SOURCE=..\cmLinkDirectoriesCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmLinkDirectoriesCommand.h # End Source File # Begin Source File -SOURCE=..\cmLinkLibrariesCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmLinkLibrariesCommand.h # End Source File # Begin Source File -SOURCE=..\cmMakeDepend.h -# End Source File -# Begin Source File - SOURCE=.\cmMakeDepend.h # End Source File # Begin Source File -SOURCE=..\cmMakefile.h -# End Source File -# Begin Source File - SOURCE=.\cmMakefile.h # End Source File # Begin Source File -SOURCE=..\cmMakefileGenerator.h -# End Source File -# Begin Source File - SOURCE=.\cmMakefileGenerator.h # End Source File # Begin Source File -SOURCE=..\cmMSProjectGenerator.h -# End Source File -# Begin Source File - SOURCE=.\cmMSProjectGenerator.h # End Source File # Begin Source File -SOURCE=..\cmProjectCommand.h -# End Source File -# Begin Source File - SOURCE=.\cmProjectCommand.h # End Source File # Begin Source File -SOURCE=..\cmRegularExpression.h -# End Source File -# Begin Source File - SOURCE=.\cmRegularExpression.h # End Source File # Begin Source File -SOURCE=..\cmSourceFilesCommand.h -# End Source File -# Begin Source File - -SOURCE=.\cmSourceFilesCommand.h -# End Source File -# Begin Source File - SOURCE=..\cmSourceFilesRequireCommand.h # End Source File # Begin Source File -SOURCE=.\cmSourceFilesRequireCommand.h -# End Source File -# Begin Source File - SOURCE=..\cmStandardIncludes.h # End Source File # Begin Source File -SOURCE=.\cmStandardIncludes.h -# End Source File -# Begin Source File - SOURCE=..\cmSubdirCommand.h # End Source File # Begin Source File -SOURCE=.\cmSubdirCommand.h -# End Source File -# Begin Source File - SOURCE=..\cmSystemTools.h # End Source File # Begin Source File -SOURCE=.\cmSystemTools.h -# End Source File -# Begin Source File - SOURCE=..\cmTestsCommand.h # End Source File # Begin Source File -SOURCE=.\cmTestsCommand.h -# End Source File -# Begin Source File - SOURCE=..\cmUnixDefinesCommand.h # End Source File # Begin Source File -SOURCE=.\cmUnixDefinesCommand.h -# End Source File -# Begin Source File - SOURCE=..\cmUnixLibrariesCommand.h # End Source File # Begin Source File -SOURCE=.\cmUnixLibrariesCommand.h -# End Source File -# Begin Source File - SOURCE=..\cmUnixMakefileGenerator.h # End Source File # Begin Source File -SOURCE=.\cmUnixMakefileGenerator.h -# End Source File -# Begin Source File - SOURCE=..\cmWin32DefinesCommand.h # End Source File # Begin Source File -SOURCE=.\cmWin32DefinesCommand.h -# End Source File -# Begin Source File - SOURCE=..\cmWin32LibrariesCommand.h # End Source File -# Begin Source File - -SOURCE=.\cmWin32LibrariesCommand.h -# End Source File # End Group # End Target # End Project diff --git a/Source/MFCDialog/CMakeSetupDialog.cpp b/Source/MFCDialog/CMakeSetupDialog.cpp index e06aaa3..29a3eff 100644 --- a/Source/MFCDialog/CMakeSetupDialog.cpp +++ b/Source/MFCDialog/CMakeSetupDialog.cpp @@ -289,7 +289,7 @@ bool CMakeSetupDialog::Browse(CString &result, const char *title) LPITEMIDLIST pidl = SHBrowseForFolder(&bi); - bool bSuccess = (bool)SHGetPathFromIDList(pidl, szPathName); + bool bSuccess = (SHGetPathFromIDList(pidl, szPathName) ? true : false); if(bSuccess) { result = szPathName; @@ -406,17 +406,17 @@ void CMakeSetupDialog::OnBuildProjects() // copy from the cache manager to the cache edit list box void CMakeSetupDialog::FillCacheEditorFromCacheManager() { - cmCacheManager::CacheEntryMap cache = + const cmCacheManager::CacheEntryMap &cache = cmCacheManager::GetInstance()->GetCacheMap(); - for(cmCacheManager::CacheEntryMap::iterator i = cache.begin(); + for(cmCacheManager::CacheEntryMap::const_iterator i = cache.begin(); i != cache.end(); ++i) { const char* key = i->first.c_str(); - cmCacheManager::CacheEntry& value = i->second; + const cmCacheManager::CacheEntry& value = i->second; switch(value.m_Type ) { case cmCacheManager::BOOL: - if(cmCacheManager::GetInstance()->IsOn(value.m_Value.c_str())) + if(cmCacheManager::GetInstance()->IsOn(key)) { m_CacheEntriesList.AddProperty(key, "ON", @@ -451,7 +451,6 @@ void CMakeSetupDialog::FillCacheEditorFromCacheManager() // copy from the list box to the cache manager void CMakeSetupDialog::FillCacheManagerFromCacheEditor() { - cmCacheManager::CacheEntryMap cache = cmCacheManager::GetInstance()->GetCacheMap(); std::set items = m_CacheEntriesList.GetItems(); for(std::set::iterator i = items.begin(); @@ -465,9 +464,12 @@ void CMakeSetupDialog::FillCacheManagerFromCacheEditor() } else { - cmCacheManager::CacheEntryMap::iterator p = - cache.find((const char*)item->m_propName); - (*p).second.m_Value = item->m_curValue; + cmCacheManager::CacheEntry *entry = + cmCacheManager::GetInstance()->GetCacheEntry((const char*)item->m_propName); + if (entry) + { + entry->m_Value = item->m_curValue; + } } } } diff --git a/Source/Makefile.in b/Source/Makefile.in index 89c8c9f..938895f 100644 --- a/Source/Makefile.in +++ b/Source/Makefile.in @@ -17,11 +17,12 @@ cmMakeDepend.o \ cmMakefile.o \ cmMakefileGenerator.o \ cmRegularExpression.o \ -cmClassFile.o \ +cmSourceFile.o \ cmSystemTools.o \ cmDirectory.o \ cmUnixMakefileGenerator.o \ cmCommands.o \ +cmTarget.o \ cmCustomCommand.o \ cmCacheManager.o \ cmSourceGroup.o @@ -35,11 +36,12 @@ cmMakefile.o : $(DEPENDS) cmMakefileGenerator.o : $(DEPENDS) cmAuxSourceDirectoryCommand.o : $(DEPENDS) cmRegularExpression.o : $(DEPENDS) -cmClassFile.o : $(DEPENDS) +cmSourceFile.o : $(DEPENDS) cmDirectory.o : $(DEPENDS) cmCustomCommand.o : $(DEPENDS) cmUnixMakefileGenerator.o : $(DEPENDS) cmCommands.o : $(DEPENDS) +cmTarget.o : $(DEPENDS) cmCacheManager.o : $(DEPENDS) cmSourceGroup.o : $(DEPENDS) diff --git a/Source/cmAbstractFilesCommand.cxx b/Source/cmAbstractFilesCommand.cxx index 5c2b590..738e811 100644 --- a/Source/cmAbstractFilesCommand.cxx +++ b/Source/cmAbstractFilesCommand.cxx @@ -23,19 +23,19 @@ bool cmAbstractFilesCommand::Invoke(std::vector& args) this->SetError("called with incorrect number of arguments"); return false; } - cmMakefile::ClassMap &Classes = m_Makefile->GetClasses(); + cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); for(std::vector::iterator j = args.begin(); j != args.end(); ++j) { - for(cmMakefile::ClassMap::iterator l = Classes.begin(); + for(cmMakefile::SourceMap::iterator l = Classes.begin(); l != Classes.end(); l++) { - for(std::vector::iterator i = l->second.begin(); + for(std::vector::iterator i = l->second.begin(); i != l->second.end(); i++) { - if(i->m_ClassName == (*j)) + if(i->GetSourceName() == (*j)) { - i->m_AbstractClass = true; + i->SetIsAnAbstractClass(true); } } } diff --git a/Source/cmAuxSourceDirectoryCommand.cxx b/Source/cmAuxSourceDirectoryCommand.cxx index 368d5e2..d5b2ccd 100644 --- a/Source/cmAuxSourceDirectoryCommand.cxx +++ b/Source/cmAuxSourceDirectoryCommand.cxx @@ -49,10 +49,10 @@ bool cmAuxSourceDirectoryCommand::Invoke(std::vector& args) fullname += file; // add the file as a class file so // depends can be done - cmClassFile cmfile; + cmSourceFile cmfile; cmfile.SetName(fullname.c_str(), m_Makefile->GetCurrentDirectory()); - cmfile.m_AbstractClass = false; - m_Makefile->AddClass(cmfile,args[1].c_str()); + cmfile.SetIsAnAbstractClass(false); + m_Makefile->AddSource(cmfile,args[1].c_str()); } } } diff --git a/Source/cmCablePackageCommand.cxx b/Source/cmCablePackageCommand.cxx index 19fac7d..1808dee 100644 --- a/Source/cmCablePackageCommand.cxx +++ b/Source/cmCablePackageCommand.cxx @@ -128,11 +128,11 @@ void cmCablePackageCommand::FinalPass() // Add a rule to build the generated package. std::string fileName = "Cxx/"+m_PackageName+"_cxx"; std::string filePath = m_Makefile->GetStartOutputDirectory(); - cmClassFile file; - file.m_AbstractClass = false; - file.m_HeaderFileOnly = false; + cmSourceFile file; + file.SetIsAnAbstractClass(false); + file.SetIsAHeaderFileOnly(false); file.SetName(fileName.c_str(), filePath.c_str(), "cxx", false); - m_Makefile->AddClass(file, m_PackageName.c_str()); + m_Makefile->AddSource(file, m_PackageName.c_str()); } diff --git a/Source/cmCableSourceFilesCommand.cxx b/Source/cmCableSourceFilesCommand.cxx index a0584dc..50e4d2c 100644 --- a/Source/cmCableSourceFilesCommand.cxx +++ b/Source/cmCableSourceFilesCommand.cxx @@ -24,8 +24,8 @@ void cmCableSourceFilesCommand::FinalPass() std::string fileName = "Cxx/"; fileName += cablePackage->GetPackageName(); fileName += "_cxx"; - cmClassFile *ci = m_Makefile->GetClass(cablePackage->GetPackageName(), - fileName.c_str()); + cmSourceFile *ci = m_Makefile->GetSource(cablePackage->GetPackageName(), + fileName.c_str()); if(ci == 0) { return; } @@ -36,7 +36,7 @@ void cmCableSourceFilesCommand::FinalPass() f != m_Entries.end(); ++f) { std::string header = *f+".h"; - ci->m_Depends.push_back(header); + ci->GetDepends().push_back(header); } } diff --git a/Source/cmCacheManager.cxx b/Source/cmCacheManager.cxx index fb84d74..6529973 100644 --- a/Source/cmCacheManager.cxx +++ b/Source/cmCacheManager.cxx @@ -96,7 +96,7 @@ bool cmCacheManager::LoadCache(cmMakefile* mf) return true; } -bool cmCacheManager::SaveCache(cmMakefile* mf) +bool cmCacheManager::SaveCache(cmMakefile* mf) const { std::string cacheFile = mf->GetHomeOutputDirectory(); cacheFile += "/CMakeCache.txt"; @@ -119,7 +119,7 @@ bool cmCacheManager::SaveCache(cmMakefile* mf) << "# TYPE is a hint to GUI's for the type of VALUE, DO NOT EDIT TYPE!.\n" << "# VALUE is the current value for the KEY.\n\n"; - for( std::map::iterator i = m_Cache.begin(); + for( std::map::const_iterator i = m_Cache.begin(); i != m_Cache.end(); ++i) { CacheEntryType t = (*i).second.m_Type; @@ -151,34 +151,43 @@ void cmCacheManager::AddCacheEntry(const char* key, m_Cache[key] = e; } -const char* cmCacheManager::GetCacheValue(const char* key) +cmCacheManager::CacheEntry *cmCacheManager::GetCacheEntry(const char* key) { if(m_Cache.count(key)) { - return m_Cache[key].m_Value.c_str(); + return &(m_Cache.find(key)->second); + } + return 0; +} + +const char* cmCacheManager::GetCacheValue(const char* key) const +{ + if(m_Cache.count(key)) + { + return m_Cache.find(key)->second.m_Value.c_str(); } return 0; } -bool cmCacheManager::IsOn(const char* key) +bool cmCacheManager::IsOn(const char* key) const { if(!m_Cache.count(key)) { return false; } - std::string &v = m_Cache[key].m_Value; + const std::string &v = m_Cache.find(key)->second.m_Value; return (v == "ON" || v == "on" || v == "1" || v == "true" || v == "yev" || v == "TRUE" || v == "True" || v == "y" || v == "Y"); } -void cmCacheManager::PrintCache(std::ostream& out) +void cmCacheManager::PrintCache(std::ostream& out) const { out << "=================================================" << std::endl; out << "CMakeCache Contents:" << std::endl; - for(std::map::iterator i = m_Cache.begin(); + for(std::map::const_iterator i = m_Cache.begin(); i != m_Cache.end(); ++i) { out << (*i).first.c_str() << " = " << (*i).second.m_Value.c_str() << std::endl; diff --git a/Source/cmCacheManager.h b/Source/cmCacheManager.h index 2da1817..01bf98b 100644 --- a/Source/cmCacheManager.h +++ b/Source/cmCacheManager.h @@ -35,8 +35,8 @@ public: std::string m_Value; CacheEntryType m_Type; }; - typedef std::map CacheEntryMap; public: + typedef std::map CacheEntryMap; /** * Types for the cache entries. These are useful as * hints for a cache editor program. Path should bring @@ -53,7 +53,7 @@ public: bool LoadCache(cmMakefile*); //! Save cache for given makefile. Saves to ouput home CMakeCache.txt - bool SaveCache(cmMakefile*); + bool SaveCache(cmMakefile*) const; //! Add an entry into the cache void AddCacheEntry(const char* key, const char* value, CacheEntryType type); @@ -64,18 +64,22 @@ public: //! Remove an entry from the cache void RemoveCacheEntry(const char* key); + //! Print the cache to a stream + CacheEntry *GetCacheEntry(const char *key); + //! Get a value from the cache given a key - const char* GetCacheValue(const char* key); + const char* GetCacheValue(const char* key) const; + //! Test a boolean cache entry to see if it is true or false, returns false // if no entry. - bool IsOn(const char*); + bool IsOn(const char*) const; //! Print the cache to a stream - void PrintCache(std::ostream&); - + void PrintCache(std::ostream&) const; + //! Get the cache map ivar. - CacheEntryMap GetCacheMap() { return m_Cache; } - + const CacheEntryMap &GetCacheMap() const { return m_Cache; } + private: static cmCacheManager* s_Instance; CacheEntryMap m_Cache; diff --git a/Source/cmClassFile.cxx b/Source/cmClassFile.cxx deleted file mode 100644 index 9ea0674..0000000 --- a/Source/cmClassFile.cxx +++ /dev/null @@ -1,125 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - - Copyright (c) 2000 National Library of Medicine - All rights reserved. - - See COPYRIGHT.txt for copyright details. - -=========================================================================*/ -#include "cmClassFile.h" -#include "cmStandardIncludes.h" -#include "cmSystemTools.h" - - - -// Set the name of the class and the full path to the file. -// The class must be found in dir and end in name.cxx, name.txx, -// name.c or it will be considered a header file only class -// and not included in the build process -void cmClassFile::SetName(const char* name, const char* dir) -{ - m_HeaderFileOnly = true; - m_ClassName = name; - std::string pathname = dir; - if(pathname != "") - { - pathname += "/"; - } - - // First try and see whether the listed file can be found - // as is without extensions added on. - pathname += m_ClassName; - std::string hname = pathname; - if(cmSystemTools::FileExists(hname.c_str())) - { - m_HeaderFileOnly = false; - m_FullPath = hname; - return; - } - - // Try various extentions - hname = pathname; - hname += ".cxx"; - if(cmSystemTools::FileExists(hname.c_str())) - { - m_ClassExtension = "cxx"; - m_HeaderFileOnly = false; - m_FullPath = hname; - return; - } - - hname = pathname; - hname += ".c"; - if(cmSystemTools::FileExists(hname.c_str())) - { - m_HeaderFileOnly = false; - m_ClassExtension = "c"; - m_FullPath = hname; - return; - } - hname = pathname; - hname += ".txx"; - if(cmSystemTools::FileExists(hname.c_str())) - { - m_HeaderFileOnly = false; - m_ClassExtension = "txx"; - m_FullPath = hname; - return; - } - hname = pathname; - hname += ".h"; - if(cmSystemTools::FileExists(hname.c_str())) - { - m_ClassExtension = "h"; - m_FullPath = hname; - return; - } - - cmSystemTools::Error("can not find file ", hname.c_str()); - cmSystemTools::Error("Tried .txx .cxx .c for ", hname.c_str()); -} - -void cmClassFile::SetName(const char* name, const char* dir, const char *ext, - bool hfo) -{ - m_HeaderFileOnly = hfo; - m_ClassName = name; - std::string pathname = dir; - if(pathname != "") - { - pathname += "/"; - } - - pathname += m_ClassName + "." + ext; - m_FullPath = pathname; - m_ClassExtension = ext; - return; -} - -void cmClassFile::Print() const -{ - if(m_AbstractClass) - { - std::cout << "Abstract "; - } - else - { - std::cout << "Concrete "; - } - if(m_HeaderFileOnly) - { - std::cout << "Header file "; - } - else - { - std::cout << "CXX file "; - } - std::cout << m_ClassName << std::endl; -} diff --git a/Source/cmClassFile.h b/Source/cmClassFile.h deleted file mode 100644 index 006d35e..0000000 --- a/Source/cmClassFile.h +++ /dev/null @@ -1,99 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - - Copyright (c) 2000 National Library of Medicine - All rights reserved. - - See COPYRIGHT.txt for copyright details. - -=========================================================================*/ -#ifndef cmClassFile_h -#define cmClassFile_h - -#include "cmStandardIncludes.h" - -/** \class cmClassFile - * \brief Represent a class loaded from a makefile. - * - * cmClassFile is represents a class loaded from - * a makefile. - */ -class cmClassFile -{ -public: - /** - * Construct instance as a concrete class with both a - * .h and .cxx file. - */ - cmClassFile() - { - m_AbstractClass = false; - m_HeaderFileOnly = false; - m_WrapExclude = false; - } - - /** - * Set the name of the file, given the directory - * the file should be in. Various extensions are tried on - * the name (e.g., .cxx, .cpp) in the directory to find the actual file. - */ - void SetName(const char* name, const char* dir); - - /** - * Set the name of the file, given the directory the file should be in. IN - * this version the extesion is provided in the call. This is useful for - * generated files that do not exist prior to the build. - */ - void SetName(const char* name, const char* dir, const char *ext, - bool headerFileOnly); - - /** - * Print the structure to std::cout. - */ - void Print() const; - - /** - * Indicate whether the class is abstract (non-instantiable). - */ - bool m_AbstractClass; - - /** - * Indicate whether the class should not be wrapped - */ - bool m_WrapExclude; - - /** - * Indicate whether this class is defined with only the header file. - */ - bool m_HeaderFileOnly; - - /** - * The full path to the file. - */ - std::string m_FullPath; - - /** - * The file name associated with stripped off directory and extension. - * (In most cases this is the name of the class.) - */ - std::string m_ClassName; - - /** - * The file name associated with stripped off directory and extension. - * (In most cases this is the name of the class.) - */ - std::string m_ClassExtension; - - /** - * The dependencies of this class are gathered here. - */ - std::vector m_Depends; -}; - -#endif diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx index 801a646..c9cf0fb 100644 --- a/Source/cmCommands.cxx +++ b/Source/cmCommands.cxx @@ -38,7 +38,8 @@ #include "cmCableInstantiateClassCommand.cxx" #include "cmFindFileCommand.cxx" #include "cmWrapExcludeFilesCommand.cxx" -#include "cmWrapTclCommand.cxx" +#include "cmVTKWrapPythonCommand.cxx" +#include "cmVTKWrapTclCommand.cxx" #include "cmBuildSharedLibrariesCommand.cxx" #include "cmUtilitySourceCommand.cxx" #include "cmIncludeRegularExpressionCommand.cxx" @@ -83,7 +84,8 @@ void GetPredefinedCommands(std::list& commands) commands.push_back(new cmCableInstantiateClassCommand); commands.push_back(new cmFindFileCommand); commands.push_back(new cmWrapExcludeFilesCommand); - commands.push_back(new cmWrapTclCommand); + commands.push_back(new cmVTKWrapPythonCommand); + commands.push_back(new cmVTKWrapTclCommand); commands.push_back(new cmBuildSharedLibrariesCommand); commands.push_back(new cmUtilitySourceCommand); commands.push_back(new cmIncludeRegularExpressionCommand); diff --git a/Source/cmDSPMakefile.cxx b/Source/cmDSPMakefile.cxx index 8c9a62b..74513fc 100644 --- a/Source/cmDSPMakefile.cxx +++ b/Source/cmDSPMakefile.cxx @@ -87,8 +87,8 @@ void cmDSPMakefile::OutputDSPFile() m_CreatedProjectNames.clear(); // build any targets - const cmTargets &tgts = m_Makefile->GetTargets(); - for(cmTargets::const_iterator l = tgts.begin(); + cmTargets &tgts = m_Makefile->GetTargets(); + for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); l++) { if (l->second.IsALibrary()) @@ -103,8 +103,7 @@ void cmDSPMakefile::OutputDSPFile() } } -void cmDSPMakefile::CreateSingleDSP(const char *lname, - const cmTarget &target) +void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target) { std::string fname; fname = m_Makefile->GetStartOutputDirectory(); @@ -186,7 +185,7 @@ void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup) void cmDSPMakefile::WriteDSPFile(std::ostream& fout, const char *libName, - const cmTarget &target) + cmTarget &target) { // Write the DSP file's header. this->WriteDSPHeader(fout, libName); @@ -195,15 +194,15 @@ void cmDSPMakefile::WriteDSPFile(std::ostream& fout, std::vector sourceGroups = m_Makefile->GetSourceGroups(); // get the classes from the source lists then add them to the groups - std::vector classes = - m_Makefile->GetClassesFromSourceLists(target.GetSourceLists()); - for(std::vector::iterator i = classes.begin(); + target.GenerateSourceFilesFromSourceLists(*m_Makefile); + std::vector classes = target.GetSourceFiles(); + for(std::vector::iterator i = classes.begin(); i != classes.end(); i++) { - if(!i->m_HeaderFileOnly) + if(!i->IsAHeaderFileOnly()) { // Add the file to the list of sources. - std::string source = i->m_FullPath; + std::string source = i->GetFullPath(); cmSourceGroup& sourceGroup = m_Makefile->FindSourceGroup(source.c_str(), sourceGroups); sourceGroup.AddSource(source.c_str()); diff --git a/Source/cmDSPMakefile.h b/Source/cmDSPMakefile.h index 83a5707..4aac519 100644 --- a/Source/cmDSPMakefile.h +++ b/Source/cmDSPMakefile.h @@ -67,9 +67,9 @@ private: std::string m_DSPFooterTemplate; std::vector m_CreatedProjectNames; - void CreateSingleDSP(const char *lname, const cmTarget &tgt); + void CreateSingleDSP(const char *lname, cmTarget &tgt); void WriteDSPFile(std::ostream& fout, - const char *libName, const cmTarget &tgt); + const char *libName, cmTarget &tgt); void WriteDSPBeginGroup(std::ostream& fout, const char* group, const char* filter); diff --git a/Source/cmDSPWriter.cxx b/Source/cmDSPWriter.cxx index 8c9a62b..74513fc 100644 --- a/Source/cmDSPWriter.cxx +++ b/Source/cmDSPWriter.cxx @@ -87,8 +87,8 @@ void cmDSPMakefile::OutputDSPFile() m_CreatedProjectNames.clear(); // build any targets - const cmTargets &tgts = m_Makefile->GetTargets(); - for(cmTargets::const_iterator l = tgts.begin(); + cmTargets &tgts = m_Makefile->GetTargets(); + for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); l++) { if (l->second.IsALibrary()) @@ -103,8 +103,7 @@ void cmDSPMakefile::OutputDSPFile() } } -void cmDSPMakefile::CreateSingleDSP(const char *lname, - const cmTarget &target) +void cmDSPMakefile::CreateSingleDSP(const char *lname, cmTarget &target) { std::string fname; fname = m_Makefile->GetStartOutputDirectory(); @@ -186,7 +185,7 @@ void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup) void cmDSPMakefile::WriteDSPFile(std::ostream& fout, const char *libName, - const cmTarget &target) + cmTarget &target) { // Write the DSP file's header. this->WriteDSPHeader(fout, libName); @@ -195,15 +194,15 @@ void cmDSPMakefile::WriteDSPFile(std::ostream& fout, std::vector sourceGroups = m_Makefile->GetSourceGroups(); // get the classes from the source lists then add them to the groups - std::vector classes = - m_Makefile->GetClassesFromSourceLists(target.GetSourceLists()); - for(std::vector::iterator i = classes.begin(); + target.GenerateSourceFilesFromSourceLists(*m_Makefile); + std::vector classes = target.GetSourceFiles(); + for(std::vector::iterator i = classes.begin(); i != classes.end(); i++) { - if(!i->m_HeaderFileOnly) + if(!i->IsAHeaderFileOnly()) { // Add the file to the list of sources. - std::string source = i->m_FullPath; + std::string source = i->GetFullPath(); cmSourceGroup& sourceGroup = m_Makefile->FindSourceGroup(source.c_str(), sourceGroups); sourceGroup.AddSource(source.c_str()); diff --git a/Source/cmDSPWriter.h b/Source/cmDSPWriter.h index 83a5707..4aac519 100644 --- a/Source/cmDSPWriter.h +++ b/Source/cmDSPWriter.h @@ -67,9 +67,9 @@ private: std::string m_DSPFooterTemplate; std::vector m_CreatedProjectNames; - void CreateSingleDSP(const char *lname, const cmTarget &tgt); + void CreateSingleDSP(const char *lname, cmTarget &tgt); void WriteDSPFile(std::ostream& fout, - const char *libName, const cmTarget &tgt); + const char *libName, cmTarget &tgt); void WriteDSPBeginGroup(std::ostream& fout, const char* group, const char* filter); diff --git a/Source/cmMakeDepend.cxx b/Source/cmMakeDepend.cxx index 68cbe73..a3ad203 100644 --- a/Source/cmMakeDepend.cxx +++ b/Source/cmMakeDepend.cxx @@ -54,20 +54,23 @@ void cmMakeDepend::SetMakefile(cmMakefile* makefile) { this->AddSearchPath(j->c_str()); } + // Now create cmDependInformation objects for files in the directory - cmMakefile::ClassMap &Classes = m_Makefile->GetClasses(); - for(cmMakefile::ClassMap::iterator l = Classes.begin(); - l != Classes.end(); l++) + cmTargets &tgts = m_Makefile->GetTargets(); + for(cmTargets::iterator l = tgts.begin(); + l != tgts.end(); l++) { - for(std::vector::iterator i = l->second.begin(); - i != l->second.end(); ++i) + l->second.GenerateSourceFilesFromSourceLists(*m_Makefile); + std::vector &classes = l->second.GetSourceFiles(); + for(std::vector::iterator i = classes.begin(); + i != classes.end(); ++i) { - if(!i->m_HeaderFileOnly) + if(!i->GetIsAHeaderFileOnly()) { cmDependInformation* info = new cmDependInformation; - info->m_FullPath = this->FullPath(i->m_FullPath.c_str()); + info->m_FullPath = this->FullPath(i->GetFullPath().c_str()); this->AddFileToSearchPath(info->m_FullPath.c_str()); - info->m_IncludeName = i->m_FullPath; + info->m_IncludeName = i->GetFullPath(); info->m_ClassFileIndex = &*i; m_DependInformation.push_back(info); } @@ -101,11 +104,11 @@ void cmMakeDepend::DoDepends() // find the class if(info->m_ClassFileIndex != 0) { - cmClassFile& cfile = *(info->m_ClassFileIndex); + cmSourceFile& cfile = *(info->m_ClassFileIndex); for( cmDependInformation::IndexSet::const_iterator indx = info->m_IndexSet.begin(); indx != info->m_IndexSet.end(); ++indx) { - cfile.m_Depends.push_back(m_DependInformation[*indx]->m_FullPath); + cfile.GetDepends().push_back(m_DependInformation[*indx]->m_FullPath); } } } @@ -128,8 +131,9 @@ void cmMakeDepend::Depend(cmDependInformation* info) // exist since we can find the dependencies for real. if(info->m_ClassFileIndex != 0) { - cmClassFile& cFile = *(info->m_ClassFileIndex); - cFile.m_Depends.erase(cFile.m_Depends.begin(), cFile.m_Depends.end()); + cmSourceFile& cFile = *(info->m_ClassFileIndex); + cFile.GetDepends().erase(cFile.GetDepends().begin(), + cFile.GetDepends().end()); } // Use the real file to find its dependencies. @@ -143,22 +147,24 @@ void cmMakeDepend::Depend(cmDependInformation* info) if(info->m_ClassFileIndex != 0) { // Get the cmClassFile corresponding to this. - cmClassFile& cFile = *(info->m_ClassFileIndex); + cmSourceFile& cFile = *(info->m_ClassFileIndex); // See if there are any hints for finding dependencies for the missing // file. - if(!cFile.m_Depends.empty()) + if(!cFile.GetDepends().empty()) { // Initial dependencies have been given. Use them to begin the // recursion. for(std::vector::iterator file = - cFile.m_Depends.begin(); file != cFile.m_Depends.end(); ++file) + cFile.GetDepends().begin(); file != cFile.GetDepends().end(); + ++file) { this->AddDependency(info, file->c_str()); } // Erase the dependency hints from the cmClassFile. They will be // put in again as real dependencies later. - cFile.m_Depends.erase(cFile.m_Depends.begin(), cFile.m_Depends.end()); + cFile.GetDepends().erase(cFile.GetDepends().begin(), + cFile.GetDepends().end()); // Found dependency information. We are done. return; diff --git a/Source/cmMakeDepend.h b/Source/cmMakeDepend.h index cb5a9d7..4241670 100644 --- a/Source/cmMakeDepend.h +++ b/Source/cmMakeDepend.h @@ -17,7 +17,7 @@ #define cmMakeDepend_h #include "cmMakefile.h" -#include "cmClassFile.h" +#include "cmSourceFile.h" #include "cmRegularExpression.h" #include "cmStandardIncludes.h" @@ -60,7 +60,7 @@ struct cmDependInformation * The index into the cmMakefile::m_Classes list. * The index value of 0 indicates that it is not in the list. */ - cmClassFile *m_ClassFileIndex; + cmSourceFile *m_ClassFileIndex; /** * This flag indicates whether dependency checking has been diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index eca4f39..4ffa433 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -16,7 +16,7 @@ #include "cmMakefile.h" #include "cmCommand.h" #include "cmStandardIncludes.h" -#include "cmClassFile.h" +#include "cmSourceFile.h" #include "cmDirectory.h" #include "cmSystemTools.h" #include "cmMakefileGenerator.h" @@ -92,11 +92,11 @@ void cmMakefile::Print() const { // print the class lists std::cout << "classes:\n"; - for(ClassMap::const_iterator l = m_Classes.begin(); - l != m_Classes.end(); l++) + for(SourceMap::const_iterator l = m_Sources.begin(); + l != m_Sources.end(); l++) { std::cout << " Class list named: " << l->first << std::endl; - for(std::vector::const_iterator i = l->second.begin(); + for(std::vector::const_iterator i = l->second.begin(); i != l->second.end(); i++) { i->Print(); @@ -240,19 +240,19 @@ bool cmMakefile::ReadListFile(const char* filename) -cmClassFile *cmMakefile::GetClass(const char *srclist, const char *cname) +cmSourceFile *cmMakefile::GetSource(const char *srclist, const char *cname) { - ClassMap::iterator sl = m_Classes.find(srclist); + SourceMap::iterator sl = m_Sources.find(srclist); // find the src list - if (sl == m_Classes.end()) + if (sl == m_Sources.end()) { return 0; } // find the class - for (std::vector::iterator i = sl->second.begin(); + for (std::vector::iterator i = sl->second.begin(); i != sl->second.end(); ++i) { - if (i->m_ClassName == cname) + if (i->GetSourceName() == cname) { return &(*i); } @@ -291,9 +291,9 @@ void cmMakefile::GenerateMakefile() m_MakefileGenerator->GenerateMakefile(); } -void cmMakefile::AddClass(cmClassFile& cmfile, const char *srclist) +void cmMakefile::AddSource(cmSourceFile& cmfile, const char *srclist) { - m_Classes[srclist].push_back(cmfile); + m_Sources[srclist].push_back(cmfile); } void cmMakefile::AddCustomCommand(const char* source, @@ -661,38 +661,6 @@ cmMakefile::FindSourceGroup(const char* source, return groups.front(); } -// take srclists and put all the classes into a vector -std::vector -cmMakefile::GetClassesFromSourceLists( - const std::vector &srcLists) -{ - std::vector result; - - // for each src lists add the classes - for (std::vector::const_iterator s = srcLists.begin(); - s != srcLists.end(); ++s) - { - // replace any variables - std::string temps = *s; - this->ExpandVariablesInString(temps); - // look for a srclist - if (m_Classes.find(temps) != m_Classes.end()) - { - const std::vector &clsList = - m_Classes.find(temps)->second; - result.insert(result.end(), clsList.begin(), clsList.end()); - } - // if one wasn't found then assume it is a single class - else - { - cmClassFile file; - file.m_AbstractClass = false; - file.SetName(temps.c_str(), this->GetCurrentDirectory()); - result.push_back(file); - } - } - return result; -} bool cmMakefile::IsFunctionBlocked(const char *name, std::vector &args) const diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index ffcbd01..221bd24 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -17,7 +17,7 @@ #define cmMakefile_h #include "cmStandardIncludes.h" -#include "cmClassFile.h" +#include "cmSourceFile.h" #include "cmSystemTools.h" #include "cmSourceGroup.h" #include "cmTarget.h" @@ -170,7 +170,7 @@ public: /** * Add a class/source file to the build. */ - void AddClass(cmClassFile& ,const char *srcListName); + void AddSource(cmSourceFile& ,const char *srcListName); /** * Add a source group for consideration when adding a new source. @@ -206,7 +206,7 @@ public: cmSystemTools::ConvertToUnixSlashes(m_cmHomeDirectory); this->AddDefinition("CMAKE_SOURCE_DIR", this->GetHomeDirectory()); } - const char* GetHomeDirectory() + const char* GetHomeDirectory() const { return m_cmHomeDirectory.c_str(); } @@ -216,7 +216,7 @@ public: cmSystemTools::ConvertToUnixSlashes(m_HomeOutputDirectory); this->AddDefinition("CMAKE_BINARY_DIR", this->GetHomeOutputDirectory()); } - const char* GetHomeOutputDirectory() + const char* GetHomeOutputDirectory() const { return m_HomeOutputDirectory.c_str(); } @@ -235,7 +235,7 @@ public: m_cmStartDirectory = dir; cmSystemTools::ConvertToUnixSlashes(m_cmStartDirectory); } - const char* GetStartDirectory() + const char* GetStartDirectory() const { return m_cmStartDirectory.c_str(); } @@ -244,7 +244,7 @@ public: m_StartOutputDirectory = lib; cmSystemTools::ConvertToUnixSlashes(m_StartOutputDirectory); } - const char* GetStartOutputDirectory() + const char* GetStartOutputDirectory() const { return m_StartOutputDirectory.c_str(); } @@ -263,7 +263,7 @@ public: m_cmCurrentDirectory = dir; cmSystemTools::ConvertToUnixSlashes(m_cmCurrentDirectory); } - const char* GetCurrentDirectory() + const char* GetCurrentDirectory() const { return m_cmCurrentDirectory.c_str(); } @@ -272,7 +272,7 @@ public: m_CurrentOutputDirectory = lib; cmSystemTools::ConvertToUnixSlashes(m_CurrentOutputDirectory); } - const char* GetCurrentOutputDirectory() + const char* GetCurrentOutputDirectory() const { return m_CurrentOutputDirectory.c_str(); } @@ -359,16 +359,10 @@ public: /** * Return a list of source files in this makefile. */ - typedef std::map > ClassMap; - ClassMap &GetClasses() {return m_Classes;} - cmClassFile *GetClass(const char *srclist, const char *className); - - - /** - * Return a list of classes in the passed source lists - */ - std::vector GetClassesFromSourceLists( - const std::vector &srcLists); + typedef std::map > SourceMap; + const SourceMap &GetSources() const {return m_Sources;} + SourceMap &GetSources() {return m_Sources;} + cmSourceFile *GetSource(const char *srclist, const char *sourceName); /** * Obtain a list of auxiliary source directories. @@ -460,7 +454,7 @@ protected: // libraries, classes, and executables cmTargets m_Targets; - ClassMap m_Classes; + SourceMap m_Sources; std::vector m_SubDirectories; // list of sub directories std::vector m_MakeVerbatim; // lines copied from input file @@ -489,9 +483,9 @@ private: */ std::string GetParentListFileName(const char *listFileName); - void ReadClasses(std::ifstream& fin, bool t); + void ReadSources(std::ifstream& fin, bool t); friend class cmMakeDepend; // make depend needs direct access - // to the m_Classes array + // to the m_Sources array void PrintStringVector(const char* s, const std::vector& v) const; void AddDefaultCommands(); void AddDefaultDefinitions(); diff --git a/Source/cmOptionCommand.cxx b/Source/cmOptionCommand.cxx index 1ce0d58..92f0468 100644 --- a/Source/cmOptionCommand.cxx +++ b/Source/cmOptionCommand.cxx @@ -35,7 +35,7 @@ bool cmOptionCommand::Invoke(std::vector& args) } else { - m_Makefile->AddDefinition("WRAP_TCL", cacheValue); + m_Makefile->AddDefinition(args[0].c_str(), cacheValue); } return true; diff --git a/Source/cmSourceFile.cxx b/Source/cmSourceFile.cxx new file mode 100644 index 0000000..da642a1 --- /dev/null +++ b/Source/cmSourceFile.cxx @@ -0,0 +1,125 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#include "cmSourceFile.h" +#include "cmStandardIncludes.h" +#include "cmSystemTools.h" + + + +// Set the name of the class and the full path to the file. +// The class must be found in dir and end in name.cxx, name.txx, +// name.c or it will be considered a header file only class +// and not included in the build process +void cmSourceFile::SetName(const char* name, const char* dir) +{ + m_HeaderFileOnly = true; + m_SourceName = name; + std::string pathname = dir; + if(pathname != "") + { + pathname += "/"; + } + + // First try and see whether the listed file can be found + // as is without extensions added on. + pathname += m_SourceName; + std::string hname = pathname; + if(cmSystemTools::FileExists(hname.c_str())) + { + m_HeaderFileOnly = false; + m_FullPath = hname; + return; + } + + // Try various extentions + hname = pathname; + hname += ".cxx"; + if(cmSystemTools::FileExists(hname.c_str())) + { + m_SourceExtension = "cxx"; + m_HeaderFileOnly = false; + m_FullPath = hname; + return; + } + + hname = pathname; + hname += ".c"; + if(cmSystemTools::FileExists(hname.c_str())) + { + m_HeaderFileOnly = false; + m_SourceExtension = "c"; + m_FullPath = hname; + return; + } + hname = pathname; + hname += ".txx"; + if(cmSystemTools::FileExists(hname.c_str())) + { + m_HeaderFileOnly = false; + m_SourceExtension = "txx"; + m_FullPath = hname; + return; + } + hname = pathname; + hname += ".h"; + if(cmSystemTools::FileExists(hname.c_str())) + { + m_SourceExtension = "h"; + m_FullPath = hname; + return; + } + + cmSystemTools::Error("can not find file ", hname.c_str()); + cmSystemTools::Error("Tried .txx .cxx .c for ", hname.c_str()); +} + +void cmSourceFile::SetName(const char* name, const char* dir, const char *ext, + bool hfo) +{ + m_HeaderFileOnly = hfo; + m_SourceName = name; + std::string pathname = dir; + if(pathname != "") + { + pathname += "/"; + } + + pathname += m_SourceName + "." + ext; + m_FullPath = pathname; + m_SourceExtension = ext; + return; +} + +void cmSourceFile::Print() const +{ + if(m_AbstractClass) + { + std::cout << "Abstract "; + } + else + { + std::cout << "Concrete "; + } + if(m_HeaderFileOnly) + { + std::cout << "Header file "; + } + else + { + std::cout << "CXX file "; + } + std::cout << m_SourceName << std::endl; +} diff --git a/Source/cmSourceFile.h b/Source/cmSourceFile.h new file mode 100644 index 0000000..9514361 --- /dev/null +++ b/Source/cmSourceFile.h @@ -0,0 +1,117 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#ifndef cmSourceFile_h +#define cmSourceFile_h + +#include "cmStandardIncludes.h" + +/** \class cmSourceFile + * \brief Represent a class loaded from a makefile. + * + * cmSourceFile is represents a class loaded from + * a makefile. + */ +class cmSourceFile +{ +public: + /** + * Construct instance as a concrete class with both a + * .h and .cxx file. + */ + cmSourceFile() + { + m_AbstractClass = false; + m_HeaderFileOnly = false; + m_WrapExclude = false; + } + + /** + * Set the name of the file, given the directory + * the file should be in. Various extensions are tried on + * the name (e.g., .cxx, .cpp) in the directory to find the actual file. + */ + void SetName(const char* name, const char* dir); + + /** + * Set the name of the file, given the directory the file should be in. IN + * this version the extesion is provided in the call. This is useful for + * generated files that do not exist prior to the build. + */ + void SetName(const char* name, const char* dir, const char *ext, + bool headerFileOnly); + + /** + * Print the structure to std::cout. + */ + void Print() const; + + /** + * Indicate whether the class is abstract (non-instantiable). + */ + bool IsAnAbstractClass() const { return m_AbstractClass; } + bool GetIsAnAbstractClass() const { return m_AbstractClass; } + void SetIsAnAbstractClass(bool f) { m_AbstractClass = f; } + + /** + * Indicate whether the class should not be wrapped + */ + bool GetWrapExclude() const { return m_WrapExclude; } + void SetWrapExclude(bool f) { m_WrapExclude = f; } + + /** + * Indicate whether this class is defined with only the header file. + */ + bool IsAHeaderFileOnly() const { return m_HeaderFileOnly; } + bool GetIsAHeaderFileOnly() const { return m_HeaderFileOnly; } + void SetIsAHeaderFileOnly(bool f) { m_HeaderFileOnly = f; } + + /** + * The full path to the file. + */ + std::string GetFullPath() const {return m_FullPath;} + void SetFullPath(const char *name) {m_FullPath = name;} + + /** + * The file name associated with stripped off directory and extension. + * (In most cases this is the name of the class.) + */ + std::string GetSourceName() const {return m_SourceName;} + void SetSourceName(const char *name) {m_SourceName = name;} + + /** + * The file name associated with stripped off directory and extension. + * (In most cases this is the name of the class.) + */ + std::string GetSourceExtension() const {return m_SourceExtension;} + void SetSourceExtension(const char *name) {m_SourceExtension = name;} + + /** + * Return the vector that holds the list of dependencies + */ + const std::vector &GetDepends() const {return m_Depends;} + std::vector &GetDepends() {return m_Depends;} + +private: + bool m_AbstractClass; + bool m_WrapExclude; + bool m_HeaderFileOnly; + std::string m_FullPath; + std::string m_SourceName; + std::string m_SourceExtension; + std::vector m_Depends; +}; + +#endif diff --git a/Source/cmSourceFilesCommand.cxx b/Source/cmSourceFilesCommand.cxx index 51e6fd1..1bec9a4 100644 --- a/Source/cmSourceFilesCommand.cxx +++ b/Source/cmSourceFilesCommand.cxx @@ -26,10 +26,10 @@ bool cmSourceFilesCommand::Invoke(std::vector& args) for(std::vector::iterator i = (args.begin() + 1); i != args.end(); ++i) { - cmClassFile file; - file.m_AbstractClass = false; + cmSourceFile file; + file.SetIsAnAbstractClass(false); file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory()); - m_Makefile->AddClass(file, args[0].c_str()); + m_Makefile->AddSource(file, args[0].c_str()); } return true; } diff --git a/Source/cmSourceFilesRequireCommand.cxx b/Source/cmSourceFilesRequireCommand.cxx index d52211e..442635c 100644 --- a/Source/cmSourceFilesRequireCommand.cxx +++ b/Source/cmSourceFilesRequireCommand.cxx @@ -18,11 +18,9 @@ // cmSourceFilesRequireCommand bool cmSourceFilesRequireCommand::Invoke(std::vector& args) { - if(args.size() < 4 ) - { - this->SetError("called with incorrect number of arguments"); - return false; - } + this->SetError(" deprecated - use SourceFiles command inside an If block "); + return false; + std::vector::iterator i = args.begin(); // Search to the key word SOURCES_BEGIN is found // if one of the required defines is not there, then @@ -46,10 +44,10 @@ bool cmSourceFilesRequireCommand::Invoke(std::vector& args) ++i; for(; i != args.end(); ++i) { - cmClassFile file; - file.m_AbstractClass = false; + cmSourceFile file; + file.SetIsAnAbstractClass(false); file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory()); - m_Makefile->AddClass(file, sname); + m_Makefile->AddSource(file, sname); } return true; } diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx new file mode 100644 index 0000000..eb9a048 --- /dev/null +++ b/Source/cmTarget.cxx @@ -0,0 +1,44 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#include "cmTarget.h" +#include "cmMakefile.h" + +void cmTarget::GenerateSourceFilesFromSourceLists(const cmMakefile &mf) +{ + // for each src lists add the classes + for (std::vector::const_iterator s = m_SourceLists.begin(); + s != m_SourceLists.end(); ++s) + { + // replace any variables + std::string temps = *s; + mf.ExpandVariablesInString(temps); + // look for a srclist + if (mf.GetSources().find(temps) != mf.GetSources().end()) + { + const std::vector &clsList = + mf.GetSources().find(temps)->second; + m_SourceFiles.insert(m_SourceFiles.end(), clsList.begin(), clsList.end()); + } + // if one wasn't found then assume it is a single class + else + { + cmSourceFile file; + file.SetIsAnAbstractClass(false); + file.SetName(temps.c_str(), mf.GetCurrentDirectory()); + m_SourceFiles.push_back(file); + } + } +} diff --git a/Source/cmTarget.h b/Source/cmTarget.h index d72ec18..9fa1608 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -18,6 +18,7 @@ #include "cmStandardIncludes.h" #include "cmCustomCommand.h" +#include "cmSourceFile.h" /** \class cmTarget * \brief Represent a library or executable target loaded from a makefile. @@ -44,13 +45,28 @@ public: /** * Get the list of the source lists used by this target */ - const std::vector &GetSourceLists() const {return m_SourceLists;} + const std::vector &GetSourceLists() const + {return m_SourceLists;} std::vector &GetSourceLists() {return m_SourceLists;} + /** + * Get the list of the source files used by this target + */ + const std::vector &GetSourceFiles() const + {return m_SourceFiles;} + std::vector &GetSourceFiles() {return m_SourceFiles;} + + /** + * Generate the SourceFilesList from the SourceLists. This should only be + * done once to be safe. + */ + void GenerateSourceFilesFromSourceLists(const cmMakefile &mf); + private: std::vector m_CustomCommands; std::vector m_SourceLists; bool m_IsALibrary; + std::vector m_SourceFiles; }; typedef std::map cmTargets; diff --git a/Source/cmUnixDefinesCommand.cxx b/Source/cmUnixDefinesCommand.cxx index d88cf50..db729dd 100644 --- a/Source/cmUnixDefinesCommand.cxx +++ b/Source/cmUnixDefinesCommand.cxx @@ -25,11 +25,9 @@ cmUnixDefinesCommand::cmUnixDefinesCommand() // cmUNIXDefinesCommand bool cmUnixDefinesCommand::Invoke(std::vector& args) { - if(args.size() < 1 ) - { - this->SetError("called with incorrect number of arguments"); - return false; - } + this->SetError(" deprecated - use AddDefinitions inside an If block "); + return false; + for(std::vector::iterator i = args.begin(); i != args.end(); ++i) { diff --git a/Source/cmUnixLibrariesCommand.cxx b/Source/cmUnixLibrariesCommand.cxx index a32529c..3241167 100644 --- a/Source/cmUnixLibrariesCommand.cxx +++ b/Source/cmUnixLibrariesCommand.cxx @@ -25,11 +25,9 @@ cmUnixLibrariesCommand::cmUnixLibrariesCommand() // cmUnixLibrariesCommand bool cmUnixLibrariesCommand::Invoke(std::vector& args) { - if(args.size() < 1 ) - { - this->SetError("called with incorrect number of arguments"); - return false; - } + this->SetError(" deprecated - use LIBRARY command inside an IF block "); + return false; + for(std::vector::iterator i = args.begin(); i != args.end(); ++i) { diff --git a/Source/cmUnixMakefileGenerator.cxx b/Source/cmUnixMakefileGenerator.cxx index 6575b58..72dedfd 100644 --- a/Source/cmUnixMakefileGenerator.cxx +++ b/Source/cmUnixMakefileGenerator.cxx @@ -94,38 +94,18 @@ void cmUnixMakefileGenerator::OutputTargetRules(std::ostream& fout) for(cmTargets::const_iterator l = tgts.begin(); l != tgts.end(); l++) { - std::vector classes = - m_Makefile->GetClassesFromSourceLists(l->second.GetSourceLists()); + std::vector classes = l->second.GetSourceFiles(); fout << l->first << "_SRC_OBJS = "; - for(std::vector::iterator i = classes.begin(); + for(std::vector::iterator i = classes.begin(); i != classes.end(); i++) { - if(!i->m_HeaderFileOnly) + if(!i->IsAHeaderFileOnly()) { - fout << "\\\n" << i->m_ClassName << ".o "; + fout << "\\\n" << i->GetSourceName() << ".o "; } } fout << "\n\n"; } - - // get the classes from the source lists then add them to the SRC_OBJ list - fout << "SRC_OBJ = "; - for(cmTargets::const_iterator l = tgts.begin(); - l != tgts.end(); l++) - { - std::vector classes = - m_Makefile->GetClassesFromSourceLists(l->second.GetSourceLists()); - for(std::vector::iterator i = classes.begin(); - i != classes.end(); i++) - { - if(!i->m_HeaderFileOnly) - { - fout << "\\\n" << i->m_ClassName << ".o "; - } - } - } - fout << "\n\n"; - } @@ -404,23 +384,23 @@ void cmUnixMakefileGenerator::OutputSubDirectoryRules(std::ostream& fout) // by the class cmMakeDepend GenerateMakefile void cmUnixMakefileGenerator::OutputObjectDepends(std::ostream& fout) { - cmMakefile::ClassMap &Classes = m_Makefile->GetClasses(); - for(cmMakefile::ClassMap::iterator l = Classes.begin(); - l != Classes.end(); l++) + cmMakefile::SourceMap &Sources = m_Makefile->GetSources(); + for(cmMakefile::SourceMap::iterator l = Sources.begin(); + l != Sources.end(); l++) { - for(std::vector::iterator i = l->second.begin(); + for(std::vector::iterator i = l->second.begin(); i != l->second.end(); i++) { - if(!i->m_HeaderFileOnly) + if(!i->IsAHeaderFileOnly()) { - if(i->m_Depends.size()) + if(i->GetDepends().size()) { - fout << i->m_ClassName << ".o : \\\n"; + fout << i->GetSourceName() << ".o : \\\n"; for(std::vector::iterator j = - i->m_Depends.begin(); - j != i->m_Depends.end(); ++j) + i->GetDepends().begin(); + j != i->GetDepends().end(); ++j) { - if(j+1 == i->m_Depends.end()) + if(j+1 == i->GetDepends().end()) { fout << *j << " \n"; } diff --git a/Source/cmVTKWrapPythonCommand.cxx b/Source/cmVTKWrapPythonCommand.cxx new file mode 100644 index 0000000..0a26f8de --- /dev/null +++ b/Source/cmVTKWrapPythonCommand.cxx @@ -0,0 +1,213 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#include "cmVTKWrapPythonCommand.h" + +// cmVTKWrapPythonCommand +bool cmVTKWrapPythonCommand::Invoke(std::vector& args) +{ + if(args.size() < 3 ) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + + // Now check and see if the value has been stored in the cache + // already, if so use that value and don't look for the program + const char* cacheValue + = cmCacheManager::GetInstance()->GetCacheValue("VTK_WRAP_PYTHON"); + if(!cacheValue || !strcmp(cacheValue,"0")) + { + return true; + } + + // add in a depend in the vtkVTKWrapPython executable + m_Makefile->AddUtility("vtkWrapPython"); + + // what is the current source dir + std::string cdir = m_Makefile->GetCurrentDirectory(); + + // keep the library name + m_LibraryName = args[0]; + m_SourceList = args[1]; + + // get the list of classes for this library + cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); + for(std::vector::iterator j = (args.begin() + 2); + j != args.end(); ++j) + { + for(cmMakefile::SourceMap::iterator l = Classes.begin(); + l != Classes.end(); l++) + { + for(std::vector::iterator i = l->second.begin(); + i != l->second.end(); i++) + { + cmSourceFile &curr = *i; + // if we should wrap the class + if (!curr.GetWrapExclude()) + { + cmSourceFile file; + file.SetIsAnAbstractClass(curr.IsAnAbstractClass()); + std::string newName = curr.GetSourceName() + "Python"; + file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + std::string hname = cdir + "/" + curr.GetSourceName() + ".h"; + m_WrapHeaders.push_back(hname); + // add starting depends + file.GetDepends().push_back(hname); + m_WrapClasses.push_back(file); + } + } + } + } + + return true; +} + +void cmVTKWrapPythonCommand::FinalPass() +{ + // first we add the rules for all the .h to Python.cxx files + int lastClass = m_WrapClasses.size(); + std::vector depends; + std::string wpython = "${VTK_WRAP_PYTHON_EXE}"; + std::string hints = "${VTK_WRAP_HINTS}"; + + // Create the init file + std::string res = m_LibraryName; + res += "Init.cxx"; + this->CreateInitFile(res); + + // add the init file + cmSourceFile cfile; + cfile.SetIsAnAbstractClass(false); + std::string newName = m_LibraryName; + newName += "Init"; + cfile.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + m_Makefile->AddSource(cfile,m_SourceList.c_str()); + + // wrap all the .h files + depends.push_back(wpython); + for(int classNum = 0; classNum < lastClass; classNum++) + { + m_Makefile->AddSource(m_WrapClasses[classNum],m_SourceList.c_str()); + std::string res = m_WrapClasses[classNum].GetSourceName() + ".cxx"; + std::string cmd = wpython + " " + m_WrapHeaders[classNum] + " " + + hints + (m_WrapClasses[classNum].IsAnAbstractClass() ? " 0 " : " 1 ") + " > " + m_WrapClasses[classNum].GetSourceName() + ".cxx"; + m_Makefile->AddCustomCommand(m_WrapHeaders[classNum].c_str(), + cmd.c_str(), depends, + res.c_str(), m_LibraryName.c_str()); + } + +} + +bool cmVTKWrapPythonCommand::CreateInitFile(std::string& res) +{ + unsigned int i; + + /* we have to make sure that the name is the correct case */ + std::string kitName = m_LibraryName; + if (kitName[0] > 90) kitName[0] -= 32; + for (i = 1; i < kitName.size(); i++) + { + if ((kitName[i] > 64)&&(kitName[i] < 91)) + { + kitName[i] += 32; + } + } + + std::vector classes; + int lastClass = m_WrapHeaders.size(); + int classNum; + for(classNum = 0; classNum < lastClass; classNum++) + { + if (!m_WrapClasses[classNum].IsAnAbstractClass()) + { + std::string cls = m_WrapHeaders[classNum]; + cls = cls.substr(0,cls.size()-2); + std::string::size_type pos = cls.rfind('/'); + if(pos != std::string::npos) + { + cls = cls.substr(pos+1); + } + classes.push_back(cls); + } + } + + // open the init file + std::string outFileName = + m_Makefile->GetCurrentOutputDirectory(); + outFileName += "/" + res; + + return this->WriteInit(kitName.c_str(), outFileName, classes); +} + + +/* warning this code is also in getclasses.cxx under pcmaker */ +bool cmVTKWrapPythonCommand::WriteInit(const char *kitName, + std::string& outFileName, + std::vector& classes) +{ + unsigned int i; + + FILE *fout = fopen(outFileName.c_str(),"w"); + if (!fout) + { + return false; + } + + fprintf(fout,"#include \n"); + fprintf(fout,"#include \"Python.h\"\n\n"); + + for (i = 0; i < classes.size(); i++) + { + fprintf(fout,"extern \"C\" {__declspec( dllexport) PyObject *PyVTKClass_%sNew(char *); }\n",classes[i].c_str()); + } + + fprintf(fout,"\nstatic PyMethodDef Py%s_ClassMethods[] = {\n", + kitName); + fprintf(fout,"{NULL, NULL}};\n\n"); + + fprintf(fout,"extern \"C\" {__declspec( dllexport) void init%s();}\n\n",kitName); + + + /* module init function */ + fprintf(fout,"void init%s()\n{\n",kitName); + fprintf(fout," PyObject *m, *d, *c;\n\n"); + fprintf(fout," static char modulename[] = \"%s\";\n",kitName); + fprintf(fout," m = Py_InitModule(modulename, Py%s_ClassMethods);\n", + kitName); + + fprintf(fout," d = PyModule_GetDict(m);\n"); + fprintf(fout," if (!d) Py_FatalError(\"can't get dictionary for module %s!\");\n\n", + kitName); + + for (i = 0; i < classes.size(); i++) + { + fprintf(fout," if ((c = PyVTKClass_%sNew(modulename)))\n", + classes[i].c_str()); + fprintf(fout," if (-1 == PyDict_SetItemString(d, \"%s\", c))\n", + classes[i].c_str()); + fprintf(fout," Py_FatalError(\"can't add class %s to dictionary!\");\n\n", + classes[i].c_str()); + } + fprintf(fout,"}\n\n"); + fclose(fout); + + + return true; +} + + diff --git a/Source/cmVTKWrapPythonCommand.h b/Source/cmVTKWrapPythonCommand.h new file mode 100644 index 0000000..281b0cb --- /dev/null +++ b/Source/cmVTKWrapPythonCommand.h @@ -0,0 +1,82 @@ +#ifndef cmVTKWrapPythonCommand_h +#define cmVTKWrapPythonCommand_h + +#include "cmStandardIncludes.h" +#include "cmCommand.h" + +/** \class cmVTKWrapPythonCommand + * \brief Create Python Language bindings for classes + * + * cmVTKWrapPythonCommand is used to create wrappers for classes into Python + */ +class cmVTKWrapPythonCommand : public cmCommand +{ +public: + /** + * This is a virtual constructor for the command. + */ + virtual cmCommand* Clone() + { + return new cmVTKWrapPythonCommand; + } + + /** + * This is called when the command is first encountered in + * the CMakeLists.txt file. + */ + virtual bool Invoke(std::vector& args); + + /** + * This is called at the end after all the information + * specified by the command is accumulated. Most commands do + * not implement this method. At this point, reading and + * writing to the cache can be done. + */ + virtual void FinalPass(); + + /** + * This determines if the command gets propagated down + * to makefiles located in subdirectories. + */ + virtual bool IsInherited() + {return true;} + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() { return "VTK_WRAP_PYTHON";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Create Python Wrappers."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() + { + return + "VTK_WRAP_PYTHON(resultingLibraryName SourceListName SourceLists ...)"; + } + + /** + * Helper methods + */ + virtual bool CreateInitFile(std::string &name); + virtual bool WriteInit(const char *kitName, std::string& outFileName, + std::vector& classes); + +private: + std::vector m_WrapClasses; + std::vector m_WrapHeaders; + std::string m_LibraryName; + std::string m_SourceList; +}; + + + +#endif diff --git a/Source/cmVTKWrapTclCommand.cxx b/Source/cmVTKWrapTclCommand.cxx new file mode 100644 index 0000000..ec6471c --- /dev/null +++ b/Source/cmVTKWrapTclCommand.cxx @@ -0,0 +1,240 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) 2000 National Library of Medicine + All rights reserved. + + See COPYRIGHT.txt for copyright details. + +=========================================================================*/ +#include "cmVTKWrapTclCommand.h" + +// cmVTKWrapTclCommand +bool cmVTKWrapTclCommand::Invoke(std::vector& args) +{ + if(args.size() < 3 ) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + + // Now check and see if the value has been stored in the cache + // already, if so use that value and don't look for the program + if(!cmCacheManager::GetInstance()->IsOn("VTK_WRAP_TCL")) + { + return true; + } + + // add in a depend in the vtkVTKWrapTcl executable + m_Makefile->AddUtility("vtkWrapTcl"); + + // what is the current source dir + std::string cdir = m_Makefile->GetCurrentDirectory(); + + // keep the library name + m_LibraryName = args[0]; + m_SourceList = args[1]; + + // get the list of classes for this library + cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); + for(std::vector::iterator j = (args.begin() + 2); + j != args.end(); ++j) + { + for(cmMakefile::SourceMap::iterator l = Classes.begin(); + l != Classes.end(); l++) + { + for(std::vector::iterator i = l->second.begin(); + i != l->second.end(); i++) + { + cmSourceFile &curr = *i; + // if we should wrap the class + if (!curr.GetWrapExclude()) + { + cmSourceFile file; + file.SetIsAnAbstractClass(curr.IsAnAbstractClass()); + std::string newName = curr.GetSourceName() + "Tcl"; + file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + std::string hname = cdir + "/" + curr.GetSourceName() + ".h"; + m_WrapHeaders.push_back(hname); + // add starting depends + file.GetDepends().push_back(hname); + m_WrapClasses.push_back(file); + } + } + } + } + + return true; +} + +void cmVTKWrapTclCommand::FinalPass() +{ + // first we add the rules for all the .h to Tcl.cxx files + int lastClass = m_WrapClasses.size(); + std::vector depends; + std::string wtcl = "${VTK_WRAP_TCL_EXE}"; + std::string hints = "${VTK_WRAP_HINTS}"; + + // Create the init file + std::string res = m_LibraryName; + res += "Init.cxx"; + this->CreateInitFile(res); + + // add the init file + cmSourceFile cfile; + cfile.SetIsAnAbstractClass(false); + std::string newName = m_LibraryName; + newName += "Init"; + cfile.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + m_Makefile->AddSource(cfile,m_SourceList.c_str()); + + // wrap all the .h files + depends.push_back(wtcl); + for(int classNum = 0; classNum < lastClass; classNum++) + { + m_Makefile->AddSource(m_WrapClasses[classNum],m_SourceList.c_str()); + std::string res = m_WrapClasses[classNum].GetSourceName() + ".cxx"; + std::string cmd = wtcl + " " + m_WrapHeaders[classNum] + " " + + hints + (m_WrapClasses[classNum].IsAnAbstractClass() ? " 0 " : " 1 ") + " > " + m_WrapClasses[classNum].GetSourceName() + ".cxx"; + m_Makefile->AddCustomCommand(m_WrapHeaders[classNum].c_str(), + cmd.c_str(), depends, + res.c_str(), m_LibraryName.c_str()); + } + +} + +bool cmVTKWrapTclCommand::CreateInitFile(std::string& res) +{ + unsigned int i; + + /* we have to make sure that the name is the correct case */ + std::string kitName = m_LibraryName; + if (kitName[0] > 90) kitName[0] -= 32; + for (i = 1; i < kitName.size(); i++) + { + if ((kitName[i] > 64)&&(kitName[i] < 91)) + { + kitName[i] += 32; + } + } + + std::vector classes; + int lastClass = m_WrapHeaders.size(); + int classNum; + for(classNum = 0; classNum < lastClass; classNum++) + { + if (!m_WrapClasses[classNum].IsAnAbstractClass()) + { + std::string cls = m_WrapHeaders[classNum]; + cls = cls.substr(0,cls.size()-2); + std::string::size_type pos = cls.rfind('/'); + if(pos != std::string::npos) + { + cls = cls.substr(pos+1); + } + classes.push_back(cls); + } + } + + // open the init file + std::string outFileName = + m_Makefile->GetCurrentOutputDirectory(); + outFileName += "/" + res; + + return this->WriteInit(kitName.c_str(), outFileName, classes); +} + + +/* warning this code is also in getclasses.cxx under pcmaker */ +bool cmVTKWrapTclCommand::WriteInit(const char *kitName, + std::string& outFileName, + std::vector& classes) +{ + unsigned int i; + FILE *fout = fopen(outFileName.c_str(),"w"); + if (!fout) + { + return false; + } + + fprintf(fout,"#include \"vtkTclUtil.h\"\n"); + + for (i = 0; i < classes.size(); i++) + { + fprintf(fout,"int %sCommand(ClientData cd, Tcl_Interp *interp,\n int argc, char *argv[]);\n",classes[i].c_str()); + fprintf(fout,"ClientData %sNewCommand();\n",classes[i].c_str()); + } + + if (!strcmp(kitName,"Vtkcommon")) + { + fprintf(fout,"int vtkCommand(ClientData cd, Tcl_Interp *interp,\n int argc, char *argv[]);\n"); + fprintf(fout,"\nTcl_HashTable vtkInstanceLookup;\n"); + fprintf(fout,"Tcl_HashTable vtkPointerLookup;\n"); + fprintf(fout,"Tcl_HashTable vtkCommandLookup;\n"); + } + else + { + fprintf(fout,"\nextern Tcl_HashTable vtkInstanceLookup;\n"); + fprintf(fout,"extern Tcl_HashTable vtkPointerLookup;\n"); + fprintf(fout,"extern Tcl_HashTable vtkCommandLookup;\n"); + } + fprintf(fout,"extern void vtkTclDeleteObjectFromHash(void *);\n"); + fprintf(fout,"extern void vtkTclListInstances(Tcl_Interp *interp, ClientData arg);\n"); + + fprintf(fout,"\n\nextern \"C\" {int VTK_EXPORT %s_SafeInit(Tcl_Interp *interp);}\n\n", + kitName); + fprintf(fout,"\n\nextern \"C\" {int VTK_EXPORT %s_Init(Tcl_Interp *interp);}\n\n", + kitName); + + /* create an extern ref to the generic delete function */ + fprintf(fout,"\n\nextern void vtkTclGenericDeleteObject(ClientData cd);\n\n"); + + /* the main declaration */ + fprintf(fout,"\n\nint VTK_EXPORT %s_SafeInit(Tcl_Interp *interp)\n{\n",kitName); + fprintf(fout," return %s_Init(interp);\n}\n",kitName); + + fprintf(fout,"\n\nint VTK_EXPORT %s_Init(Tcl_Interp *interp)\n{\n", + kitName); + if (!strcmp(kitName,"Vtkcommon")) + { + fprintf(fout, + " vtkTclInterpStruct *info = new vtkTclInterpStruct;\n"); + fprintf(fout, + " info->Number = 0; info->InDelete = 0; info->DebugOn = 0;\n"); + fprintf(fout,"\n"); + fprintf(fout,"\n"); + fprintf(fout, + " Tcl_InitHashTable(&info->InstanceLookup, TCL_STRING_KEYS);\n"); + fprintf(fout, + " Tcl_InitHashTable(&info->PointerLookup, TCL_STRING_KEYS);\n"); + fprintf(fout, + " Tcl_InitHashTable(&info->CommandLookup, TCL_STRING_KEYS);\n"); + fprintf(fout, + " Tcl_SetAssocData(interp,(char *) \"vtk\",NULL,(ClientData *)info);\n"); + + /* create special vtkCommand command */ + fprintf(fout," Tcl_CreateCommand(interp,(char *) \"vtkCommand\",vtkCommand,\n (ClientData *)NULL, NULL);\n\n"); + } + + for (i = 0; i < classes.size(); i++) + { + fprintf(fout," vtkTclCreateNew(interp,(char *) \"%s\", %sNewCommand,\n", + classes[i].c_str(), classes[i].c_str()); + fprintf(fout," %sCommand);\n",classes[i].c_str()); + } + + fprintf(fout," return TCL_OK;\n}\n"); + fclose(fout); + + return true; +} + + diff --git a/Source/cmVTKWrapTclCommand.h b/Source/cmVTKWrapTclCommand.h new file mode 100644 index 0000000..a13025a --- /dev/null +++ b/Source/cmVTKWrapTclCommand.h @@ -0,0 +1,83 @@ +#ifndef cmVTKWrapTclCommand_h +#define cmVTKWrapTclCommand_h + +#include "cmStandardIncludes.h" +#include "cmCommand.h" + +/** \class cmVTKWrapTclCommand + * \brief Define a command that searches for an include file. + * + * cmVTKWrapTclCommand is used to define a CMake variable include + * path location by specifying a file and list of directories. + */ +class cmVTKWrapTclCommand : public cmCommand +{ +public: + /** + * This is a virtual constructor for the command. + */ + virtual cmCommand* Clone() + { + return new cmVTKWrapTclCommand; + } + + /** + * This is called when the command is first encountered in + * the CMakeLists.txt file. + */ + virtual bool Invoke(std::vector& args); + + /** + * This is called at the end after all the information + * specified by the command is accumulated. Most commands do + * not implement this method. At this point, reading and + * writing to the cache can be done. + */ + virtual void FinalPass(); + + /** + * This determines if the command gets propagated down + * to makefiles located in subdirectories. + */ + virtual bool IsInherited() + {return true;} + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() { return "VTK_WRAP_TCL";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Create Tcl Wrappers for VTK classes."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() + { + return + "VTK_WRAP_TCL(resultingLibraryName SourceListName SourceLists ...)"; + } + + /** + * Helper methods + */ + virtual bool CreateInitFile(std::string &name); + virtual bool WriteInit(const char *kitName, std::string& outFileName, + std::vector& classes); + +private: + std::vector m_WrapClasses; + std::vector m_WrapHeaders; + std::string m_LibraryName; + std::string m_SourceList; +}; + + + +#endif diff --git a/Source/cmWin32DefinesCommand.cxx b/Source/cmWin32DefinesCommand.cxx index 4821b86..c265b1e 100644 --- a/Source/cmWin32DefinesCommand.cxx +++ b/Source/cmWin32DefinesCommand.cxx @@ -25,11 +25,9 @@ cmWin32DefinesCommand::cmWin32DefinesCommand() // cmWin32DefinesCommand bool cmWin32DefinesCommand::Invoke(std::vector& args) { - if(args.size() < 1 ) - { - this->SetError("called with incorrect number of arguments"); - return false; - } + this->SetError(" deprecated - use AddDefinitions inside an If block "); + return false; + for(std::vector::iterator i = args.begin(); i != args.end(); ++i) { diff --git a/Source/cmWin32IncludeDirectoryCommand.cxx b/Source/cmWin32IncludeDirectoryCommand.cxx index c595893..bf08aa2 100644 --- a/Source/cmWin32IncludeDirectoryCommand.cxx +++ b/Source/cmWin32IncludeDirectoryCommand.cxx @@ -27,11 +27,9 @@ cmWin32IncludeDirectoryCommand::cmWin32IncludeDirectoryCommand() bool cmWin32IncludeDirectoryCommand::Invoke(std::vector& args) { - if(args.size() < 1 ) - { - this->SetError("called with incorrect number of arguments"); - return false; - } + this->SetError(" deprecated - use INCLUDE_DIRECTORIES command inside an if block "); + return false; + for(std::vector::iterator i = args.begin(); i != args.end(); ++i) { diff --git a/Source/cmWin32LibrariesCommand.cxx b/Source/cmWin32LibrariesCommand.cxx index a3e02b1..2263b04 100644 --- a/Source/cmWin32LibrariesCommand.cxx +++ b/Source/cmWin32LibrariesCommand.cxx @@ -26,11 +26,9 @@ cmWin32LibrariesCommand::cmWin32LibrariesCommand() // cmWin32LibrariesCommand bool cmWin32LibrariesCommand::Invoke(std::vector& args) { - if(args.size() < 1 ) - { - this->SetError("Called with incorrect number of arguments"); - return false; - } + this->SetError(" deprecated - use LIBRARY command inside an IF block "); + return false; + for(std::vector::iterator i = args.begin(); i != args.end(); ++i) { diff --git a/Source/cmWrapExcludeFilesCommand.cxx b/Source/cmWrapExcludeFilesCommand.cxx index a0cab29..1f2ed84 100644 --- a/Source/cmWrapExcludeFilesCommand.cxx +++ b/Source/cmWrapExcludeFilesCommand.cxx @@ -24,19 +24,19 @@ bool cmWrapExcludeFilesCommand::Invoke(std::vector& args) return false; } - cmMakefile::ClassMap &Classes = m_Makefile->GetClasses(); + cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); for(std::vector::iterator j = args.begin(); j != args.end(); ++j) { - for(cmMakefile::ClassMap::iterator l = Classes.begin(); + for(cmMakefile::SourceMap::iterator l = Classes.begin(); l != Classes.end(); l++) { - for(std::vector::iterator i = l->second.begin(); + for(std::vector::iterator i = l->second.begin(); i != l->second.end(); i++) { - if(i->m_ClassName == (*j)) + if(i->GetSourceName() == (*j)) { - i->m_WrapExclude = true; + i->SetWrapExclude(true); } } } diff --git a/Source/cmWrapTclCommand.cxx b/Source/cmWrapTclCommand.cxx deleted file mode 100644 index 063fd8e..0000000 --- a/Source/cmWrapTclCommand.cxx +++ /dev/null @@ -1,239 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile$ - Language: C++ - Date: $Date$ - Version: $Revision$ - - - Copyright (c) 2000 National Library of Medicine - All rights reserved. - - See COPYRIGHT.txt for copyright details. - -=========================================================================*/ -#include "cmWrapTclCommand.h" - -// cmWrapTclCommand -bool cmWrapTclCommand::Invoke(std::vector& args) -{ - if(args.size() < 3 ) - { - this->SetError("called with incorrect number of arguments"); - return false; - } - - // Now check and see if the value has been stored in the cache - // already, if so use that value and don't look for the program - if(!cmCacheManager::GetInstance()->IsOn("WRAP_TCL")) - { - return true; - } - - // add in a depend in the vtkWrapTcl executable - m_Makefile->AddUtility("vtkWrapTcl"); - - // what is the current source dir - std::string cdir = m_Makefile->GetCurrentDirectory(); - - // keep the library name - m_LibraryName = args[0]; - m_SourceList = args[1]; - - // get the list of classes for this library - cmMakefile::ClassMap &Classes = m_Makefile->GetClasses(); - for(std::vector::iterator j = (args.begin() + 2); - j != args.end(); ++j) - { - for(cmMakefile::ClassMap::iterator l = Classes.begin(); - l != Classes.end(); l++) - { - for(std::vector::iterator i = l->second.begin(); - i != l->second.end(); i++) - { - cmClassFile &curr = *i; - // if we should wrap the class - if (!curr.m_WrapExclude) - { - cmClassFile file; - file.m_AbstractClass = curr.m_AbstractClass; - std::string newName = curr.m_ClassName + "Tcl"; - file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), - "cxx",false); - std::string hname = cdir + "/" + curr.m_ClassName + ".h"; - m_WrapHeaders.push_back(hname); - // add starting depends - file.m_Depends.push_back(hname); - m_WrapClasses.push_back(file); - } - } - } - } - - return true; -} - -void cmWrapTclCommand::FinalPass() -{ - // first we add the rules for all the .h to Tcl.cxx files - int lastClass = m_WrapClasses.size(); - std::vector depends; - std::string wtcl = "${WRAP_TCL_EXE}"; - std::string hints = "${WRAP_HINTS}"; - - // Create the init file - std::string res = m_LibraryName; - res += "Init.cxx"; - this->CreateInitFile(res); - - // add the init file - cmClassFile cfile; - cfile.m_AbstractClass = false; - std::string newName = m_LibraryName; - newName += "Init"; - cfile.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), - "cxx",false); - m_Makefile->AddClass(cfile,m_SourceList.c_str()); - - // wrap all the .h files - depends.push_back(wtcl); - for(int classNum = 0; classNum < lastClass; classNum++) - { - m_Makefile->AddClass(m_WrapClasses[classNum],m_SourceList.c_str()); - std::string res = m_WrapClasses[classNum].m_ClassName + ".cxx"; - std::string cmd = wtcl + " " + m_WrapHeaders[classNum] + " " - + hints + (m_WrapClasses[classNum].m_AbstractClass ? " 0 " : " 1 ") + " > " + m_WrapClasses[classNum].m_ClassName + ".cxx"; - m_Makefile->AddCustomCommand(m_WrapHeaders[classNum].c_str(), - cmd.c_str(), depends, - res.c_str(), m_LibraryName.c_str()); - } - -} - -bool cmWrapTclCommand::CreateInitFile(std::string& res) -{ - unsigned int i; - - /* we have to make sure that the name is the correct case */ - std::string kitName = m_LibraryName; - if (kitName[0] > 90) kitName[0] -= 32; - for (i = 1; i < kitName.size(); i++) - { - if ((kitName[i] > 64)&&(kitName[i] < 91)) - { - kitName[i] += 32; - } - } - - std::vector classes; - int lastClass = m_WrapHeaders.size(); - int classNum; - for(classNum = 0; classNum < lastClass; classNum++) - { - if (!m_WrapClasses[classNum].m_AbstractClass) - { - std::string cls = m_WrapHeaders[classNum]; - cls = cls.substr(0,cls.size()-2); - std::string::size_type pos = cls.rfind('/'); - if(pos != std::string::npos) - { - cls = cls.substr(pos+1); - } - classes.push_back(cls); - } - } - - // open the init file - std::string outFileName = - m_Makefile->GetCurrentOutputDirectory(); - outFileName += "/" + res; - - return this->WriteInit(kitName.c_str(), outFileName, classes); -} - - -/* warning this code is also in getclasses.cxx under pcmaker */ -bool cmWrapTclCommand::WriteInit(const char *kitName, std::string& outFileName, - std::vector& classes) -{ - unsigned int i; - FILE *fout = fopen(outFileName.c_str(),"w"); - if (!fout) - { - return false; - } - - fprintf(fout,"#include \"vtkTclUtil.h\"\n"); - - for (i = 0; i < classes.size(); i++) - { - fprintf(fout,"int %sCommand(ClientData cd, Tcl_Interp *interp,\n int argc, char *argv[]);\n",classes[i].c_str()); - fprintf(fout,"ClientData %sNewCommand();\n",classes[i].c_str()); - } - - if (!strcmp(kitName,"Vtkcommon")) - { - fprintf(fout,"int vtkCommand(ClientData cd, Tcl_Interp *interp,\n int argc, char *argv[]);\n"); - fprintf(fout,"\nTcl_HashTable vtkInstanceLookup;\n"); - fprintf(fout,"Tcl_HashTable vtkPointerLookup;\n"); - fprintf(fout,"Tcl_HashTable vtkCommandLookup;\n"); - } - else - { - fprintf(fout,"\nextern Tcl_HashTable vtkInstanceLookup;\n"); - fprintf(fout,"extern Tcl_HashTable vtkPointerLookup;\n"); - fprintf(fout,"extern Tcl_HashTable vtkCommandLookup;\n"); - } - fprintf(fout,"extern void vtkTclDeleteObjectFromHash(void *);\n"); - fprintf(fout,"extern void vtkTclListInstances(Tcl_Interp *interp, ClientData arg);\n"); - - fprintf(fout,"\n\nextern \"C\" {int VTK_EXPORT %s_SafeInit(Tcl_Interp *interp);}\n\n", - kitName); - fprintf(fout,"\n\nextern \"C\" {int VTK_EXPORT %s_Init(Tcl_Interp *interp);}\n\n", - kitName); - - /* create an extern ref to the generic delete function */ - fprintf(fout,"\n\nextern void vtkTclGenericDeleteObject(ClientData cd);\n\n"); - - /* the main declaration */ - fprintf(fout,"\n\nint VTK_EXPORT %s_SafeInit(Tcl_Interp *interp)\n{\n",kitName); - fprintf(fout," return %s_Init(interp);\n}\n",kitName); - - fprintf(fout,"\n\nint VTK_EXPORT %s_Init(Tcl_Interp *interp)\n{\n", - kitName); - if (!strcmp(kitName,"Vtkcommon")) - { - fprintf(fout, - " vtkTclInterpStruct *info = new vtkTclInterpStruct;\n"); - fprintf(fout, - " info->Number = 0; info->InDelete = 0; info->DebugOn = 0;\n"); - fprintf(fout,"\n"); - fprintf(fout,"\n"); - fprintf(fout, - " Tcl_InitHashTable(&info->InstanceLookup, TCL_STRING_KEYS);\n"); - fprintf(fout, - " Tcl_InitHashTable(&info->PointerLookup, TCL_STRING_KEYS);\n"); - fprintf(fout, - " Tcl_InitHashTable(&info->CommandLookup, TCL_STRING_KEYS);\n"); - fprintf(fout, - " Tcl_SetAssocData(interp,(char *) \"vtk\",NULL,(ClientData *)info);\n"); - - /* create special vtkCommand command */ - fprintf(fout," Tcl_CreateCommand(interp,(char *) \"vtkCommand\",vtkCommand,\n (ClientData *)NULL, NULL);\n\n"); - } - - for (i = 0; i < classes.size(); i++) - { - fprintf(fout," vtkTclCreateNew(interp,(char *) \"%s\", %sNewCommand,\n", - classes[i].c_str(), classes[i].c_str()); - fprintf(fout," %sCommand);\n",classes[i].c_str()); - } - - fprintf(fout," return TCL_OK;\n}\n"); - fclose(fout); - - return true; -} - - diff --git a/Source/cmWrapTclCommand.h b/Source/cmWrapTclCommand.h deleted file mode 100644 index 9906942..0000000 --- a/Source/cmWrapTclCommand.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef cmWrapTclCommand_h -#define cmWrapTclCommand_h - -#include "cmStandardIncludes.h" -#include "cmCommand.h" - -/** \class cmWrapTclCommand - * \brief Define a command that searches for an include file. - * - * cmWrapTclCommand is used to define a CMake variable include - * path location by specifying a file and list of directories. - */ -class cmWrapTclCommand : public cmCommand -{ -public: - /** - * This is a virtual constructor for the command. - */ - virtual cmCommand* Clone() - { - return new cmWrapTclCommand; - } - - /** - * This is called when the command is first encountered in - * the CMakeLists.txt file. - */ - virtual bool Invoke(std::vector& args); - - /** - * This is called at the end after all the information - * specified by the command is accumulated. Most commands do - * not implement this method. At this point, reading and - * writing to the cache can be done. - */ - virtual void FinalPass(); - - /** - * This determines if the command gets propagated down - * to makefiles located in subdirectories. - */ - virtual bool IsInherited() - {return true;} - - /** - * The name of the command as specified in CMakeList.txt. - */ - virtual const char* GetName() { return "WRAP_TCL";} - - /** - * Succinct documentation. - */ - virtual const char* GetTerseDocumentation() - { - return "Create Tcl Wrappers."; - } - - /** - * More documentation. - */ - virtual const char* GetFullDocumentation() - { - return - "WRAP_TCL(resultingLibraryName SourceListName SourceLists ...)"; - } - - /** - * Helper methods - */ - virtual bool CreateInitFile(std::string &name); - virtual bool WriteInit(const char *kitName, std::string& outFileName, - std::vector& classes); - -private: - std::vector m_WrapClasses; - std::vector m_WrapHeaders; - std::string m_LibraryName; - std::string m_SourceList; -}; - - - -#endif -- cgit v0.12