}\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
{\r
CreateMakefile ();\r
GenerateHeader ();\r
+ GenerateGlobalVariables ();\r
GenerateAllTarget ();\r
for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )\r
{\r
fMakefile = fopen ( ProjectNode.makefile.c_str (), "w" );\r
if ( !fMakefile )\r
throw AccessDeniedException ( ProjectNode.makefile );\r
+ MingwModuleHandler::SetMakefile ( fMakefile );\r
}\r
\r
void\r
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