|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Want a new Job?
Chapters
Services
Feature Zones
|
Note: This is an unedited contribution. If this article is inappropriate,
needs attention or copies someone else's work without reference then please
Report This Article
Introduction This is a useful tool for building a serial projects of your team when your software contains many components, created using VC++6, VC++2003, VC++2005 and also VC++2008. At the same time, you can create some batch files to do some additional task, such as increasing the version of project, copying/deleting files, and calculating the MD5 of the final output binary, etc. BackgroundRecently, I have an opportunity to manage a project which has many VC++ projects. We have to compile them one by one firstly, and then we using batch file to do this. But this is a long time to wait the final result, and what the bad is the control flow is poor: if one failed, we have to recompile them all. So, I search the web and know that CodeJock & BCGSoft are all have theirs GUI build wizard, why not create a common one for us? So, it is this. ^)^ Using the codeHere we used some common stuff in this tool, including the INI reader, the console redirector, and XListCtrl. All initialization start from:CBuildWizDlg::OnInitDialog(): InitListCtrl(&m_List); FillListCtrl(&m_List); // Toggle the state of output OnDetail(); // Center Main Dialog. CenterWindow(); m_log.m_pWnd = this; // Set the Header Control m_HeaderCtrl.SetTitleText(m_objSet.m_stuBWS_COMM.szPrjName); m_HeaderCtrl.SetDescText(m_objSet.m_stuBWS_COMM.szComments); m_HeaderCtrl.SetIconHandle(AfxGetApp()->LoadIcon(IDI_MSDEV)); m_HeaderCtrl.Init(this); m_HeaderCtrl.MoveCtrls(this); // Init the Build Envirement. InitBuildEnv();
// Create the Project List items from the BuildWiz.ini. void CBuildWizDlg::FillListCtrl(CXListCtrl *pList) { // Read Settings From INI m_objSet.InitSettings(); // CString strTitle; strTitle.Format("BuildWiz - script by %s ", m_objSet.m_stuBWS_COMM.szAuthor); SetWindowText(strTitle); pList->LockWindowUpdate(); // ***** lock window updates while filling list ***** pList->DeleteAllItems(); CString str = _T(""); int nItem, nSubItem; STU_BWS_ITEM bwsItem; for(nItem = 0; nItem < m_objSet.m_stuBWS_COMM.nItems; nItem ++) { for (nSubItem = 0; nSubItem < BWS_COLS; nSubItem++) { str = _T(""); bwsItem = m_objSet.m_arrBWItems.GetAt(nItem); // Text if (nSubItem == 0) // Enable str.Format("%s", bwsItem.szComponent); else if (nSubItem == 1) // Label str.Format("%s", bwsItem.szComments); else if (nSubItem == 2) // Status { str = _T(" "); pList ->SetItemImage(nItem, nSubItem, BLDWIZ_STATUS_NA); } // Do it. if (nSubItem == 0) { pList->InsertItem(nItem, str); if(strnicmp(bwsItem.szStatus, "yes", 3) == 0) pList->SetCheckbox(nItem, nSubItem, ITEM_STATUS_CHECKED); else if(strnicmp(bwsItem.szStatus, "no", 2) == 0) pList->SetCheckbox(nItem, nSubItem, ITEM_STATUS_UNCHECKED); else pList->SetCheckbox(nItem, nSubItem, ITEM_STATUS_HIDDEN); } else pList->SetItemText(nItem, nSubItem, str); } } pList->UnlockWindowUpdate(); // ***** unlock window updates ***** }
// Set the Env: 'include', 'lib', 'path'. void CBuildWizDlg::InitBuildEnv() { TCHAR tszEnv[MAX_ENVVAR_LEN + 1] = {0}; CString strEnv; // Include if(strlen(m_objSet.m_stuBWS_COMM.szIncDir) > 0) { GetEnvironmentVariable("INCLUDE", tszEnv, sizeof(tszEnv)); strEnv.Format("%s;%s", m_objSet.m_stuBWS_COMM.szIncDir, tszEnv); SetEnvironmentVariable("INCLUDE", strEnv); } // Library if(strlen(m_objSet.m_stuBWS_COMM.szLibDir ) > 0) { GetEnvironmentVariable("LIB", tszEnv, sizeof(tszEnv)); strEnv.Format("%s;%s", m_objSet.m_stuBWS_COMM.szLibDir, tszEnv); SetEnvironmentVariable("LIB", strEnv); } // Path if(strlen(m_objSet.m_stuBWS_COMM.szExeDir) > 0) { GetEnvironmentVariable("PATH", tszEnv, sizeof(tszEnv)); strEnv.Format("%s;%s", m_objSet.m_stuBWS_COMM.szExeDir, tszEnv); SetEnvironmentVariable("PATH", strEnv); } // 'BWBaseDir' variable if(strlen(m_objSet.m_stuBWS_COMM.szBaseDir) > 0) { SetEnvironmentVariable("BWBASEDIR", m_objSet.m_stuBWS_COMM.szBaseDir); } else SetEnvironmentVariable("BWBASEDIR", ""); // Change the current directory. if(strlen(m_objSet.m_stuBWS_COMM.szBaseDir) > 0) { if(!SetCurrentDirectory(m_objSet.m_stuBWS_COMM.szBaseDir)) OutputDebugString("\nError! Base Directory is invalid."); else { } } }
// This is the Piper. CTraceCollector objTracer(&m_log); objTracer.Run(); // Here we start build and create a redirected application. if(!RunScript(m_objSet.m_stuBWS_COMM.szPreCompile)) { ... ... How to Use This ToolFirst you should know something about the BuildWiz.ini. There is a [common] section for the common settings of your project, and there are many [item?] sections for each of you project of your product. What I am sure is, once you run BuildWiz.exe after reviewing the demo BuildWiz.ini, you should know the meanings of each tags. Please download the Binary 1st. Points of Interest* BuildWiz supports VC++6 and VC++ 2005 projects, and mingw, cygin, c51 are also supported, I think; * We used Pipe-Line and redirect techonology; * BuildWiz can be improved to support user defined envirement varibles; * As a project manager, you can make your software build more faster and easier than ever. :) * It gives you more control while building sources.
History* 2008-05-16 rev. 1.2 BuildWiz.ini now have new 'BaseDir={PWD}' support. * 2008-01-23 rev. 1.1 BuildWiz.ini now have new %basedir% varible support. by using this new var. we can simplify the .ini. * 2007-10-08 1st Step. (This is my 3rd topic on codeproject)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||