beginnings of dev-c++ backend - patch by Trevor McCort
authorRoyce Mitchell III <royce3@ev1.net>
Thu, 20 Jan 2005 06:42:22 +0000 (06:42 +0000)
committerRoyce Mitchell III <royce3@ev1.net>
Thu, 20 Jan 2005 06:42:22 +0000 (06:42 +0000)
svn path=/branches/xmlbuildsystem/; revision=13155

reactos/tools/rbuild/backend/devcpp/devcpp.cpp [new file with mode: 0644]
reactos/tools/rbuild/backend/devcpp/devcpp.h [new file with mode: 0644]
reactos/tools/rbuild/makefile

diff --git a/reactos/tools/rbuild/backend/devcpp/devcpp.cpp b/reactos/tools/rbuild/backend/devcpp/devcpp.cpp
new file mode 100644 (file)
index 0000000..102a08b
--- /dev/null
@@ -0,0 +1,208 @@
+\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
diff --git a/reactos/tools/rbuild/backend/devcpp/devcpp.h b/reactos/tools/rbuild/backend/devcpp/devcpp.h
new file mode 100644 (file)
index 0000000..4ea724a
--- /dev/null
@@ -0,0 +1,47 @@
+\r
+#ifndef __DEVCPP_H__\r
+#define __DEVCPP_H__\r
+\r
+#include <fstream>\r
+#include <vector>\r
+#include <string>\r
+\r
+#include "../backend.h"\r
+\r
+class FileUnit\r
+{\r
+       public:\r
+               std::string filename;\r
+               std::string folder;\r
+};\r
+\r
+class DevCppBackend : public Backend\r
+{\r
+       public:\r
+\r
+               DevCppBackend(Project &project);\r
+               virtual ~DevCppBackend() {}\r
+\r
+               virtual void Process();\r
+\r
+       private:\r
+\r
+               void ProcessModules();\r
+               void ProcessFile(std::string &filename);\r
+               \r
+               bool CheckFolderAdded(std::string &folder);\r
+               void AddFolders(std::string &folder);\r
+\r
+               void OutputFolders();\r
+               void OutputFileUnits();\r
+               \r
+               std::vector<FileUnit> m_fileUnits;\r
+               std::vector<std::string> m_folders;\r
+\r
+               int m_unitCount;\r
+\r
+               std::ofstream m_devFile;\r
+};\r
+\r
+#endif // __DEVCPP_H__\r
+\r
index 7af7ef4..1bae560 100644 (file)
@@ -7,9 +7,12 @@ all: $(TARGET)
 BACKEND_MINGW_BASE_OBJECTS = \\r
        backend/mingw/mingw.o \\r
        backend/mingw/modulehandler.o\r
-       \r
+\r
+BACKEND_DEVCPP_BASE_OBJECTS = backend/devcpp/devcpp.o\r
+                                                         \r
 BACKEND_BASE_OBJECTS = \\r
        $(BACKEND_MINGW_BASE_OBJECTS) \\r
+       $(BACKEND_DEVCPP_BASE_OBJECTS) \\r
        backend/backend.o\r
 \r
 BASE_OBJECTS = \\r