From 89e037ee19ed033fee0830a0c56c7ae956265512 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Mon, 19 Feb 2001 15:13:48 -0500 Subject: ENH: first pass at cache, clean up the unix generator, clean up configure.in some --- CMakeMakefileTemplate.in | 4 + MakefileTemplate.in | 4 - Source/CMakeBuildTargets.cxx | 19 +- Source/CMakeSetupCMD.cxx | 19 +- Source/MFCDialog/CMakeSetup.rc | 408 ++++++++++++++-------------- Source/MFCDialog/CMakeSetupDialog.cpp | 4 + Source/MFCDialog/resource.h | 48 ++-- Source/Makefile.in | 4 +- Source/cmCacheManager.cxx | 39 ++- Source/cmCacheManager.h | 15 +- Source/cmCommand.h | 8 +- Source/cmDSWMakefile.cxx | 12 +- Source/cmDSWWriter.cxx | 12 +- Source/cmFindIncludeCommand.cxx | 16 +- Source/cmFindLibraryCommand.cxx | 17 +- Source/cmFindProgramCommand.cxx | 24 +- Source/cmIncludeDirectoryCommand.cxx | 2 +- Source/cmMakefile.cxx | 2 +- Source/cmRegularExpression.h | 4 +- Source/cmSystemTools.cxx | 5 +- Source/cmUnixMakefileGenerator.cxx | 487 +++++++++++++++++++--------------- Source/cmUnixMakefileGenerator.h | 6 + configure.in.sample | 4 +- 23 files changed, 651 insertions(+), 512 deletions(-) create mode 100644 CMakeMakefileTemplate.in delete mode 100644 MakefileTemplate.in diff --git a/CMakeMakefileTemplate.in b/CMakeMakefileTemplate.in new file mode 100644 index 0000000..c02dc9a --- /dev/null +++ b/CMakeMakefileTemplate.in @@ -0,0 +1,4 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +@MAKEINCLUDE@ @MAKEQUOTE@@CMAKE_CONFIG_DIR@/CMake/CMakeMaster.make@MAKEQUOTE@ diff --git a/MakefileTemplate.in b/MakefileTemplate.in deleted file mode 100644 index c02dc9a..0000000 --- a/MakefileTemplate.in +++ /dev/null @@ -1,4 +0,0 @@ -srcdir = @srcdir@ -VPATH = @srcdir@ - -@MAKEINCLUDE@ @MAKEQUOTE@@CMAKE_CONFIG_DIR@/CMake/CMakeMaster.make@MAKEQUOTE@ diff --git a/Source/CMakeBuildTargets.cxx b/Source/CMakeBuildTargets.cxx index 876708e..243cac0 100644 --- a/Source/CMakeBuildTargets.cxx +++ b/Source/CMakeBuildTargets.cxx @@ -17,14 +17,27 @@ #include "cmStandardIncludes.h" #include "cmMakeDepend.h" #include "cmUnixMakefileGenerator.h" +#include "cmCacheManager.h" +void Usage(const char* program) +{ + std::cerr << "Usage: " << program << " CMakeLists.txt " + << "-Ssource_start_directory " + << "-Ooutput_start_directory " + << "-Hsource_home_directory " + << "-Boutput_home_directory\n" + << "Where start directories are the current place in the tree," + "and the home directories are the top.\n"; +} + + // This is the main program used to gentrate makefile fragments // from CMakeLists.txt input files. int main(int ac, char** av) { if(ac < 2) { - std::cerr << "Usage: " << av[0] << " Makefile.in -Ipath ..." << std::endl; + Usage(av[0]); return -1; } // Create a makefile @@ -66,10 +79,12 @@ int main(int ac, char** av) // Read and parse the input makefile mf.MakeStartDirectoriesCurrent(); + cmCacheManager::GetInstance()->LoadCache(&mf); if(!mf.ReadListFile(av[1])) { - std::cerr << "Usage: " << av[0] << " Makefile.in -Ipath ..." << std::endl; + Usage(av[0]); return -1; } mf.GenerateMakefile(); + cmCacheManager::GetInstance()->SaveCache(&mf); } diff --git a/Source/CMakeSetupCMD.cxx b/Source/CMakeSetupCMD.cxx index 7250629..5752296 100644 --- a/Source/CMakeSetupCMD.cxx +++ b/Source/CMakeSetupCMD.cxx @@ -16,6 +16,7 @@ #include "cmStandardIncludes.h" #include "cmMakefile.h" #include "cmMSProjectGenerator.h" +#include "cmCacheManager.h" // this is the command line version of CMakeSetup. @@ -59,13 +60,13 @@ int main(int ac, char** av) if(ac < 3) { std::cerr << "Usage: " << av[0] << - " CMakeLists.txt -[DSP|DSW] -Hinsighthome -Dcurrentdir" - " -Ooutput directory" << std::endl; + " CMakeLists.txt -[DSP|DSW] -Hsource_home -Sstart_source_directory " + " -Ostart_output_directory -Boutput_home" << std::endl; return -1; } std::string arg = av[2]; - cmMakefile builder; - SetArgs(builder, ac, av); + cmMakefile makefile; + SetArgs(makefile, ac, av); cmMSProjectGenerator* pg = new cmMSProjectGenerator; if(arg.find("-DSP", 0) != std::string::npos) { @@ -75,10 +76,12 @@ int main(int ac, char** av) { pg->BuildDSWOn(); } - builder.SetMakefileGenerator(pg); - builder.MakeStartDirectoriesCurrent(); - builder.ReadListFile(av[1]); - builder.GenerateMakefile(); + makefile.SetMakefileGenerator(pg); + makefile.MakeStartDirectoriesCurrent(); + cmCacheManager::GetInstance()->LoadCache(&makefile); + makefile.ReadListFile(av[1]); + makefile.GenerateMakefile(); + cmCacheManager::GetInstance()->SaveCache(&makefile); return 0; } diff --git a/Source/MFCDialog/CMakeSetup.rc b/Source/MFCDialog/CMakeSetup.rc index ac37e1d..0cd8f78 100644 --- a/Source/MFCDialog/CMakeSetup.rc +++ b/Source/MFCDialog/CMakeSetup.rc @@ -1,204 +1,204 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "#ifdef _WIN32\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1252)\r\n" - "#endif //_WIN32\r\n" - "#include ""res\\CMakeSetupDialog.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAINFRAME ICON DISCARDABLE "res\\CMakeSetupDialog.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 235, 55 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About CMakeSetup" -FONT 8, "MS Sans Serif" -BEGIN - ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 - LTEXT "CMakeSetup Version 1.0",IDC_STATIC,40,10,119,8, - SS_NOPREFIX - LTEXT "Copyright (C) 2000",IDC_STATIC,40,25,119,8 - DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP -END - -IDD_CMakeSetupDialog_DIALOG DIALOGEX 0, 0, 320, 200 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "CMakeSetupDialog" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,260,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,260,23,50,14 - EDITTEXT IDC_WhereSource,13,27,135,13,ES_AUTOHSCROLL - PUSHBUTTON "Browse...",IDC_BUTTON2,150,28,43,13 - LTEXT "Where is the source code:",IDC_STATIC,15,15,104,9 - EDITTEXT IDC_WhereBuild,14,67,133,13,ES_AUTOHSCROLL - PUSHBUTTON "Browse...",IDC_BUTTON3,151,66,43,13 - LTEXT "Where do you want to build the binaries:",IDC_STATIC,16, - 56,128,9 -END - - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904B0" - BEGIN - VALUE "CompanyName", "\0" - VALUE "FileDescription", "CMakeSetup MFC Application\0" - VALUE "FileVersion", "1, 0, 0, 1\0" - VALUE "InternalName", "CMakeSetup\0" - VALUE "LegalCopyright", "Copyright (C) 2000\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "CMakeSetup.EXE\0" - VALUE "ProductName", "CMakeSetup Application\0" - VALUE "ProductVersion", "1, 0, 0, 1\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // !_MAC - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_ABOUTBOX, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 48 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_ABOUTBOX "&About CMakeSetup..." -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE 9, 1 -#pragma code_page(1252) -#endif //_WIN32 -#include "res\CMakeSetupDialog.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "#define _AFX_NO_SPLITTER_RESOURCES\r\n" + "#define _AFX_NO_OLE_RESOURCES\r\n" + "#define _AFX_NO_TRACKER_RESOURCES\r\n" + "#define _AFX_NO_PROPERTY_RESOURCES\r\n" + "\r\n" + "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" + "#ifdef _WIN32\r\n" + "LANGUAGE 9, 1\r\n" + "#pragma code_page(1252)\r\n" + "#endif //_WIN32\r\n" + "#include ""res\\CMakeSetupDialog.rc2"" // non-Microsoft Visual C++ edited resources\r\n" + "#include ""afxres.rc"" // Standard components\r\n" + "#endif\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_MAINFRAME ICON DISCARDABLE "res\\CMakeSetupDialog.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 235, 55 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About CMakeSetup" +FONT 8, "MS Sans Serif" +BEGIN + ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 + LTEXT "CMakeSetup Version 1.0",IDC_STATIC,40,10,119,8, + SS_NOPREFIX + LTEXT "Copyright (C) 2000",IDC_STATIC,40,25,119,8 + DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP +END + +IDD_CMakeSetupDialog_DIALOG DIALOGEX 0, 0, 320, 200 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "CMakeSetupDialog" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,260,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,260,23,50,14 + EDITTEXT IDC_WhereSource,13,27,135,13,ES_AUTOHSCROLL + PUSHBUTTON "Browse...",IDC_BUTTON2,150,28,43,13 + LTEXT "Where is the source code:",IDC_STATIC,15,15,104,9 + EDITTEXT IDC_WhereBuild,14,67,133,13,ES_AUTOHSCROLL + PUSHBUTTON "Browse...",IDC_BUTTON3,151,66,43,13 + LTEXT "Where do you want to build the binaries:",IDC_STATIC,16, + 56,128,9 +END + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "\0" + VALUE "FileDescription", "CMakeSetup MFC Application\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "CMakeSetup\0" + VALUE "LegalCopyright", "Copyright (C) 2000\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "CMakeSetup.EXE\0" + VALUE "ProductName", "CMakeSetup Application\0" + VALUE "ProductVersion", "1, 0, 0, 1\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_ABOUTBOX, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 228 + TOPMARGIN, 7 + BOTTOMMARGIN, 48 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ABOUTBOX "&About CMakeSetup..." +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#define _AFX_NO_SPLITTER_RESOURCES +#define _AFX_NO_OLE_RESOURCES +#define _AFX_NO_TRACKER_RESOURCES +#define _AFX_NO_PROPERTY_RESOURCES + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE 9, 1 +#pragma code_page(1252) +#endif //_WIN32 +#include "res\CMakeSetupDialog.rc2" // non-Microsoft Visual C++ edited resources +#include "afxres.rc" // Standard components +#endif + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Source/MFCDialog/CMakeSetupDialog.cpp b/Source/MFCDialog/CMakeSetupDialog.cpp index 036d76c..c9c8e86 100644 --- a/Source/MFCDialog/CMakeSetupDialog.cpp +++ b/Source/MFCDialog/CMakeSetupDialog.cpp @@ -7,6 +7,7 @@ #include "../cmDSWMakefile.h" #include "../cmWindowsConfigure.h" #include "../cmMSProjectGenerator.h" +#include "../cmCacheManager.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE @@ -266,10 +267,13 @@ void CMakeSetupDialog::OnOK() CString makefileIn = m_WhereSource; makefileIn += "/CMakeLists.txt"; mf.MakeStartDirectoriesCurrent(); + // Create a string for the cache file + cmCacheManager::GetInstance()->LoadCache(&mf); mf.ReadListFile(makefileIn); // Move this to the cache editor mf.GenerateMakefile(); CDialog::OnOK(); + cmCacheManager::GetInstance()->SaveCache(&mf); this->SaveToRegistry(); } diff --git a/Source/MFCDialog/resource.h b/Source/MFCDialog/resource.h index 0c1b2b7..bf8788d 100644 --- a/Source/MFCDialog/resource.h +++ b/Source/MFCDialog/resource.h @@ -1,24 +1,24 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by CMakeSetup.rc -// -#define IDM_ABOUTBOX 0x0010 -#define IDD_ABOUTBOX 100 -#define IDS_ABOUTBOX 101 -#define IDD_CMakeSetupDialog_DIALOG 102 -#define IDR_MAINFRAME 128 -#define IDC_WhereSource 1001 -#define IDC_BUTTON2 1002 -#define IDC_WhereBuild 1003 -#define IDC_BUTTON3 1004 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 129 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1003 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by CMakeSetup.rc +// +#define IDM_ABOUTBOX 0x0010 +#define IDD_ABOUTBOX 100 +#define IDS_ABOUTBOX 101 +#define IDD_CMakeSetupDialog_DIALOG 102 +#define IDR_MAINFRAME 128 +#define IDC_WhereSource 1001 +#define IDC_BUTTON2 1002 +#define IDC_WhereBuild 1003 +#define IDC_BUTTON3 1004 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 131 +#define _APS_NEXT_COMMAND_VALUE 32771 +#define _APS_NEXT_CONTROL_VALUE 1004 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Source/Makefile.in b/Source/Makefile.in index edc9ed3..620d255 100644 --- a/Source/Makefile.in +++ b/Source/Makefile.in @@ -21,7 +21,8 @@ cmClassFile.o \ cmSystemTools.o \ cmDirectory.o \ cmUnixMakefileGenerator.o \ -cmCommands.o +cmCommands.o \ +cmCacheManager.o cmCollectFlags.o : $(srcdir)/*.h @@ -35,6 +36,7 @@ cmClassFile.o : $(srcdir)/*.h cmDirectory.o : $(srcdir)/*.h cmUnixMakefileGenerator.o : $(srcdir)/*.h cmCommands.o : $(srcdir)/*.h +cmCacheManager.o : $(srcdir)/*.h diff --git a/Source/cmCacheManager.cxx b/Source/cmCacheManager.cxx index 79d6366..f1682a9 100644 --- a/Source/cmCacheManager.cxx +++ b/Source/cmCacheManager.cxx @@ -16,10 +16,13 @@ #include "cmCacheManager.h" #include "cmSystemTools.h" +#include "cmCacheManager.h" +#include "cmMakefile.h" const char* cmCacheManagerTypes[] = { "BOOL", "PATH", + "FILEPATH", "STRING", 0 }; @@ -33,6 +36,7 @@ cmCacheManager::CacheEntryType cmCacheManager::StringToType(const char* s) { return static_cast(i); } + ++i; } return STRING; } @@ -51,12 +55,15 @@ cmCacheManager* cmCacheManager::GetInstance() -bool cmCacheManager::LoadCache(const char* path) +bool cmCacheManager::LoadCache(cmMakefile* mf) { - std::ifstream fin(path); + std::string cacheFile = mf->GetHomeOutputDirectory(); + cacheFile += "/CMakeCache.txt"; + // clear the old cache + m_Cache.clear(); + std::ifstream fin(cacheFile.c_str()); if(!fin) { - cmSystemTools::Error("Unable to open cache file for load. ", path); return false; } const int bsize = 4096; @@ -64,37 +71,45 @@ bool cmCacheManager::LoadCache(const char* path) std::string inputLine; while(fin) { + // Format is key:type=value CacheEntry e; std::string key; - fin.getline(buffer, bsize, '|'); + fin.getline(buffer, bsize, ':'); key = buffer; - fin.getline(buffer, bsize, '|'); - e.m_Value = buffer; - fin.getline(buffer, bsize); // last token is separated by a newline + fin.getline(buffer, bsize, '='); e.m_Type = cmCacheManager::StringToType(buffer); + fin.getline(buffer, bsize); // last token is separated by a newline + e.m_Value = buffer; if(fin) { m_Cache[key] = e; } } + return true; } -bool cmCacheManager::SaveCache(const char* path) +bool cmCacheManager::SaveCache(cmMakefile* mf) { - std::ofstream fout(path); + std::string cacheFile = mf->GetHomeOutputDirectory(); + cacheFile += "/CMakeCache.txt"; + std::ofstream fout(cacheFile.c_str()); if(!fout) { - cmSystemTools::Error("Unable to open cache file for save. ", path); + cmSystemTools::Error("Unable to open cache file for save. ", + cacheFile.c_str()); return false; } for( std::map::iterator i = m_Cache.begin(); i != m_Cache.end(); ++i) { - fout << (*i).first.c_str() << " | " << (*i).second.m_Value << " | "; CacheEntryType t = (*i).second.m_Type; - fout << cmCacheManagerTypes[t]; + // Format is key:type=value + fout << (*i).first.c_str() << ":" + << cmCacheManagerTypes[t] << "=" + << (*i).second.m_Value << "\n"; } fout << "\n"; + return true; } void cmCacheManager::AddCacheEntry(const char* key, diff --git a/Source/cmCacheManager.h b/Source/cmCacheManager.h index 1806cc3..f983ea5 100644 --- a/Source/cmCacheManager.h +++ b/Source/cmCacheManager.h @@ -17,6 +17,7 @@ #define cmCacheManager_h #include "cmStandardIncludes.h" +class cmMakefile; /** \class cmCacheManager * \brief Control class for cmake's cache @@ -31,24 +32,26 @@ public: * Types for the cache entries. These are useful as * hints for a cache editor program. Path should bring * up a file chooser, BOOL a check box, and STRING a - * text entry box. + * text entry box, FILEPATH is a full path to a file which + * can be different than just a path input */ - enum CacheEntryType{ BOOL=0, PATH, STRING }; + enum CacheEntryType{ BOOL=0, PATH, FILEPATH, STRING }; static CacheEntryType StringToType(const char*); //! Singleton pattern get instance of the cmCacheManager. static cmCacheManager* GetInstance(); - //! Load a cache from file - bool LoadCache(const char* path); + //! Load a cache for given makefile. Loads from ouput home. + bool LoadCache(cmMakefile*); - //! Save the cache to a file - bool SaveCache(const char* path); + //! Save cache for given makefile. Saves to ouput home CMakeCache.txt + bool SaveCache(cmMakefile*); //! Add an entry into the cache void AddCacheEntry(const char* key, const char* value, CacheEntryType type); //! Get a value from the cache given a key const char* GetCacheValue(const char* key); + private: static cmCacheManager* s_Instance; class CacheEntry diff --git a/Source/cmCommand.h b/Source/cmCommand.h index 7051d3e..72f08dc 100644 --- a/Source/cmCommand.h +++ b/Source/cmCommand.h @@ -53,14 +53,10 @@ public: /** * This is called at the end after all the information * specified by the command is accumulated. Most commands do - * not implement this method. + * not implement this method. At this point, reading and + * writing to the cache can be done. */ virtual void FinalPass() {}; - - /** - * This is called to let the command check the cache. - */ - virtual void LoadCache() {} /** * This is a virtual constructor for the command. diff --git a/Source/cmDSWMakefile.cxx b/Source/cmDSWMakefile.cxx index 2bb46ee..082f64e 100644 --- a/Source/cmDSWMakefile.cxx +++ b/Source/cmDSWMakefile.cxx @@ -165,7 +165,8 @@ void cmDSWMakefile::WriteDSWFile(std::ostream& fout) cmSystemTools::ReplaceString(dir, homedir.c_str(), ""); // Get the list of create dsp files from the cmDSPMakefile, more // than one dsp could have been created per input CMakeLists.txt file - std::vector dspnames = (*k)->GetDSPMakefile()->GetCreatedProjectNames(); + std::vector dspnames = + (*k)->GetDSPMakefile()->GetCreatedProjectNames(); for(std::vector::iterator si = dspnames.begin(); si != dspnames.end(); ++si) { @@ -188,7 +189,8 @@ void cmDSWMakefile::WriteProject(std::ostream& fout, cmDSPMakefile* project) { project->GetMakefile()->ExpandVariables(); - fout << "###############################################################################\n\n"; + fout << "#########################################################" + "######################\n\n"; fout << "Project: \"" << dspname << "\"=" << dir << "\\" << dspname << ".dsp - Package Owner=<4>\n\n"; fout << "Package=<5>\n{{{\n}}}\n\n"; @@ -215,11 +217,13 @@ void cmDSWMakefile::WriteProject(std::ostream& fout, void cmDSWMakefile::WriteDSWFooter(std::ostream& fout) { - fout << "###############################################################################\n\n"; + fout << "######################################################" + "#########################\n\n"; fout << "Global:\n\n"; fout << "Package=<5>\n{{{\n}}}\n\n"; fout << "Package=<3>\n{{{\n}}}\n\n"; - fout << "###############################################################################\n\n"; + fout << "#####################################################" + "##########################\n\n"; } diff --git a/Source/cmDSWWriter.cxx b/Source/cmDSWWriter.cxx index 2bb46ee..082f64e 100644 --- a/Source/cmDSWWriter.cxx +++ b/Source/cmDSWWriter.cxx @@ -165,7 +165,8 @@ void cmDSWMakefile::WriteDSWFile(std::ostream& fout) cmSystemTools::ReplaceString(dir, homedir.c_str(), ""); // Get the list of create dsp files from the cmDSPMakefile, more // than one dsp could have been created per input CMakeLists.txt file - std::vector dspnames = (*k)->GetDSPMakefile()->GetCreatedProjectNames(); + std::vector dspnames = + (*k)->GetDSPMakefile()->GetCreatedProjectNames(); for(std::vector::iterator si = dspnames.begin(); si != dspnames.end(); ++si) { @@ -188,7 +189,8 @@ void cmDSWMakefile::WriteProject(std::ostream& fout, cmDSPMakefile* project) { project->GetMakefile()->ExpandVariables(); - fout << "###############################################################################\n\n"; + fout << "#########################################################" + "######################\n\n"; fout << "Project: \"" << dspname << "\"=" << dir << "\\" << dspname << ".dsp - Package Owner=<4>\n\n"; fout << "Package=<5>\n{{{\n}}}\n\n"; @@ -215,11 +217,13 @@ void cmDSWMakefile::WriteProject(std::ostream& fout, void cmDSWMakefile::WriteDSWFooter(std::ostream& fout) { - fout << "###############################################################################\n\n"; + fout << "######################################################" + "#########################\n\n"; fout << "Global:\n\n"; fout << "Package=<5>\n{{{\n}}}\n\n"; fout << "Package=<3>\n{{{\n}}}\n\n"; - fout << "###############################################################################\n\n"; + fout << "#####################################################" + "##########################\n\n"; } diff --git a/Source/cmFindIncludeCommand.cxx b/Source/cmFindIncludeCommand.cxx index 706a617..b1f095e 100644 --- a/Source/cmFindIncludeCommand.cxx +++ b/Source/cmFindIncludeCommand.cxx @@ -14,6 +14,7 @@ =========================================================================*/ #include "cmFindIncludeCommand.h" +#include "cmCacheManager.h" // cmFindIncludeCommand bool cmFindIncludeCommand::Invoke(std::vector& args) @@ -23,7 +24,15 @@ bool cmFindIncludeCommand::Invoke(std::vector& args) 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(args[0].c_str()); + if(cacheValue) + { + m_Makefile->AddDefinition(args[0].c_str(), cacheValue); + return true; + } std::vector path; // add any user specified paths for (int j = 2; j < args.size(); j++) @@ -45,8 +54,13 @@ bool cmFindIncludeCommand::Invoke(std::vector& args) if(cmSystemTools::FileExists(tryPath.c_str())) { m_Makefile->AddDefinition(args[0].c_str(), path[k].c_str()); + // Save the value in the cache + cmCacheManager::GetInstance()->AddCacheEntry(args[0].c_str(), + path[k].c_str(), + cmCacheManager::PATH); return true; } } + return false; } diff --git a/Source/cmFindLibraryCommand.cxx b/Source/cmFindLibraryCommand.cxx index 883a5ea..e241f50 100644 --- a/Source/cmFindLibraryCommand.cxx +++ b/Source/cmFindLibraryCommand.cxx @@ -14,6 +14,7 @@ =========================================================================*/ #include "cmFindLibraryCommand.h" +#include "cmCacheManager.h" // cmFindLibraryCommand bool cmFindLibraryCommand::Invoke(std::vector& args) @@ -23,7 +24,15 @@ bool cmFindLibraryCommand::Invoke(std::vector& args) 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(args[0].c_str()); + if(cacheValue) + { + m_Makefile->AddDefinition(args[0].c_str(), cacheValue); + return true; + } std::vector path; // add any user specified paths for (int j = 2; j < args.size(); j++) @@ -44,9 +53,13 @@ bool cmFindLibraryCommand::Invoke(std::vector& args) tryPath += args[1]; if(cmSystemTools::FileExists(tryPath.c_str())) { - m_Makefile->AddDefinition(args[0].c_str(), path[k].c_str()); + m_Makefile->AddDefinition(args[0].c_str(), path[k].c_str()); + cmCacheManager::GetInstance()->AddCacheEntry(args[0].c_str(), + path[k].c_str(), + cmCacheManager::PATH); return true; } } + return false; } diff --git a/Source/cmFindProgramCommand.cxx b/Source/cmFindProgramCommand.cxx index c3d3275..81678b3 100644 --- a/Source/cmFindProgramCommand.cxx +++ b/Source/cmFindProgramCommand.cxx @@ -14,6 +14,7 @@ =========================================================================*/ #include "cmFindProgramCommand.h" +#include "cmCacheManager.h" #include #include @@ -26,13 +27,22 @@ bool cmFindProgramCommand::Invoke(std::vector& args) this->SetError("called with incorrect number of arguments"); return false; } - - std::vector path; - cmSystemTools::GetPath(path); - std::vector::iterator i = args.begin(); + // Use the first argument as the name of something to be defined const char* define = (*i).c_str(); - i++; + i++; // move iterator to next arg + // 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(define); + if(cacheValue) + { + m_Makefile->AddDefinition(define, cacheValue); + return true; + } + // if it is not in the cache, then search the system path + std::vector path; + cmSystemTools::GetPath(path); for(; i != args.end(); ++i) { for(int k=0; k < path.size(); k++) @@ -45,6 +55,10 @@ bool cmFindProgramCommand::Invoke(std::vector& args) #endif if(cmSystemTools::FileExists(tryPath.c_str())) { + // Save the value in the cache + cmCacheManager::GetInstance()->AddCacheEntry(define, + tryPath.c_str(), + cmCacheManager::FILEPATH); m_Makefile->AddDefinition(define, tryPath.c_str()); return true; } diff --git a/Source/cmIncludeDirectoryCommand.cxx b/Source/cmIncludeDirectoryCommand.cxx index 6c6f21d..4696efb 100644 --- a/Source/cmIncludeDirectoryCommand.cxx +++ b/Source/cmIncludeDirectoryCommand.cxx @@ -14,7 +14,7 @@ =========================================================================*/ #include "cmIncludeDirectoryCommand.h" - +#include "cmCacheManager.h" // cmIncludeDirectoryCommand bool cmIncludeDirectoryCommand::Invoke(std::vector& args) { diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index ee29a6d..1acaf7c 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -21,6 +21,7 @@ #include "cmSystemTools.h" #include "cmMakefileGenerator.h" #include "cmCommands.h" +#include "cmCacheManager.h" // default is not to be building executables cmMakefile::cmMakefile() @@ -170,7 +171,6 @@ bool cmMakefile::ReadListFile(const char* filename) cmCommand* rm = (*pos).second; cmCommand* usedCommand = rm->Clone(); usedCommand->SetMakefile(this); - usedCommand->LoadCache(); bool keepCommand = false; if(usedCommand->GetEnabled()) { diff --git a/Source/cmRegularExpression.h b/Source/cmRegularExpression.h index 0628e32..011d229 100644 --- a/Source/cmRegularExpression.h +++ b/Source/cmRegularExpression.h @@ -56,7 +56,7 @@ const int NSUBEXP = 10; * regular expression is a sequence of characters used to * search for exact character matches. However, many times the * exact sequence to be found is not known, or only a match at - * the beginning or end of a string is desired. The vbl regu- + * the beginning or end of a string is desired. The cmRegularExpression regu- * lar expression class implements regular expression pattern * matching as is found and implemented in many UNIX commands * and utilities. @@ -68,7 +68,7 @@ const int NSUBEXP = 10; * * Is written as follows in C++ * - * vbl_reg_exp re("([a-z]+)\\.cc"); + * cmRegularExpression re("([a-z]+)\\.cc"); * re.find(filename); * cerr << re.match(1); * diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index da953ba..5f7c2de 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -146,7 +146,8 @@ void cmSystemTools::ConvertToUnixSlashes(std::string& path) } -int cmSystemTools::Grep(const char* dir, const char* file, const char* expression) +int cmSystemTools::Grep(const char* dir, const char* file, + const char* expression) { std::string path = dir; path += "/"; @@ -327,7 +328,7 @@ void cmSystemTools::Error(const char* m1, const char* m2) message += m2; } #ifdef _WIN32 -// MessageBox(0, message.c_str(), 0, MB_OK); + ::MessageBox(0, message.c_str(), 0, MB_OK); std::cerr << message.c_str() << std::endl; #else std::cerr << message.c_str() << std::endl; diff --git a/Source/cmUnixMakefileGenerator.cxx b/Source/cmUnixMakefileGenerator.cxx index 8037de9..e1bcb8f 100644 --- a/Source/cmUnixMakefileGenerator.cxx +++ b/Source/cmUnixMakefileGenerator.cxx @@ -22,94 +22,120 @@ void cmUnixMakefileGenerator::GenerateMakefile() { + // Generate depends cmMakeDepend md; md.SetMakefile(m_Makefile); md.DoDepends(); + // output the makefile fragment this->OutputMakefile("CMakeTargets.make"); } -// Output the depend information for all the classes -// in the makefile. These would have been generated -// by the class cmMakeDepend GenerateMakefile -void cmUnixMakefileGenerator::OutputDepends(std::ostream& fout) -{ - std::vector& Classes = m_Makefile->GetClasses(); - for(unsigned int i = 0; i < Classes.size(); i++) - { - if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly) - { - if( Classes[i].m_Depends.size()) - { - fout << Classes[i].m_ClassName << ".o : \\\n"; - for(std::vector::iterator j = - Classes[i].m_Depends.begin(); - j != Classes[i].m_Depends.end(); ++j) - { - if(j+1 == Classes[i].m_Depends.end()) - { - fout << *j << " \n"; - } - else - { - fout << *j << " \\\n"; - } - } - fout << "\n\n"; - } - } - } -} - -// fix up names of directories so they can be used -// as targets in makefiles. -inline std::string FixDirectoryName(const char* dir) -{ - std::string s = dir; - // replace ../ with 3 under bars - size_t pos = s.find("../"); - if(pos != std::string::npos) - { - s.replace(pos, 3, "___"); - } - // replace / directory separators with a single under bar - pos = s.find("/"); - while(pos != std::string::npos) - { - s.replace(pos, 1, "_"); - pos = s.find("/"); - } - return s; -} // This is where CMakeTargets.make is generated -// This function ouputs the following: -// 1. Include flags for the compiler -// 2. List of .o files that need to be compiled -// 3. Rules to build executables including -l and -L options -// 4. Rules to build in sub directories -// 5. The name of the library being built, if it is a library - void cmUnixMakefileGenerator::OutputMakefile(const char* file) { - std::vector& auxSourceDirs = m_Makefile->GetAuxSourceDirectories(); + // Create sub directories fro aux source directories + std::vector& auxSourceDirs = + m_Makefile->GetAuxSourceDirectories(); if( auxSourceDirs.size() ) { // For the case when this is running as a remote build // on unix, make the directory - for(std::vector::iterator i = auxSourceDirs.begin(); i != auxSourceDirs.end(); ++i) { cmSystemTools::MakeDirectory(i->c_str()); } } - std::ofstream fout(file); if(!fout) { cmSystemTools::Error("Error can not open for write: ", file); return; } + this->OutputMakeFlags(fout); + this->OutputSourceToObjectList(fout); + this->OutputVerbatim(fout); + this->OutputExecutableRules(fout); + this->OutputSubDirectoryRules(fout); + this->OutputDepends(fout); +} + +// Output the LIBRARY and SRC_OBJS list based on +// the library name and cmClassFile objects in the +// makefile +void cmUnixMakefileGenerator::OutputSourceToObjectList(std::ostream& fout) +{ + std::vector& Classes = m_Makefile->GetClasses(); + if(Classes.size() == 0) + { + return; + } + // Ouput Library name if there are SRC_OBJS + if(strlen(m_Makefile->GetLibraryName()) > 0) + { + fout << "LIBRARY = " << m_Makefile->GetLibraryName() << "\n\n"; + fout << "BUILD_LIB_FILE = lib${LIBRARY}${CMAKE_LIB_EXT}\n\n"; + } + // Output SRC_OBJ list for all the classes to be compiled + fout << "SRC_OBJ = \\\n"; + for(unsigned int i = 0; i < Classes.size(); i++) + { + if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly + && !Classes[i].m_IsExecutable) + { + fout << Classes[i].m_ClassName << ".o "; + if(i == Classes.size() -1) + { + fout << "\n\n"; + } + else + { + fout << "\\\n"; + } + } + } + fout << "\n"; +} + + +// output the list of libraries that the executables +// in this makefile will depend on. +void cmUnixMakefileGenerator::OutputDependLibraries(std::ostream& fout) +{ + std::vector& libs = m_Makefile->GetLinkLibraries(); + std::vector& libdirs = m_Makefile->GetLinkDirectories(); + std::vector::iterator dir, lib, endlibs, enddirs; + // Search the list of libraries that will be linked into + // the executable + for(lib = libs.begin(); lib != libs.end(); ++lib) + { + bool found = false; + // loop over the list of directories that the libraries might + // be in, looking for a LIBRARY=(lib) line. + for(dir = libdirs.begin(); dir != libdirs.end() && !found; ++dir) + { + std::string expression = "LIBRARY.*=.*"; + expression += lib->c_str(); + if(cmSystemTools::Grep(dir->c_str(), "CMakeTargets.make", + expression.c_str())) + { + std::string libpath = *dir; + libpath += "/lib"; + libpath += *lib; + libpath += "${CMAKE_LIB_EXT}"; + fout << libpath << " "; + found = true; + } + } + } + fout << "\n"; +} + + +// output make include flags +void cmUnixMakefileGenerator::OutputMakeFlags(std::ostream& fout) +{ // Output Include paths fout << "INCLUDE_FLAGS = "; std::vector& includes = m_Makefile->GetIncludeDirectories(); @@ -121,198 +147,217 @@ void cmUnixMakefileGenerator::OutputMakefile(const char* file) } fout << " ${LOCAL_INCLUDE_FLAGS} "; fout << "\n"; + fout << "default_target: all\n\n"; // see if there are files to compile in this makefile // These are used for both libraries and executables - std::vector& Classes = m_Makefile->GetClasses(); - if(Classes.size() ) +} + +// output verbatim section +void cmUnixMakefileGenerator::OutputVerbatim(std::ostream& fout) +{ + std::vector& MakeVerbatim = m_Makefile->GetMakeVerbatim(); + // Ouput user make text embeded in the input file + for(unsigned int i =0; i < MakeVerbatim.size(); i++) { - // Ouput Library name if there are SRC_OBJS - if(strlen(m_Makefile->GetLibraryName()) > 0) + fout << MakeVerbatim[i] << "\n"; + } + fout << "\n\n"; + +} + +// output executables +void cmUnixMakefileGenerator::OutputExecutableRules(std::ostream& fout) +{ + if(!m_Makefile->HasExecutables()) + { + return ; + } + // collect all the flags needed for linking libraries + std::string linkLibs; + std::vector::iterator j; + std::vector& libdirs = m_Makefile->GetLinkDirectories(); + for(j = libdirs.begin(); j != libdirs.end(); ++j) + { + std::string::size_type pos = (*j).find("-L"); + if((pos == std::string::npos || pos > 0) + && (*j).find("${") == std::string::npos) { - fout << "LIBRARY = " << m_Makefile->GetLibraryName() << "\n\n"; - fout << "BUILD_LIB_FILE = lib${LIBRARY}${CMAKE_LIB_EXT}\n\n"; + linkLibs += "-L"; } - // Output SRC_OBJ list for all the classes to be compiled - fout << "SRC_OBJ = \\\n"; - for(unsigned int i = 0; i < Classes.size(); i++) + linkLibs += *j; + linkLibs += " "; + } + std::vector& libs = m_Makefile->GetLinkLibraries(); + for(j = libs.begin(); j != libs.end(); ++j) + { + std::string::size_type pos = (*j).find("-l"); + if((pos == std::string::npos || pos > 0) + && (*j).find("${") == std::string::npos) { - if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly) - { - fout << Classes[i].m_ClassName << ".o "; - if(i == Classes.size() -1) - { - fout << "\n\n"; - } - else - { - fout << "\\\n"; - } - } + linkLibs += "-l"; } - fout << "\n"; + linkLibs += *j; + linkLibs += " "; } - std::vector& MakeVerbatim = m_Makefile->GetMakeVerbatim(); - // Ouput user make text embeded in the input file - for(unsigned int i =0; i < MakeVerbatim.size(); i++) + std::vector& libsUnix = m_Makefile->GetLinkLibrariesUnix(); + for(j = libsUnix.begin(); j != libsUnix.end(); ++j) { - fout << MakeVerbatim[i] << "\n"; + linkLibs += *j; + linkLibs += " "; } - fout << "\n\n"; - - // Output rules for building executables - if( m_Makefile->HasExecutables() ) + linkLibs += " ${LOCAL_LINK_FLAGS} "; + // create and output a varible in the makefile that + // each executable will depend on. This will have all the + // libraries that the executable uses + fout << "CMAKE_DEPEND_LIBS = "; + this->OutputDependLibraries(fout); + // Now create rules for all of the executables to be built + std::vector& Classes = m_Makefile->GetClasses(); + for(unsigned int i = 0; i < Classes.size(); i++) + { + if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly + && Classes[i].m_IsExecutable) + { + std::string DotO = Classes[i].m_ClassName; + DotO += ".o"; + fout << Classes[i].m_ClassName << ": " << DotO << " "; + fout << "${CMAKE_DEPEND_LIBS}\n"; + fout << "\t${CXX} ${CXX_FLAGS} " << m_Makefile->GetDefineFlags() + << DotO.c_str() << " " + << linkLibs.c_str() + << " -o $@ ""\n\n"; + } + } + // ouput the list of executables + fout << "EXECUTABLES = \\\n"; + for(unsigned int i = 0; i < Classes.size(); i++) { - // collect all the flags needed for linking libraries - std::string linkLibs; - std::vector::iterator j; - std::vector& libdirs = m_Makefile->GetLinkDirectories(); - for(j = libdirs.begin(); j != libdirs.end(); ++j) + if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly + && Classes[i].m_IsExecutable) { - std::string::size_type pos = (*j).find("-L"); - if((pos == std::string::npos || pos > 0) - && (*j).find("${") == std::string::npos) + fout << Classes[i].m_ClassName; + if(i < Classes.size()-1) { - linkLibs += "-L"; + fout << " \\"; } - linkLibs += *j; - linkLibs += " "; + fout << "\n"; } - std::vector& libs = m_Makefile->GetLinkLibraries(); - for(j = libs.begin(); j != libs.end(); ++j) + } + fout << "\n"; +} + +// fix up names of directories so they can be used +// as targets in makefiles. +inline std::string FixDirectoryName(const char* dir) +{ + std::string s = dir; + // replace ../ with 3 under bars + size_t pos = s.find("../"); + if(pos != std::string::npos) + { + s.replace(pos, 3, "___"); + } + // replace / directory separators with a single under bar + pos = s.find("/"); + while(pos != std::string::npos) + { + s.replace(pos, 1, "_"); + pos = s.find("/"); + } + return s; +} + + +// output rules for decending into sub directories +void cmUnixMakefileGenerator::OutputSubDirectoryRules(std::ostream& fout) +{ + // Output Sub directory build rules + const std::vector& SubDirectories + = m_Makefile->GetSubDirectories(); + + if( SubDirectories.size() == 0) + { + return; + } + fout << "SUBDIR_BUILD = \\\n"; + unsigned int i; + for(i =0; i < SubDirectories.size(); i++) + { + std::string subdir = FixDirectoryName(SubDirectories[i].c_str()); + fout << "build_" << subdir.c_str(); + if(i == SubDirectories.size()-1) { - std::string::size_type pos = (*j).find("-l"); - if((pos == std::string::npos || pos > 0) - && (*j).find("${") == std::string::npos) - { - linkLibs += "-l"; - } - linkLibs += *j; - linkLibs += " "; + fout << " \n\n"; } - std::vector& libsUnix = m_Makefile->GetLinkLibrariesUnix(); - for(j = libsUnix.begin(); j != libsUnix.end(); ++j) + else { - linkLibs += *j; - linkLibs += " "; + fout << " \\\n"; } - linkLibs += " ${LOCAL_LINK_FLAGS} "; - // create and output a varible in the makefile that - // each executable will depend on. This will have all the - // libraries that the executable uses - fout << "CMAKE_DEPEND_LIBS = "; - this->OutputDependLibraries(fout); - // Now create rules for all of the executables to be built - for(unsigned int i = 0; i < Classes.size(); i++) + } + fout << std::endl; + fout << "SUBDIR_CLEAN = \\\n"; + for(i =0; i < SubDirectories.size(); i++) + { + std::string subdir = FixDirectoryName(SubDirectories[i].c_str()); + fout << "clean_" << subdir.c_str(); + if(i == SubDirectories.size()-1) { - if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly) - { - std::string DotO = Classes[i].m_ClassName; - DotO += ".o"; - fout << Classes[i].m_ClassName << ": " << DotO << " "; - fout << "${CMAKE_DEPEND_LIBS}\n"; - fout << "\t${CXX} ${CXX_FLAGS} " << m_Makefile->GetDefineFlags() - << DotO.c_str() << " " - << linkLibs.c_str() - << " -o $@ ""\n\n"; - } + fout << " \n\n"; } - // ouput the list of executables - fout << "EXECUTABLES = \\\n"; - for(unsigned int i = 0; i < Classes.size(); i++) + else { - if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly) - { - fout << Classes[i].m_ClassName; - if(i < Classes.size()-1) - { - fout << " \\"; - } - fout << "\n"; - } + fout << " \\\n"; } - fout << "\n"; } - // Output Sub directory build rules - const std::vector& SubDirectories - = m_Makefile->GetSubDirectories(); - - if( SubDirectories.size() ) - { - fout << "SUBDIR_BUILD = \\\n"; - unsigned int i; - for(i =0; i < SubDirectories.size(); i++) - { - std::string subdir = FixDirectoryName(SubDirectories[i].c_str()); - fout << "build_" << subdir.c_str(); - if(i == SubDirectories.size()-1) - { - fout << " \n\n"; - } - else - { - fout << " \\\n"; - } - } - fout << std::endl; - fout << "SUBDIR_CLEAN = \\\n"; - for(i =0; i < SubDirectories.size(); i++) - { - std::string subdir = FixDirectoryName(SubDirectories[i].c_str()); - fout << "clean_" << subdir.c_str(); - if(i == SubDirectories.size()-1) - { - fout << " \n\n"; - } - else - { - fout << " \\\n"; - } - } - fout << std::endl; - fout << "alldirs : ${SUBDIR_BUILD}\n\n"; + fout << std::endl; + fout << "alldirs : ${SUBDIR_BUILD}\n\n"; - for(i =0; i < SubDirectories.size(); i++) - { - std::string subdir = FixDirectoryName(SubDirectories[i].c_str()); - fout << "build_" << subdir.c_str() << ":\n"; - fout << "\tcd " << SubDirectories[i].c_str() - << "; ${MAKE} -${MAKEFLAGS} CMakeTargets.make\n"; - fout << "\tcd " << SubDirectories[i].c_str() - << "; ${MAKE} -${MAKEFLAGS} all\n\n"; + for(i =0; i < SubDirectories.size(); i++) + { + std::string subdir = FixDirectoryName(SubDirectories[i].c_str()); + fout << "build_" << subdir.c_str() << ":\n"; + fout << "\tcd " << SubDirectories[i].c_str() + << "; ${MAKE} -${MAKEFLAGS} CMakeTargets.make\n"; + fout << "\tcd " << SubDirectories[i].c_str() + << "; ${MAKE} -${MAKEFLAGS} all\n\n"; - fout << "clean_" << subdir.c_str() << ": \n"; - fout << "\tcd " << SubDirectories[i].c_str() - << "; ${MAKE} -${MAKEFLAGS} clean\n\n"; - } + fout << "clean_" << subdir.c_str() << ": \n"; + fout << "\tcd " << SubDirectories[i].c_str() + << "; ${MAKE} -${MAKEFLAGS} clean\n\n"; } - this->OutputDepends(fout); } -// output the list of libraries that the executables -// in this makefile will depend on. -void cmUnixMakefileGenerator::OutputDependLibraries(std::ostream& fout) + + +// Output the depend information for all the classes +// in the makefile. These would have been generated +// by the class cmMakeDepend GenerateMakefile +void cmUnixMakefileGenerator::OutputDepends(std::ostream& fout) { - std::vector& libs = m_Makefile->GetLinkLibraries(); - std::vector& libdirs = m_Makefile->GetLinkDirectories(); - std::vector::iterator dir, lib, endlibs, enddirs; - for(lib = libs.begin(); lib != libs.end(); ++lib) + std::vector& Classes = m_Makefile->GetClasses(); + for(unsigned int i = 0; i < Classes.size(); i++) { - bool found = false; - for(dir = libdirs.begin(); dir != libdirs.end() && !found; ++dir) + if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly) { - std::string expression = "LIBRARY.*=.*"; - expression += lib->c_str(); - if(cmSystemTools::Grep(dir->c_str(), "CMakeTargets.make", expression.c_str())) - { - std::string libpath = *dir; - libpath += "/lib"; - libpath += *lib; - libpath += "${CMAKE_LIB_EXT}"; - fout << libpath << " "; - found = true; - } + if( Classes[i].m_Depends.size()) + { + fout << Classes[i].m_ClassName << ".o : \\\n"; + for(std::vector::iterator j = + Classes[i].m_Depends.begin(); + j != Classes[i].m_Depends.end(); ++j) + { + if(j+1 == Classes[i].m_Depends.end()) + { + fout << *j << " \n"; + } + else + { + fout << *j << " \\\n"; + } + } + fout << "\n\n"; + } } } - fout << "\n"; } diff --git a/Source/cmUnixMakefileGenerator.h b/Source/cmUnixMakefileGenerator.h index b941470..d956a47 100644 --- a/Source/cmUnixMakefileGenerator.h +++ b/Source/cmUnixMakefileGenerator.h @@ -42,6 +42,12 @@ public: protected: void OutputMakefile(const char* file); + void OutputMakeFlags(std::ostream&); + void OutputVerbatim(std::ostream&); + void OutputSourceToObjectList(std::ostream& fout); + void OutputExecutableRules(std::ostream&); + void OutputSubDirectoryRules(std::ostream&); + void OutputDependInformation(std::ostream&); void OutputDependLibraries(std::ostream&); }; diff --git a/configure.in.sample b/configure.in.sample index 56529d0..1c19ba9 100644 --- a/configure.in.sample +++ b/configure.in.sample @@ -583,7 +583,7 @@ if test "x$srcdir" = x.; then else allDirs=`echo $allDirs | sed -e "s|$srcdir/||g"` fi -SUBDIR_MAKEFILES=`echo $allDirs | sed -e 's|\\([[A-Za-z0-9_/]][[A-Za-z0-9_/]]*\\)|\1/Makefile:CMake/MakefileTemplate.in|g'` +SUBDIR_MAKEFILES=`echo $allDirs | sed -e 's|\\([[A-Za-z0-9_/]][[A-Za-z0-9_/]]*\\)|\1/Makefile:CMake/CMakeMakefileTemplate.in|g'` SUBDIR_CMAKE_TARGETS=`echo $allDirs | sed -e 's|\\([[A-Za-z0-9_/]][[A-Za-z0-9_/]]*\\)|\1/CMakeTargets.make:CMake/CMakeTargets.make.in|g'` @@ -601,7 +601,7 @@ SUBDIR_CMAKE_TARGETS=`echo $allDirs | sed -e 's|\\([[A-Za-z0-9_/]][[A-Za-z0-9_/] # sub directories found in CMakeLists.txt files AC_OUTPUT( -Makefile:CMake/MakefileTemplate.in +Makefile:CMake/CMakeMakefileTemplate.in CMakeTargets.make:CMake/CMakeTargets.make.in CMake/CMakeSimpleRules.make CMake/CMakeMaster.make -- cgit v0.12