-\r
-#include <iostream>\r
-#include <fstream>\r
-#include <string>\r
-\r
-#include "devcpp.h"\r
-\r
-using namespace std;\r
-\r
-static class DevCppFactory : public Backend::Factory\r
-{\r
- public:\r
-\r
- DevCppFactory() : Factory("devcpp") {}\r
- Backend *operator() (Project &project)\r
- {\r
- return new DevCppBackend(project);\r
- }\r
- \r
-} factory;\r
-\r
-\r
-DevCppBackend::DevCppBackend(Project &project) : Backend(project)\r
-{\r
- m_unitCount = 0;\r
-}\r
-\r
-void DevCppBackend::Process()\r
-{\r
- string filename = ProjectNode.name + ".dev";\r
- \r
- cout << "Creating Dev-C++ project: " << filename << endl;\r
-\r
- ProcessModules();\r
-\r
- m_devFile.open(filename.c_str());\r
-\r
- if(!m_devFile.is_open())\r
- {\r
- cout << "Could not open file." << endl;\r
- return;\r
- }\r
-\r
- m_devFile << "[Project]" << endl;\r
- \r
- m_devFile << "FileName=" << filename << endl\r
- << "Name=" << ProjectNode.name << endl\r
- << "UnitCount=" << m_unitCount << endl\r
- << "Type=1" << endl\r
- << "Ver=1" << endl\r
- << "ObjFiles=" << endl\r
- << "Includes=" << endl\r
- << "Libs=" << endl\r
- << "PrivateResource=" << endl\r
- << "ResourceIncludes=" << endl\r
- << "MakeIncludes=" << endl\r
- << "Compiler=" << endl\r
- << "CppCompiler=" << endl\r
- << "Linker=" << endl\r
- << "IsCpp=1" << endl\r
- << "Icon=" << endl\r
- << "ExeOutput=" << endl\r
- << "ObjectOutput=" << endl\r
- << "OverrideOutput=0" << endl\r
- << "OverrideOutputName=" << endl\r
- << "HostApplication=" << endl\r
- << "CommandLine=" << endl\r
- << "UseCustomMakefile=1" << endl\r
- << "CustomMakefile=" << ProjectNode.makefile << endl\r
- << "IncludeVersionInto=0" << endl\r
- << "SupportXPThemes=0" << endl\r
- << "CompilerSet=0" << endl\r
- \r
- << "CompilerSettings=0000000000000000000000" << endl;\r
- \r
- OutputFolders();\r
-\r
- m_devFile << endl << endl;\r
-\r
- OutputFileUnits();\r
-\r
- m_devFile.close();\r
- \r
- // Dev-C++ needs a makefile, so use the MinGW backend to create one.\r
- \r
- cout << "Creating Makefile: " << ProjectNode.makefile << endl;\r
- \r
- Backend *backend = Backend::Factory::Create("mingw", ProjectNode);\r
- backend->Process();\r
- delete backend;\r
-\r
- cout << "Done." << endl << endl;\r
-\r
- cout << "You may want to disable Class browsing (see below) before you open this project in Dev-C++, as the "\r
- << "parsing required for large projects can take quite awhile."\r
- << endl << endl\r
- << "(Tools->Editor Options->Class browsing->Enable class browsing check box)"\r
- << endl << endl;\r
-}\r
-\r
-void DevCppBackend::ProcessModules()\r
-{\r
- for(size_t i = 0; i < ProjectNode.modules.size(); i++)\r
- {\r
- Module &module = *ProjectNode.modules[i];\r
-\r
- for(size_t k = 0; k < module.files.size(); k++)\r
- {\r
- File &file = *module.files[k];\r
- \r
- ProcessFile(file.name);\r
- }\r
- }\r
-}\r
-\r
-void DevCppBackend::ProcessFile(string &filepath)\r
-{\r
- // Remove the .\ at the start of the filenames\r
- filepath.erase(0, 2);\r
-\r
- // Change the \ to /\r
- for(size_t i = 0; i < filepath.length(); i++)\r
- {\r
- if(filepath[i] == '\\')\r
- filepath[i] = '/';\r
- }\r
-\r
- // Remove the filename from the path\r
- string folder = "";\r
-\r
- size_t pos = filepath.rfind(string("/"), filepath.length() - 1);\r
-\r
- if(pos != string::npos)\r
- {\r
- folder = filepath;\r
- folder.erase(pos, folder.length() - pos);\r
- }\r
- \r
- FileUnit fileUnit;\r
- fileUnit.filename = filepath;\r
- fileUnit.folder = folder;\r
-\r
- m_fileUnits.push_back(fileUnit);\r
-\r
- if(folder != "")\r
- AddFolders(folder);\r
-\r
- m_unitCount++;\r
-}\r
-\r
-bool DevCppBackend::CheckFolderAdded(string &folder)\r
-{\r
- for(size_t i = 0; i < m_folders.size(); i++)\r
- {\r
- if(m_folders[i] == folder)\r
- return true;\r
- }\r
-\r
- return false;\r
-}\r
-\r
-void DevCppBackend::AddFolders(string &folder)\r
-{\r
- // Check if this folder was already added. true if it was, false otherwise.\r
- if(CheckFolderAdded(folder))\r
- return;\r
- \r
- m_folders.push_back(folder);\r
- \r
- size_t pos = folder.rfind(string("/"), folder.length() - 1);\r
-\r
- if(pos == string::npos)\r
- return;\r
-\r
- folder.erase(pos, folder.length() - pos);\r
- AddFolders(folder);\r
-}\r
-\r
-void DevCppBackend::OutputFolders()\r
-{\r
- m_devFile << "Folders=";\r
-\r
- for(size_t i = 0; i < m_folders.size(); i++)\r
- {\r
- if(i > 0)\r
- m_devFile << ",";\r
-\r
- m_devFile << m_folders[i];\r
- }\r
-}\r
-\r
-void DevCppBackend::OutputFileUnits()\r
-{\r
- for(size_t i = 0; i < m_fileUnits.size(); i++)\r
- {\r
- m_devFile << "[Unit" << i + 1 << "]" << endl;\r
- \r
- m_devFile << "FileName=" << m_fileUnits[i].filename << endl;\r
- m_devFile << "CompileCpp=1" << endl;\r
- m_devFile << "Folder=" << m_fileUnits[i].folder << endl;\r
- m_devFile << "Compile=1" << endl;\r
- m_devFile << "Link=1" << endl;\r
- m_devFile << "Priority=1000" << endl;\r
- m_devFile << "OverrideBuildCmd=0" << endl;\r
- m_devFile << "BuildCmd=" << endl << endl;;\r
- }\r
-}\r
-\r
+/*
+ * Copyright (C) 2005 Trevor McCort
+ * Copyright (C) 2005 Casper S. Hornstrup
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifdef _MSC_VER
+#pragma warning ( disable : 4786 )
+#endif//_MSC_VER
+
+#include <iostream>
+#include <fstream>
+#include <string>
+
+#include "devcpp.h"
+
+using namespace std;
+
+static class DevCppFactory : public Backend::Factory
+{
+ public:
+
+ DevCppFactory() : Factory("devcpp") {}
+ Backend *operator() (Project &project,
+ Configuration& configuration)
+ {
+ return new DevCppBackend(project, configuration);
+ }
+
+} factory;
+
+
+DevCppBackend::DevCppBackend(Project &project,
+ Configuration& configuration) : Backend(project, configuration)
+{
+ m_unitCount = 0;
+}
+
+void DevCppBackend::Process()
+{
+ string filename = ProjectNode.name + ".dev";
+
+ cout << "Creating Dev-C++ project: " << filename << endl;
+
+ ProcessModules();
+
+ m_devFile.open(filename.c_str());
+
+ if(!m_devFile.is_open())
+ {
+ cout << "Could not open file." << endl;
+ return;
+ }
+
+ m_devFile << "[Project]" << endl;
+
+ m_devFile << "FileName=" << filename << endl
+ << "Name=" << ProjectNode.name << endl
+ << "UnitCount=" << m_unitCount << endl
+ << "Type=1" << endl
+ << "Ver=1" << endl
+ << "ObjFiles=" << endl
+ << "Includes=" << endl
+ << "Libs=" << endl
+ << "PrivateResource=" << endl
+ << "ResourceIncludes=" << endl
+ << "MakeIncludes=" << endl
+ << "Compiler=" << endl
+ << "CppCompiler=" << endl
+ << "Linker=" << endl
+ << "IsCpp=1" << endl
+ << "Icon=" << endl
+ << "ExeOutput=" << endl
+ << "ObjectOutput=" << endl
+ << "OverrideOutput=0" << endl
+ << "OverrideOutputName=" << endl
+ << "HostApplication=" << endl
+ << "CommandLine=" << endl
+ << "UseCustomMakefile=1" << endl
+ << "CustomMakefile=" << ProjectNode.makefile << endl
+ << "IncludeVersionInto=0" << endl
+ << "SupportXPThemes=0" << endl
+ << "CompilerSet=0" << endl
+
+ << "CompilerSettings=0000000000000000000000" << endl;
+
+ OutputFolders();
+
+ m_devFile << endl << endl;
+
+ OutputFileUnits();
+
+ m_devFile.close();
+
+ // Dev-C++ needs a makefile, so use the MinGW backend to create one.
+
+ cout << "Creating Makefile: " << ProjectNode.makefile << endl;
+
+ Backend *backend = Backend::Factory::Create("mingw",
+ ProjectNode,
+ configuration );
+ backend->Process();
+ delete backend;
+
+ cout << "Done." << endl << endl;
+
+ cout << "You may want to disable Class browsing (see below) before you open this project in Dev-C++, as the "
+ << "parsing required for large projects can take quite awhile."
+ << endl << endl
+ << "(Tools->Editor Options->Class browsing->Enable class browsing check box)"
+ << endl << endl;
+}
+
+void DevCppBackend::ProcessModules()
+{
+ for(size_t i = 0; i < ProjectNode.modules.size(); i++)
+ {
+ Module &module = *ProjectNode.modules[i];
+
+ for(size_t k = 0; k < module.non_if_data.files.size(); k++)
+ {
+ File &file = *module.non_if_data.files[k];
+
+ ProcessFile(file.name);
+ }
+ }
+}
+
+bool FileExists(string &filename)
+{
+ ifstream file(filename.c_str());
+
+ if(!file.is_open())
+ return false;
+
+ file.close();
+ return true;
+}
+
+void DevCppBackend::ProcessFile(string &filepath)
+{
+ // Remove the .\ at the start of the filenames
+ filepath.erase(0, 2);
+
+ if(!FileExists(filepath))
+ return;
+
+ // Change the \ to /
+ for(size_t i = 0; i < filepath.length(); i++)
+ {
+ if(filepath[i] == '\\')
+ filepath[i] = '/';
+ }
+
+ // Remove the filename from the path
+ string folder = "";
+
+ size_t pos = filepath.rfind(string("/"), filepath.length() - 1);
+
+ if(pos != string::npos)
+ {
+ folder = filepath;
+ folder.erase(pos, folder.length() - pos);
+ }
+
+ FileUnit fileUnit;
+ fileUnit.filename = filepath;
+ fileUnit.folder = folder;
+
+ m_fileUnits.push_back(fileUnit);
+
+ if(folder != "")
+ AddFolders(folder);
+
+ m_unitCount++;
+}
+
+bool DevCppBackend::CheckFolderAdded(string &folder)
+{
+ for(size_t i = 0; i < m_folders.size(); i++)
+ {
+ if(m_folders[i] == folder)
+ return true;
+ }
+
+ return false;
+}
+
+void DevCppBackend::AddFolders(string &folder)
+{
+ // Check if this folder was already added. true if it was, false otherwise.
+ if(CheckFolderAdded(folder))
+ return;
+
+ m_folders.push_back(folder);
+
+ size_t pos = folder.rfind(string("/"), folder.length() - 1);
+
+ if(pos == string::npos)
+ return;
+
+ folder.erase(pos, folder.length() - pos);
+ AddFolders(folder);
+}
+
+void DevCppBackend::OutputFolders()
+{
+ m_devFile << "Folders=";
+
+ for(size_t i = 0; i < m_folders.size(); i++)
+ {
+ if(i > 0)
+ m_devFile << ",";
+
+ m_devFile << m_folders[i];
+ }
+}
+
+void DevCppBackend::OutputFileUnits()
+{
+ for(size_t i = 0; i < m_fileUnits.size(); i++)
+ {
+ m_devFile << "[Unit" << i + 1 << "]" << endl;
+
+
+ m_devFile << "FileName=" << m_fileUnits[i].filename << endl;
+ m_devFile << "CompileCpp=1" << endl;
+ m_devFile << "Folder=" << m_fileUnits[i].folder << endl;
+ m_devFile << "Compile=1" << endl;
+ m_devFile << "Link=1" << endl;
+ m_devFile << "Priority=1000" << endl;
+ m_devFile << "OverrideBuildCmd=0" << endl;
+ m_devFile << "BuildCmd=" << endl << endl;;
+ }
+}