summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBill Hoffman <bill.hoffman@kitware.com>2001-02-19 20:13:48 (GMT)
committerBill Hoffman <bill.hoffman@kitware.com>2001-02-19 20:13:48 (GMT)
commit89e037ee19ed033fee0830a0c56c7ae956265512 (patch)
tree7a98427243bde8b3e73210dee288784981b46f9c /Source
parenta4bbb55efdbb8d1b948b55248b54a3532f2f9d41 (diff)
downloadCMake-89e037ee19ed033fee0830a0c56c7ae956265512.zip
CMake-89e037ee19ed033fee0830a0c56c7ae956265512.tar.gz
CMake-89e037ee19ed033fee0830a0c56c7ae956265512.tar.bz2
ENH: first pass at cache, clean up the unix generator, clean up configure.in some
Diffstat (limited to 'Source')
-rw-r--r--Source/CMakeBuildTargets.cxx19
-rw-r--r--Source/CMakeSetupCMD.cxx19
-rw-r--r--Source/MFCDialog/CMakeSetup.rc408
-rw-r--r--Source/MFCDialog/CMakeSetupDialog.cpp4
-rw-r--r--Source/MFCDialog/resource.h48
-rw-r--r--Source/Makefile.in4
-rw-r--r--Source/cmCacheManager.cxx39
-rw-r--r--Source/cmCacheManager.h15
-rw-r--r--Source/cmCommand.h8
-rw-r--r--Source/cmDSWMakefile.cxx12
-rw-r--r--Source/cmDSWWriter.cxx12
-rw-r--r--Source/cmFindIncludeCommand.cxx16
-rw-r--r--Source/cmFindLibraryCommand.cxx17
-rw-r--r--Source/cmFindProgramCommand.cxx24
-rw-r--r--Source/cmIncludeDirectoryCommand.cxx2
-rw-r--r--Source/cmMakefile.cxx2
-rw-r--r--Source/cmRegularExpression.h4
-rw-r--r--Source/cmSystemTools.cxx5
-rw-r--r--Source/cmUnixMakefileGenerator.cxx487
-rw-r--r--Source/cmUnixMakefileGenerator.h6
20 files changed, 645 insertions, 506 deletions
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<CacheEntryType>(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<std::string, CacheEntry>::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<std::string> dspnames = (*k)->GetDSPMakefile()->GetCreatedProjectNames();
+ std::vector<std::string> dspnames =
+ (*k)->GetDSPMakefile()->GetCreatedProjectNames();
for(std::vector<std::string>::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<std::string> dspnames = (*k)->GetDSPMakefile()->GetCreatedProjectNames();
+ std::vector<std::string> dspnames =
+ (*k)->GetDSPMakefile()->GetCreatedProjectNames();
for(std::vector<std::string>::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<std::string>& args)
@@ -23,7 +24,15 @@ bool cmFindIncludeCommand::Invoke(std::vector<std::string>& 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<std::string> path;
// add any user specified paths
for (int j = 2; j < args.size(); j++)
@@ -45,8 +54,13 @@ bool cmFindIncludeCommand::Invoke(std::vector<std::string>& 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<std::string>& args)
@@ -23,7 +24,15 @@ bool cmFindLibraryCommand::Invoke(std::vector<std::string>& 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<std::string> path;
// add any user specified paths
for (int j = 2; j < args.size(); j++)
@@ -44,9 +53,13 @@ bool cmFindLibraryCommand::Invoke(std::vector<std::string>& 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 <stdlib.h>
#include <stdio.h>
@@ -26,13 +27,22 @@ bool cmFindProgramCommand::Invoke(std::vector<std::string>& args)
this->SetError("called with incorrect number of arguments");
return false;
}
-
- std::vector<std::string> path;
- cmSystemTools::GetPath(path);
-
std::vector<std::string>::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<std::string> 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<std::string>& 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<std::string>& 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<cmClassFile>& 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<std::string>::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<std::string>& auxSourceDirs = m_Makefile->GetAuxSourceDirectories();
+ // Create sub directories fro aux source directories
+ std::vector<std::string>& 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<std::string>::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<cmClassFile>& 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<std::string>& libs = m_Makefile->GetLinkLibraries();
+ std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
+ std::vector<std::string>::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<std::string>& 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<cmClassFile>& Classes = m_Makefile->GetClasses();
- if(Classes.size() )
+}
+
+// output verbatim section
+void cmUnixMakefileGenerator::OutputVerbatim(std::ostream& fout)
+{
+ std::vector<std::string>& 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<std::string>::iterator j;
+ std::vector<std::string>& 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<std::string>& 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<std::string>& MakeVerbatim = m_Makefile->GetMakeVerbatim();
- // Ouput user make text embeded in the input file
- for(unsigned int i =0; i < MakeVerbatim.size(); i++)
+ std::vector<std::string>& 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<cmClassFile>& 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<std::string>::iterator j;
- std::vector<std::string>& 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<std::string>& 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<std::string>& 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<std::string>& 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<std::string>& 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<std::string>& libs = m_Makefile->GetLinkLibraries();
- std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
- std::vector<std::string>::iterator dir, lib, endlibs, enddirs;
- for(lib = libs.begin(); lib != libs.end(); ++lib)
+ std::vector<cmClassFile>& 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<std::string>::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&);
};