generate clean rules
[reactos.git] / reactos / tools / rbuild / backend / mingw / mingw.cpp
index b548134..4c9e01b 100644 (file)
@@ -16,37 +16,6 @@ public:
        }\r
 } factory;\r
 \r
-#ifdef WIN32\r
-#define EXEPOSTFIX ".exe"\r
-#define SEP "\\"\r
-string\r
-FixSep ( const string& s )\r
-{\r
-       string s2(s);\r
-       char* p = strchr ( &s2[0], '/' );\r
-       while ( p )\r
-       {\r
-               *p++ = '\\';\r
-               p = strchr ( p, '/' );\r
-       }\r
-       return s2;\r
-}\r
-#else\r
-#define EXEPOSTFIX\r
-#define SEP "/"\r
-string\r
-FixSep ( const string& s )\r
-{\r
-       string s2(s);\r
-       char* p = strchr ( &s2[0], '\\' );\r
-       while ( p )\r
-       {\r
-               *p++ = '/';\r
-               p = strchr ( p, '\\' );\r
-       }\r
-       return s2;\r
-}\r
-#endif\r
 \r
 MingwBackend::MingwBackend ( Project& project )\r
        : Backend ( project )\r
@@ -58,6 +27,7 @@ MingwBackend::Process ()
 {\r
        CreateMakefile ();\r
        GenerateHeader ();\r
+       GenerateGlobalVariables ();\r
        GenerateAllTarget ();\r
        for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )\r
        {\r
@@ -73,6 +43,7 @@ MingwBackend::CreateMakefile ()
        fMakefile = fopen ( ProjectNode.makefile.c_str (), "w" );\r
        if ( !fMakefile )\r
                throw AccessDeniedException ( ProjectNode.makefile );\r
+       MingwModuleHandler::SetMakefile ( fMakefile );\r
 }\r
 \r
 void\r
@@ -88,39 +59,124 @@ MingwBackend::GenerateHeader ()
        fprintf ( fMakefile, "# THIS FILE IS AUTOMATICALLY GENERATED, EDIT 'ReactOS.xml' INSTEAD\n\n" );\r
 }\r
 \r
+void\r
+MingwBackend::GenerateGlobalCFlagsAndProperties (\r
+       const char* op,\r
+       const vector<Property*>& properties,\r
+       const vector<Include*>& includes,\r
+       const vector<Define*>& defines,\r
+       const vector<If*>& ifs )\r
+{\r
+       size_t i;\r
+\r
+       for ( i = 0; i < properties.size(); i++ )\r
+       {\r
+               Property& prop = *properties[i];\r
+               fprintf ( fMakefile, "%s := %s\n",\r
+                       prop.name.c_str(),\r
+                       prop.value.c_str() );\r
+       }\r
+\r
+       if ( includes.size() || defines.size() )\r
+       {\r
+               fprintf (\r
+                       fMakefile,\r
+                       "PROJECT_CFLAGS %s",\r
+                       op );\r
+               for ( i = 0; i < includes.size(); i++ )\r
+               {\r
+                       fprintf (\r
+                               fMakefile,\r
+                               " -I%s",\r
+                               includes[i]->directory.c_str() );\r
+               }\r
+               for ( i = 0; i < defines.size(); i++ )\r
+               {\r
+                       Define& d = *defines[i];\r
+                       fprintf (\r
+                               fMakefile,\r
+                               " -D%s",\r
+                               d.name.c_str() );\r
+                       if ( d.value.size() )\r
+                               fprintf (\r
+                                       fMakefile,\r
+                                       "=%s",\r
+                                       d.value.c_str() );\r
+               }\r
+               fprintf ( fMakefile, "\n" );\r
+       }\r
+\r
+       for ( i = 0; i < ifs.size(); i++ )\r
+       {\r
+               If& rIf = *ifs[i];\r
+               if ( rIf.defines.size() || rIf.includes.size() || rIf.ifs.size() )\r
+               {\r
+                       fprintf (\r
+                               fMakefile,\r
+                               "ifeq (\"$(%s)\",\"%s\")\n",\r
+                               rIf.property.c_str(),\r
+                               rIf.value.c_str() );\r
+                       GenerateGlobalCFlagsAndProperties (\r
+                               "+=",\r
+                               rIf.properties,\r
+                               rIf.includes,\r
+                               rIf.defines,\r
+                               rIf.ifs );\r
+                       fprintf ( \r
+                               fMakefile,\r
+                               "endif\n\n" );\r
+               }\r
+       }\r
+}\r
+\r
+void\r
+MingwBackend::GenerateGlobalVariables ()\r
+{\r
+       fprintf ( fMakefile, "host_gcc = gcc\n" );\r
+       fprintf ( fMakefile, "host_ar = ar\n" );\r
+       fprintf ( fMakefile, "host_ld = ld\n" );\r
+       fprintf ( fMakefile, "rm = del /f /q\n" );\r
+       fprintf ( fMakefile, "gcc = gcc\n" );\r
+       fprintf ( fMakefile, "ld = ld\n" );\r
+       fprintf ( fMakefile, "ar = ar\n" );\r
+       fprintf ( fMakefile, "dlltool = dlltool\n\n" );\r
+       GenerateGlobalCFlagsAndProperties (\r
+               "=",\r
+               ProjectNode.properties,\r
+               ProjectNode.includes,\r
+               ProjectNode.defines,\r
+               ProjectNode.ifs );\r
+       fprintf ( fMakefile, "\n" );\r
+\r
+       fprintf ( fMakefile, ".PHONY: clean\n\n" );\r
+       //fprintf ( fMakefile, "clean:\n\t-@${rm} $(PROJECT_CLEAN)\n\n" );\r
+}\r
+\r
 void\r
 MingwBackend::GenerateAllTarget ()\r
 {\r
-       fprintf ( fMakefile, "all: " );\r
+       fprintf ( fMakefile, "all:" );\r
        for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )\r
        {\r
                Module& module = *ProjectNode.modules[i];\r
                fprintf ( fMakefile,\r
-                         " %s" SEP "%s" EXEPOSTFIX,\r
-                         FixSep(module.path).c_str (),\r
-                         module.name.c_str () );\r
+                         " %s",\r
+                         FixupTargetFilename ( module.GetPath () ).c_str () );\r
        }\r
-       fprintf ( fMakefile, "\n\n" );\r
+       fprintf ( fMakefile, "\n\t\n\n" );\r
 }\r
 \r
 void\r
 MingwBackend::ProcessModule ( Module& module )\r
 {\r
-       MingwModuleHandlerList moduleHandlers;\r
-       GetModuleHandlers ( moduleHandlers );\r
-       for (size_t i = 0; i < moduleHandlers.size (); i++)\r
-       {\r
-               MingwModuleHandler& moduleHandler = *moduleHandlers[i];\r
-               if (moduleHandler.CanHandleModule ( module ) )\r
-               {\r
-                       moduleHandler.Process ( module );\r
-                       return;\r
-               }\r
-       }\r
+       MingwModuleHandler* h = MingwModuleHandler::LookupHandler (\r
+               module.node.location,\r
+               module.type );\r
+       h->Process ( module );\r
 }\r
 \r
-void\r
-MingwBackend::GetModuleHandlers ( MingwModuleHandlerList& moduleHandlers )\r
+string\r
+FixupTargetFilename ( const string& targetFilename )\r
 {\r
-       moduleHandlers.push_back ( new MingwKernelModuleHandler ( fMakefile ) );\r
+       return string("$(ROS_INTERMEDIATE)") + targetFilename;\r
 }\r