#include "cmDSWMakefile.h" #include "cmStandardIncludes.h" #include "cmSystemTools.h" #include "cmDSPMakefile.h" #include "cmMSProjectGenerator.h" #include // microsoft nonsense #undef GetCurrentDirectory #undef SetCurrentDirectory cmDSWMakefile::cmDSWMakefile(cmMakefile* m) { m_Makefile = m; } // output the DSW file void cmDSWMakefile::OutputDSWFile() { if(m_Makefile->GetOutputDirectory() == "") { // default to build in place m_Makefile->SetOutputDirectory(m_Makefile->GetHomeDirectory()); } // If the output directory is not the m_cmHomeDirectory // then create it. if(strcmp(m_Makefile->GetOutputDirectory(), m_Makefile->GetHomeDirectory()) != 0) { if(!cmSystemTools::MakeDirectory(m_Makefile->GetOutputDirectory())) { MessageBox(0, "Error creating directory ", 0, MB_OK); MessageBox(0, m_Makefile->GetOutputDirectory(), 0, MB_OK); } } std::string fname; fname = m_Makefile->GetOutputDirectory(); fname += "/"; fname += m_Makefile->GetProjectName(); fname += ".dsw"; std::ofstream fout(fname.c_str()); if(!fout) { cmSystemTools::Error("Error can not open for write: " , fname.c_str()); return; } this->WriteDSWFile(fout); } // ------------------------------------------------ // Recursive function to find all the CMakeLists.txt files // in a project. As each file is read in, any directories in // the SUBDIR variable are also passed back to this function. // The result is a vector of cmDSPMakefile objects, one for // each directory with a CMakeLists.txt file // void cmDSWMakefile ::FindAllCMakeListsFiles(const char* subdir, std::vector& makefiles) { std::string currentDir = m_Makefile->GetCurrentDirectory(); currentDir += "/"; currentDir += subdir; currentDir += "/"; currentDir += "CMakeLists.txt"; // CMakeLists.txt exits in the subdirectory // then create a cmDSPMakefile for it if(cmSystemTools::FileExists(currentDir.c_str())) { // Create a new cmDSPMakefile to read the currentDir CMakeLists.txt file cmMSProjectGenerator* pg = new cmMSProjectGenerator; pg->SetBuildDSP(); cmMakefile* mf = new cmMakefile; mf->SetMakefileGenerator(pg); // add it to the vector makefiles.push_back(pg); // Set up the file with the current context mf->SetOutputHomeDirectory(m_Makefile->GetOutputDirectory()); mf->SetHomeDirectory(m_Makefile->GetHomeDirectory()); // set the current directory in the Source as a full // path std::string currentDir = m_Makefile->GetCurrentDirectory(); currentDir += "/"; currentDir += subdir; mf->SetCurrentDirectory(currentDir.c_str()); // Parse the CMakeLists.txt file currentDir += "/CMakeLists.txt"; mf->ReadMakefile(currentDir.c_str()); // Set the output directory which may be different than the source std::string outdir = m_Makefile->GetOutputDirectory(); outdir += "/"; outdir += subdir; mf->SetOutputDirectory(outdir.c_str()); // Create the DSP file mf->GenerateMakefile(); // Look at any sub directories parsed (SUBDIRS) and // recurse into them const std::vector& subdirs = mf->GetSubDirectories(); for(std::vector::const_iterator i = subdirs.begin(); i != subdirs.end(); ++i) { // append the subdirectory to the current directoy subdir std::string nextDir = subdir; nextDir += "/"; nextDir += i->c_str(); // recurse into nextDir this->FindAllCMakeListsFiles(nextDir.c_str(), makefiles); } } else { cmSystemTools::Error("Can not find CMakeLists.txt in ", currentDir.c_str()); } } // Write a DSW file to the stream void cmDSWMakefile::WriteDSWFile(std::ostream& fout) { // Write out the header for a DSW file this->WriteDSWHeader(fout); // Create an array of dsp files for the project std::vector dspfiles; // loop over all the subdirectories for the DSW file, // and find all sub directory projects const std::vector& dirs = m_Makefile->GetSubDirectories(); for(std::vector::const_iterator j = dirs.begin(); j != dirs.end(); ++j) { this->FindAllCMakeListsFiles(j->c_str(), dspfiles); } // For each DSP file created insert them into the DSW file for(std::vector::iterator k = dspfiles.begin(); k != dspfiles.end(); ++k) { // Get the directory for the dsp file, it comes // from the source, so it has the source path which needs // to be removed as this may be built in a different directory // than the source std::string dir = (*k)->GetDSPMakefile()-> GetMakefile()->GetCurrentDirectory(); // Get the home directory with the trailing slash std::string homedir = m_Makefile->GetHomeDirectory(); homedir += "/"; // make the directory relative by removing the home directory part 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(); for(std::vector::iterator si = dspnames.begin(); si != dspnames.end(); ++si) { // Write the project into the DSW file this->WriteProject(fout, si->c_str(), dir.c_str(), (*k)->GetDSPMakefile()); } // delete the cmDSPMakefile object once done with it to avoid // leaks delete (*k)->GetDSPMakefile()->GetMakefile(); } // Write the footer for the DSW file this->WriteDSWFooter(fout); } void cmDSWMakefile::WriteProject(std::ostream& fout, const char* dspname, const char* dir, cmDSPMakefile* project) { fout << "###############################################################################\n\n"; fout << "Project: \"" << dspname << "\"=" << dir << "\\" << dspname << ".dsp - Package Owner=<4>\n\n"; fout << "Package=<5>\n{{{\n}}}\n\n"; fout << "Package=<4>\n"; fout << "{{{\n"; if(project->GetMakefile()->HasExecutables()) { // insert Begin Project Dependency Project_Dep_Name project stuff here std::vector::iterator i, end; i = project->GetMakefile()->GetLinkLibraries().begin(); end = project->GetMakefile()->GetLinkLibraries().end(); for(;i!= end; ++i) { fout << "Begin Project Dependency\n"; fout << "Project_Dep_Name " << *i << "\n"; fout << "End Project Dependency\n"; } } fout << "}}}\n\n"; } void cmDSWMakefile::WriteDSWFooter(std::ostream& fout) { fout << "###############################################################################\n\n"; fout << "Global:\n\n"; fout << "Package=<5>\n{{{\n}}}\n\n"; fout << "Package=<3>\n{{{\n}}}\n\n"; fout << "###############################################################################\n\n"; } void cmDSWMakefile::WriteDSWHeader(std::ostream& fout) { fout << "Microsoft Developer Studio Workspace File, Format Version 6.00\n"; fout << "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\n\n"; }