From 5c83326fb43296bec07fe084497f8b3ea5b05e88 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Wed, 25 Apr 2001 16:09:17 -0400 Subject: [PATCH] ENH: clean up cmake GUI and remove the parsing of CMakeLists.txt files by configure --- Source/MFCDialog/CMakeDialog.h | 3 +- Source/MFCDialog/CMakeSetup.rc | 2 +- Source/MFCDialog/CMakeSetupDialog.cpp | 182 +++++++++++++------------- Source/MFCDialog/CMakeSetupDialog.h | 36 ++--- Source/MFCDialog/PropertyList.cpp | 70 ++++++++-- Source/MFCDialog/PropertyList.h | 38 +++--- Source/Makefile.in | 4 +- Source/cmCacheManager.cxx | 17 ++- Source/cmCacheManager.h | 8 +- Source/cmMakefile.cxx | 31 +++++ configure.in.sample | 49 ------- 11 files changed, 234 insertions(+), 206 deletions(-) diff --git a/Source/MFCDialog/CMakeDialog.h b/Source/MFCDialog/CMakeDialog.h index 8ad95cab2..7c0463de5 100644 --- a/Source/MFCDialog/CMakeDialog.h +++ b/Source/MFCDialog/CMakeDialog.h @@ -48,11 +48,12 @@ protected: afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); - afx_msg void OnChangeEdit1(); afx_msg void OnBrowse(); virtual void OnOK(); afx_msg void OnButton3(); afx_msg void OnBuildProjects(); + afx_msg void OnChangeWhereBuild(); + afx_msg void OnChangeWhereSource(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; diff --git a/Source/MFCDialog/CMakeSetup.rc b/Source/MFCDialog/CMakeSetup.rc index d44844b55..4e458763c 100644 --- a/Source/MFCDialog/CMakeSetup.rc +++ b/Source/MFCDialog/CMakeSetup.rc @@ -81,7 +81,7 @@ 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 + LTEXT "Kitware Inc.",IDC_STATIC,40,25,119,8 DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP END diff --git a/Source/MFCDialog/CMakeSetupDialog.cpp b/Source/MFCDialog/CMakeSetupDialog.cpp index 29a3eff30..030337577 100644 --- a/Source/MFCDialog/CMakeSetupDialog.cpp +++ b/Source/MFCDialog/CMakeSetupDialog.cpp @@ -7,6 +7,7 @@ #include "../cmDSWMakefile.h" #include "../cmMSProjectGenerator.h" #include "../cmCacheManager.h" +#include "../cmMakefile.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE @@ -95,55 +96,7 @@ CMakeSetupDialog::CMakeSetupDialog(CWnd* pParent /*=NULL*/) } m_WhereSource = startPath; this->LoadFromRegistry(); - m_InitMakefile = false; - m_GUIInitialized = false; - this->InitMakefile(); - -} - -void CMakeSetupDialog::InitMakefile() -{ - if(m_InitMakefile) - { - // if no change in source or build then - // do not re-init the m_Makefile - if(m_WhereSource == m_WhereSourceLast - && m_WhereBuild == m_WhereBuildLast) - { - return; - } - } - if(m_WhereBuild == "") - { - m_WhereBuild = m_WhereSource; - } - if(m_WhereSource == "") - { - return; - } - // save the values for these so we can detect - // when the GUI has changed them - m_WhereBuildLast = m_WhereBuild; - m_WhereSourceLast = m_WhereSource; - m_InitMakefile = true; - // set up the cmMakefile member - m_Makefile.SetMakefileGenerator(new cmMSProjectGenerator); - m_Makefile.SetHomeDirectory(m_WhereSource); - // Set the output directory - m_Makefile.SetStartOutputDirectory(m_WhereBuild); - m_Makefile.SetHomeOutputDirectory(m_WhereBuild); - // set the directory which contains the CMakeLists.txt - m_Makefile.SetStartDirectory(m_WhereSource); - // Create the master DSW file and all children dsp files for ITK - // Set the CMakeLists.txt file - m_Makefile.MakeStartDirectoriesCurrent(); - // Create a string for the cache file - cmCacheManager::GetInstance()->LoadCache(&m_Makefile); - // if the GUI is already up, then reset it to the loaded cache - if(m_GUIInitialized) - { - this->FillCacheEditorFromCacheManager(); - } + m_BuildPathChanged = false; } void CMakeSetupDialog::DoDataExchange(CDataExchange* pDX) @@ -161,11 +114,12 @@ BEGIN_MESSAGE_MAP(CMakeSetupDialog, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() - ON_EN_CHANGE(IDC_WhereSource, OnChangeEdit1) - ON_BN_CLICKED(IDC_BUTTON2, OnBrowse) - ON_BN_CLICKED(IDC_BUTTON3, OnButton3) - ON_BN_CLICKED(IDC_BuildProjects, OnBuildProjects) - //}}AFX_MSG_MAP + ON_BN_CLICKED(IDC_BUTTON2, OnBrowseWhereSource) + ON_BN_CLICKED(IDC_BUTTON3, OnBrowseWhereBuild) + ON_BN_CLICKED(IDC_BuildProjects, OnBuildProjects) + ON_EN_CHANGE(IDC_WhereBuild, OnChangeWhereBuild) + ON_EN_CHANGE(IDC_WhereSource, OnChangeWhereSource) + //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// @@ -197,13 +151,7 @@ BEGIN_MESSAGE_MAP(CMakeSetupDialog, CDialog) // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon - - // TODO: Add extra initialization here - if(m_InitMakefile) - { - this->FillCacheEditorFromCacheManager(); - } - m_GUIInitialized = true; + this->LoadCacheFromDiskToGUI(); return TRUE; // return TRUE unless you set the focus to a control } @@ -256,18 +204,8 @@ HCURSOR CMakeSetupDialog::OnQueryDragIcon() return (HCURSOR) m_hIcon; } -void CMakeSetupDialog::OnChangeEdit1() -{ - // TODO: If this is a RICHEDIT control, the control will not - // send this notification unless you override the CDialog::OnInitDialog() - // function and call CRichEditCtrl().SetEventMask() - // with the ENM_CHANGE flag ORed into the mask. - - // TODO: Add your control notification handler code here - -} -void CMakeSetupDialog::OnBrowse() +void CMakeSetupDialog::OnBrowseWhereSource() { this->UpdateData(); Browse(m_WhereSource, "Enter Path to Insight Source"); @@ -298,13 +236,8 @@ bool CMakeSetupDialog::Browse(CString &result, const char *title) return bSuccess; } -void CMakeSetupDialog::OnOK() -{ - - CDialog::OnOK(); -} -void CMakeSetupDialog::OnButton3() +void CMakeSetupDialog::OnBrowseWhereBuild() { this->UpdateData(); Browse(m_WhereBuild, "Enter Path to Insight Build"); @@ -385,27 +318,45 @@ void CMakeSetupDialog::OnBuildProjects() ::SetCursor(LoadCursor(NULL, IDC_WAIT)); // get all the info from the screen this->UpdateData(); - // re-init the m_Makefile - this->InitMakefile(); - // copy the GUI cache values into the cache manager - this->FillCacheManagerFromCacheEditor(); + if(!m_BuildPathChanged) + { + // if the build path has not changed save the + // current GUI values to the cache + this->SaveCacheFromGUI(); + } + // Make sure we are working from the cache on disk + this->LoadCacheFromDiskToGUI(); + // Create a makefile object + cmMakefile makefile; + makefile.SetMakefileGenerator(new cmMSProjectGenerator); + makefile.SetHomeDirectory(m_WhereSource); + makefile.SetStartOutputDirectory(m_WhereBuild); + makefile.SetHomeOutputDirectory(m_WhereBuild); + makefile.SetStartDirectory(m_WhereSource); + makefile.MakeStartDirectoriesCurrent(); CString makefileIn = m_WhereSource; makefileIn += "/CMakeLists.txt"; - m_Makefile.ReadListFile(makefileIn); - // Move this to the cache editor - m_Makefile.GenerateMakefile(); - cmCacheManager::GetInstance()->SaveCache(&m_Makefile); + makefile.ReadListFile(makefileIn); + // Generate the project files + makefile.GenerateMakefile(); + // Save the cache + cmCacheManager::GetInstance()->SaveCache(&makefile); // update the GUI with any new values in the caused by the // generation process - this->FillCacheEditorFromCacheManager(); + this->LoadCacheFromDiskToGUI(); + // save source and build paths to registry this->SaveToRegistry(); + // path is not up-to-date + m_BuildPathChanged = false; ::SetCursor(LoadCursor(NULL, IDC_ARROW)); } // copy from the cache manager to the cache edit list box -void CMakeSetupDialog::FillCacheEditorFromCacheManager() +void CMakeSetupDialog::FillCacheGUIFromCacheManager() { + // Clear the current GUI + m_CacheEntriesList.RemoveAll(); const cmCacheManager::CacheEntryMap &cache = cmCacheManager::GetInstance()->GetCacheMap(); for(cmCacheManager::CacheEntryMap::const_iterator i = cache.begin(); @@ -420,26 +371,26 @@ void CMakeSetupDialog::FillCacheEditorFromCacheManager() { m_CacheEntriesList.AddProperty(key, "ON", - PIT_CHECKBOX,""); + CPropertyList::CHECKBOX,""); } else { m_CacheEntriesList.AddProperty(key, "OFF", - PIT_CHECKBOX,""); + CPropertyList::CHECKBOX,""); } break; case cmCacheManager::PATH: m_CacheEntriesList.AddProperty(key, value.m_Value.c_str(), - PIT_FILE,""); + CPropertyList::PATH,""); break; case cmCacheManager::FILEPATH: m_CacheEntriesList.AddProperty(key, value.m_Value.c_str(), - PIT_FILE,""); + CPropertyList::FILE,""); break; case cmCacheManager::STRING: m_CacheEntriesList.AddProperty(key, value.m_Value.c_str(), - PIT_EDIT,""); + CPropertyList::EDIT,""); break; case cmCacheManager::INTERNAL: break; @@ -449,7 +400,7 @@ void CMakeSetupDialog::FillCacheEditorFromCacheManager() } // copy from the list box to the cache manager -void CMakeSetupDialog::FillCacheManagerFromCacheEditor() +void CMakeSetupDialog::FillCacheManagerFromCacheGUI() { cmCacheManager::GetInstance()->GetCacheMap(); std::set items = m_CacheEntriesList.GetItems(); @@ -476,3 +427,46 @@ void CMakeSetupDialog::FillCacheManagerFromCacheEditor() + +void CMakeSetupDialog::OnChangeWhereBuild() +{ + this->UpdateData(); + std::string cachefile = m_WhereBuild; + cachefile += "/CMakeCache.txt"; + if(cmSystemTools::FileExists(cachefile.c_str())) + { + m_CacheEntriesList.ShowWindow(SW_SHOW); + this->LoadCacheFromDiskToGUI(); + m_BuildPathChanged = true; + } + else + { + m_CacheEntriesList.RemoveAll(); + } + +} + +void CMakeSetupDialog::OnChangeWhereSource() +{ + this->UpdateData(); +} + +//! Load cache file from m_WhereBuild and display in GUI editor +void CMakeSetupDialog::LoadCacheFromDiskToGUI() +{ + if(m_WhereBuild != "") + { + cmCacheManager::GetInstance()->LoadCache(m_WhereBuild); + this->FillCacheGUIFromCacheManager(); + } +} + +//! Save GUI values to cmCacheManager and then save to disk. +void CMakeSetupDialog::SaveCacheFromGUI() +{ + this->FillCacheManagerFromCacheGUI(); + if(m_WhereBuild != "") + { + cmCacheManager::GetInstance()->SaveCache(m_WhereBuild); + } +} diff --git a/Source/MFCDialog/CMakeSetupDialog.h b/Source/MFCDialog/CMakeSetupDialog.h index 5b8a6cd88..d04c1c331 100644 --- a/Source/MFCDialog/CMakeSetupDialog.h +++ b/Source/MFCDialog/CMakeSetupDialog.h @@ -7,7 +7,8 @@ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 -#include "../cmMakefile.h" + + #include "PropertyList.h" ///////////////////////////////////////////////////////////////////////////// // CMakeSetupDialog dialog @@ -18,10 +19,13 @@ class CMakeSetupDialog : public CDialog public: CMakeSetupDialog(CWnd* pParent = NULL); // standard constructor protected: - bool Browse(CString&, const char* title); + //! Load cache file from m_WhereBuild and display in GUI editor + void LoadCacheFromDiskToGUI(); + //! Save GUI values to cmCacheManager and then save to disk. + void SaveCacheFromGUI(); void SaveToRegistry(); void LoadFromRegistry(); - void InitMakefile(); + bool Browse(CString&, const char* title); void ReadRegistryValue(HKEY hKey, CString *val, const char *key, @@ -29,13 +33,9 @@ protected: // Dialog Data //{{AFX_DATA(CMakeSetupDialog) enum { IDD = IDD_CMakeSetupDialog_DIALOG }; - cmMakefile m_Makefile; - bool m_InitMakefile; - bool m_GUIInitialized; CString m_WhereSource; CString m_WhereBuild; - CString m_WhereSourceLast; - CString m_WhereBuildLast; + bool m_BuildPathChanged; CPropertyList m_CacheEntriesList; //}}AFX_DATA @@ -48,6 +48,12 @@ protected: // Implementation protected: + // copy from the cache manager to the cache edit list box + void FillCacheGUIFromCacheManager(); + // copy from the list box to the cache manager + void FillCacheManagerFromCacheGUI(); + + HICON m_hIcon; CString m_RegistryKey; // Generated message map functions @@ -56,17 +62,11 @@ protected: afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); - afx_msg void OnChangeEdit1(); - afx_msg void OnBrowse(); - virtual void OnOK(); + afx_msg void OnBrowseWhereSource(); virtual void OnBuildProjects(); - afx_msg void OnButton3(); - - // copy from the cache manager to the cache edit list box - void FillCacheEditorFromCacheManager(); - // copy from the list box to the cache manager - void FillCacheManagerFromCacheEditor(); - + afx_msg void OnBrowseWhereBuild(); + afx_msg void OnChangeWhereBuild(); + afx_msg void OnChangeWhereSource(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; diff --git a/Source/MFCDialog/PropertyList.cpp b/Source/MFCDialog/PropertyList.cpp index b798e10aa..92f701e5d 100644 --- a/Source/MFCDialog/PropertyList.cpp +++ b/Source/MFCDialog/PropertyList.cpp @@ -4,11 +4,10 @@ #include "stdafx.h" #include "PropertyList.h" -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif +#define IDC_PROPCMBBOX 712 +#define IDC_PROPEDITBOX 713 +#define IDC_PROPBTNCTRL 714 +#define IDC_PROPCHECKBOXCTRL 715 ///////////////////////////////////////////////////////////////////////////// // CPropertyList @@ -154,6 +153,8 @@ int CPropertyList::AddProperty(const char* name, { pItem = *p; pItem->m_Removed = false; + pItem->m_curValue = value; + Invalidate(); } } // if it is not found, then create a new one @@ -197,7 +198,7 @@ void CPropertyList::OnSelchange() if (m_CheckBoxControl) m_CheckBoxControl.ShowWindow(SW_HIDE); - if (pItem->m_nItemType==PIT_COMBO) + if (pItem->m_nItemType==CPropertyList::COMBO) { //display the combo box. If the combo box has already been //created then simply move it to the new location, else create it @@ -207,7 +208,9 @@ void CPropertyList::OnSelchange() else { rect.bottom += 100; - m_cmbBox.Create(CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_CHILD | WS_BORDER, + m_cmbBox.Create(CBS_DROPDOWNLIST + | CBS_NOINTEGRALHEIGHT | WS_VISIBLE + | WS_CHILD | WS_BORDER, rect,this,IDC_PROPCMBBOX); m_cmbBox.SetFont(&m_SSerif8Font); } @@ -237,7 +240,7 @@ void CPropertyList::OnSelchange() else m_cmbBox.SetCurSel(0); } - else if (pItem->m_nItemType==PIT_EDIT) + else if (pItem->m_nItemType==CPropertyList::EDIT) { //display edit box m_nLastBox = 1; @@ -247,7 +250,8 @@ void CPropertyList::OnSelchange() m_editBox.MoveWindow(rect); else { - m_editBox.Create(ES_LEFT | ES_AUTOHSCROLL | WS_VISIBLE | WS_CHILD | WS_BORDER, + m_editBox.Create(ES_LEFT | ES_AUTOHSCROLL | WS_VISIBLE + | WS_CHILD | WS_BORDER, rect,this,IDC_PROPEDITBOX); m_editBox.SetFont(&m_SSerif8Font); } @@ -259,14 +263,16 @@ void CPropertyList::OnSelchange() //set the text in the edit box to the property's current value m_editBox.SetWindowText(lBoxSelText); } - else if (pItem->m_nItemType == PIT_CHECKBOX) + else if (pItem->m_nItemType == CPropertyList::CHECKBOX) { rect.bottom -= 3; if (m_CheckBoxControl) m_CheckBoxControl.MoveWindow(rect); else { - m_CheckBoxControl.Create("check",BS_CHECKBOX | BM_SETCHECK |BS_LEFTTEXT | WS_VISIBLE | WS_CHILD, + m_CheckBoxControl.Create("check",BS_CHECKBOX + | BM_SETCHECK |BS_LEFTTEXT + | WS_VISIBLE | WS_CHILD, rect,this,IDC_PROPCHECKBOXCTRL); m_CheckBoxControl.SetFont(&m_SSerif8Font); } @@ -377,7 +383,7 @@ void CPropertyList::OnButton() //display the appropriate common dialog depending on what type //of chooser is associated with the property - if (pItem->m_nItemType == PIT_COLOR) + if (pItem->m_nItemType == CPropertyList::COLOR) { COLORREF initClr; CString currClr = pItem->m_curValue; @@ -413,7 +419,7 @@ void CPropertyList::OnButton() Invalidate(); } } - else if (pItem->m_nItemType == PIT_FILE) + else if (pItem->m_nItemType == CPropertyList::FILE) { CString SelectedFile; CString Filter("Gif Files (*.gif)|*.gif||"); @@ -438,7 +444,32 @@ void CPropertyList::OnButton() Invalidate(); } } - else if (pItem->m_nItemType == PIT_FONT) + else if (pItem->m_nItemType == CPropertyList::PATH) + { + char szPathName[4096]; + BROWSEINFO bi; + + bi.hwndOwner = m_hWnd; + bi.pidlRoot = NULL; + bi.pszDisplayName = (LPTSTR)szPathName; + bi.lpszTitle = "Select Directory"; + bi.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS; + bi.lpfn = NULL; + + LPITEMIDLIST pidl = SHBrowseForFolder(&bi); + + BOOL bSuccess = SHGetPathFromIDList(pidl, szPathName); + CString SelectedFile; + if(bSuccess) + { + SelectedFile = szPathName; + m_btnCtrl.ShowWindow(SW_HIDE); + pItem->m_curValue = SelectedFile; + m_Dirty = true; + Invalidate(); + } + } + else if (pItem->m_nItemType == CPropertyList::FONT) { CFontDialog FontDlg(NULL,CF_EFFECTS | CF_SCREENFONTS,NULL,this); @@ -598,3 +629,14 @@ void CPropertyList::OnDelete() Invalidate(); } +void CPropertyList::RemoveAll() +{ + int c = this->GetCount(); + for(int i =0; i < c; ++i) + { + CPropertyItem* pItem = (CPropertyItem*) GetItemDataPtr(0); + pItem->m_Removed = true; + this->DeleteString(0); + } + Invalidate(); +} diff --git a/Source/MFCDialog/PropertyList.h b/Source/MFCDialog/PropertyList.h index a5a8f211b..57d131e7d 100644 --- a/Source/MFCDialog/PropertyList.h +++ b/Source/MFCDialog/PropertyList.h @@ -1,23 +1,7 @@ -#if !defined(AFX_PROPERTYLIST_H__74205380_1B56_11D4_BC48_00105AA2186F__INCLUDED_) -#define AFX_PROPERTYLIST_H__74205380_1B56_11D4_BC48_00105AA2186F__INCLUDED_ +#ifndef CPROPERTYLIST_H +#define CPROPERTYLIST_H -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 -// PropertyList.h : header file -// -#define PIT_COMBO 0 //PIT = property item type -#define PIT_EDIT 1 -#define PIT_COLOR 2 -#define PIT_FONT 3 -#define PIT_FILE 4 -#define PIT_CHECKBOX 5 - -#define IDC_PROPCMBBOX 712 -#define IDC_PROPEDITBOX 713 -#define IDC_PROPBTNCTRL 714 -#define IDC_PROPCHECKBOXCTRL 715 #include "../cmStandardIncludes.h" @@ -51,6 +35,16 @@ class CPropertyList : public CListBox { // Construction public: + enum ItemType + { + COMBO = 0, + EDIT, + COLOR, + FONT, + FILE, + CHECKBOX, + PATH + }; CPropertyList(); // Attributes @@ -67,7 +61,7 @@ public: { return m_PropertyItems; } - + void RemoveAll(); CPropertyItem* GetItem(int index); // Overrides // ClassWizard generated virtual function overrides @@ -76,7 +70,6 @@ public: virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct); virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); protected: - int AddPropItem(CPropertyItem* pItem); virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual void PreSubclassWindow(); //}}AFX_VIRTUAL @@ -85,7 +78,7 @@ protected: public: virtual ~CPropertyList(); - // Generated message map functions + // Generated message map functions protected: //{{AFX_MSG(CPropertyList) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); @@ -104,12 +97,11 @@ protected: afx_msg void OnDelete(); afx_msg void OnCheckBox(); - - DECLARE_MESSAGE_MAP() void InvertLine(CDC* pDC,CPoint ptFrom,CPoint ptTo); void DisplayButton(CRect region); + int AddPropItem(CPropertyItem* pItem); CComboBox m_cmbBox; CEdit m_editBox; diff --git a/Source/Makefile.in b/Source/Makefile.in index 938895f4a..aff3e901a 100644 --- a/Source/Makefile.in +++ b/Source/Makefile.in @@ -27,7 +27,7 @@ cmCustomCommand.o \ cmCacheManager.o \ cmSourceGroup.o -DEPENDS = $(srcdir)/*.h $(srcdir)/*.cxx ${CMAKE_CONFIG_DIR}/CMake/Source/cmConfigure.h +DEPENDS = $(srcdir)/*.h ${CMAKE_CONFIG_DIR}/CMake/Source/cmConfigure.h cmCollectFlags.o : $(DEPENDS) CMakeBuildTargets.o : $(DEPENDS) @@ -40,7 +40,7 @@ cmSourceFile.o : $(DEPENDS) cmDirectory.o : $(DEPENDS) cmCustomCommand.o : $(DEPENDS) cmUnixMakefileGenerator.o : $(DEPENDS) -cmCommands.o : $(DEPENDS) +cmCommands.o : $(DEPENDS) $(srcdir)/*.cxx cmTarget.o : $(DEPENDS) cmCacheManager.o : $(DEPENDS) cmSourceGroup.o : $(DEPENDS) diff --git a/Source/cmCacheManager.cxx b/Source/cmCacheManager.cxx index 65299731f..bc2f0a794 100644 --- a/Source/cmCacheManager.cxx +++ b/Source/cmCacheManager.cxx @@ -59,7 +59,13 @@ cmCacheManager* cmCacheManager::GetInstance() bool cmCacheManager::LoadCache(cmMakefile* mf) { - std::string cacheFile = mf->GetHomeOutputDirectory(); + return this->LoadCache(mf->GetHomeOutputDirectory()); +} + + +bool cmCacheManager::LoadCache(const char* path) +{ + std::string cacheFile = path; cacheFile += "/CMakeCache.txt"; // clear the old cache m_Cache.clear(); @@ -98,7 +104,13 @@ bool cmCacheManager::LoadCache(cmMakefile* mf) bool cmCacheManager::SaveCache(cmMakefile* mf) const { - std::string cacheFile = mf->GetHomeOutputDirectory(); + return this->SaveCache(mf->GetHomeOutputDirectory()); +} + + +bool cmCacheManager::SaveCache(const char* path) const +{ + std::string cacheFile = path; cacheFile += "/CMakeCache.txt"; std::string tempFile = cacheFile; tempFile += ".tmp"; @@ -110,6 +122,7 @@ bool cmCacheManager::SaveCache(cmMakefile* mf) const return false; } fout << "# This is the CMakeCache file.\n" + << "# For build in directory: " << path << "\n" << "# You can edit this file to change values found and used by cmake.\n" << "# If you do not want to change any of the values, simply exit the editor.\n" << "# If you do want to change a value, simply edit, save, and exit the editor.\n" diff --git a/Source/cmCacheManager.h b/Source/cmCacheManager.h index 01bf98b04..dd313bdfb 100644 --- a/Source/cmCacheManager.h +++ b/Source/cmCacheManager.h @@ -50,10 +50,14 @@ public: //! Load a cache for given makefile. Loads from ouput home. - bool LoadCache(cmMakefile*); + bool LoadCache(cmMakefile*); + //! Load a cache for given makefile. Loads from path/CMakeCache.txt. + bool LoadCache(const char* path); - //! Save cache for given makefile. Saves to ouput home CMakeCache.txt + //! Save cache for given makefile. Saves to ouput home CMakeCache.txt. bool SaveCache(cmMakefile*) const; + //! Save cache for given makefile. Saves to ouput path/CMakeCache.txt + bool SaveCache(const char* path) const; //! Add an entry into the cache void AddCacheEntry(const char* key, const char* value, CacheEntryType type); diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 4ffa433ef..41f167c1b 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -609,6 +609,37 @@ void cmMakefile::GenerateCacheOnly() { std::vector makefiles; this->FindSubDirectoryCMakeListsFiles(makefiles); + for(std::vector::iterator i = makefiles.begin(); + i != makefiles.end(); ++i) + { + cmMakefile* mf = *i; + std::string source = mf->GetHomeDirectory(); + source += "/CMake/CMakeMakefileTemplate.in"; + cmSystemTools::MakeDirectory(mf->GetStartOutputDirectory()); + std::string dest = mf->GetStartOutputDirectory(); + dest += "/Makefile"; + std::ofstream fout(dest.c_str()); + if(!fout) + { + cmSystemTools::Error("Failed to open file for write " , dest.c_str()); + } + else + { + if(strcmp(mf->GetHomeDirectory(), + mf->GetHomeOutputDirectory()) == 0) + { + fout << "srcdir = .\n\n"; + } + else + { + fout << "srcdir = " << mf->GetStartDirectory() << "\n"; + fout << "VPATH = " << mf->GetStartDirectory() << "\n"; + } + } + fout << "include " + << mf->GetHomeOutputDirectory() << "/CMake/CMakeMaster.make\n"; + } + for(unsigned int i =0; i < makefiles.size(); ++i) { delete makefiles[i]; diff --git a/configure.in.sample b/configure.in.sample index 126d136c7..9ed648baf 100644 --- a/configure.in.sample +++ b/configure.in.sample @@ -573,53 +573,6 @@ AC_CONFIG_SUBDIRS(Code/Numerics/vxl/vcl) # and any sub directories recursivley # -echo "Searching CMakeLists.txt files for all sub directories" -# the result of a the directories found is stored in allDirs -allDirs= -# start looking in the current directory . -searchDirs=$srcdir -# loop until the flag dirHasListsFile is set to falls -dirHasListsFile=: -while $dirHasListsFile; do - # reset the varible used to store the full paths to the directory - # outside the for loop - fullPathDirs= - # loop over all directorirs in the current searchDirs varible - for currentDir in $searchDirs;do - # look for a CMakeLists.txt file in the current directory - if test -e$currentDir/CMakeLists.txt; then - # extract the SUBDIRS varible from the CMakeLists.txt file - dirsInListsFile=`cat $currentDir/CMakeLists.txt | sed -e :a -e '/SUBDIRS.*\\\\$/N; s/\\\\\\n//; ta' | grep SUBDIRS | sed -e "s/SUBDIRS//g; s/(//g;s/)//g" ` - # add the current directory to any sub dirs found - # in the above search of CMakeLists.txt - for subdir in $dirsInListsFile;do - fullPathDirs="$fullPathDirs $currentDir/$subdir" - allDirs="$allDirs $currentDir/$subdir" - done - fi - done - # now get ready to search any directories found in the above for loop - searchDirs=$fullPathDirs - # check to see if searchDirs is emtpy - if test "x$searchDirs" = x; then - dirHasListsFile=false - fi -done # continue while loop until dirHasListsFile=false - -if test "x$srcdir" = x.; then - allDirs=`echo $allDirs | sed -e "s|\./||g"` -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/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'` - -# -# ***************************************** -# end of extract SUBDIRS out of CMakeLists.txt files -# - # # Build two variables (SITE, INSTANCE) used for setting up testing # @@ -673,8 +626,6 @@ CMake/CMakeVariables.make CMake/CMakeRules.make CMake/Source/CMakeTargets.make:CMake/dummy.in CMake/Source/Makefile -$SUBDIR_MAKEFILES -$SUBDIR_CMAKE_TARGETS )