10 static class MingwFactory
: public Backend::Factory
13 MingwFactory() : Factory ( "mingw" ) {}
14 Backend
* operator() ( Project
& project
)
16 return new MingwBackend ( project
);
21 MingwBackend::MingwBackend ( Project
& project
)
27 MingwBackend::Process ()
31 GenerateGlobalVariables ();
33 GenerateInitTarget ();
34 GenerateXmlBuildFilesMacro();
35 for ( size_t i
= 0; i
< ProjectNode
.modules
.size (); i
++ )
37 Module
& module
= *ProjectNode
.modules
[i
];
38 ProcessModule ( module
);
40 CheckAutomaticDependencies ();
45 MingwBackend::CreateMakefile ()
47 fMakefile
= fopen ( ProjectNode
.makefile
.c_str (), "w" );
49 throw AccessDeniedException ( ProjectNode
.makefile
);
50 MingwModuleHandler::SetMakefile ( fMakefile
);
54 MingwBackend::CloseMakefile () const
61 MingwBackend::GenerateHeader () const
63 fprintf ( fMakefile
, "# THIS FILE IS AUTOMATICALLY GENERATED, EDIT 'ReactOS.xml' INSTEAD\n\n" );
67 MingwBackend::GenerateProjectCFlagsMacro ( const char* assignmentOperation
,
68 const vector
<Include
*>& includes
,
69 const vector
<Define
*>& defines
) const
76 assignmentOperation
);
77 for ( i
= 0; i
< includes
.size(); i
++ )
82 includes
[i
]->directory
.c_str() );
85 for ( i
= 0; i
< defines
.size(); i
++ )
87 Define
& d
= *defines
[i
];
98 fprintf ( fMakefile
, "\n" );
102 MingwBackend::GenerateGlobalCFlagsAndProperties (
103 const char* assignmentOperation
,
104 const vector
<Property
*>& properties
,
105 const vector
<Include
*>& includes
,
106 const vector
<Define
*>& defines
,
107 const vector
<If
*>& ifs
) const
111 for ( i
= 0; i
< properties
.size(); i
++ )
113 Property
& prop
= *properties
[i
];
114 fprintf ( fMakefile
, "%s := %s\n",
116 prop
.value
.c_str() );
119 if ( includes
.size() || defines
.size() )
121 GenerateProjectCFlagsMacro ( assignmentOperation
,
126 for ( i
= 0; i
< ifs
.size(); i
++ )
129 if ( rIf
.defines
.size() || rIf
.includes
.size() || rIf
.ifs
.size() )
133 "ifeq (\"$(%s)\",\"%s\")\n",
134 rIf
.property
.c_str(),
136 GenerateGlobalCFlagsAndProperties (
150 MingwBackend::GenerateProjectLFLAGS () const
153 for ( size_t i
= 0; i
< ProjectNode
.linkerFlags
.size (); i
++ )
155 LinkerFlag
& linkerFlag
= *ProjectNode
.linkerFlags
[i
];
156 if ( lflags
.length () > 0 )
158 lflags
+= linkerFlag
.flag
;
164 MingwBackend::GenerateGlobalVariables () const
166 fprintf ( fMakefile
, "mkdir = tools" SSEP
"rmkdir" EXEPOSTFIX
"\n" );
167 fprintf ( fMakefile
, "winebuild = tools" SSEP
"winebuild" SSEP
"winebuild" EXEPOSTFIX
"\n" );
168 fprintf ( fMakefile
, "bin2res = tools" SSEP
"bin2res" SSEP
"bin2res" EXEPOSTFIX
"\n" );
169 fprintf ( fMakefile
, "cabman = tools" SSEP
"cabman" SSEP
"cabman" EXEPOSTFIX
"\n" );
170 fprintf ( fMakefile
, "cdmake = tools" SSEP
"cdmake" SSEP
"cdmake" EXEPOSTFIX
"\n" );
171 fprintf ( fMakefile
, "rsym = tools" SSEP
"rsym" EXEPOSTFIX
"\n" );
172 fprintf ( fMakefile
, "wrc = tools" SSEP
"wrc" SSEP
"wrc" EXEPOSTFIX
"\n" );
173 fprintf ( fMakefile
, "\n" );
174 GenerateGlobalCFlagsAndProperties (
176 ProjectNode
.properties
,
177 ProjectNode
.includes
,
180 fprintf ( fMakefile
, "PROJECT_RCFLAGS = $(PROJECT_CFLAGS)\n" );
181 fprintf ( fMakefile
, "PROJECT_LFLAGS = %s\n",
182 GenerateProjectLFLAGS ().c_str () );
183 fprintf ( fMakefile
, "\n" );
187 MingwBackend::IncludeInAllTarget ( const Module
& module
) const
189 if ( module
.type
== ObjectLibrary
)
191 if ( module
.type
== BootSector
)
193 if ( module
.type
== Iso
)
199 MingwBackend::GenerateAllTarget () const
201 fprintf ( fMakefile
, "all:" );
202 for ( size_t i
= 0; i
< ProjectNode
.modules
.size (); i
++ )
204 Module
& module
= *ProjectNode
.modules
[i
];
205 if ( IncludeInAllTarget ( module
) )
209 FixupTargetFilename ( module
.GetPath () ).c_str () );
212 fprintf ( fMakefile
, "\n\t\n\n" );
216 MingwBackend::GetBuildToolDependencies () const
219 for ( size_t i
= 0; i
< ProjectNode
.modules
.size (); i
++ )
221 Module
& module
= *ProjectNode
.modules
[i
];
222 if ( module
.type
== BuildTool
)
224 if ( dependencies
.length () > 0 )
226 dependencies
+= module
.GetDependencyPath ();
233 MingwBackend::GenerateInitTarget () const
238 " $(ROS_INTERMEDIATE)." SSEP
"tools" );
241 GetBuildToolDependencies ().c_str () );
244 "include" SSEP
"reactos" SSEP
"buildno.h" );
249 "$(ROS_INTERMEDIATE)." SSEP
"tools:\n" );
251 "ifneq ($(ROS_INTERMEDIATE),)\n" );
253 "\t${nmkdir} $(ROS_INTERMEDIATE)\n" );
257 "\t${nmkdir} $(ROS_INTERMEDIATE)." SSEP
"tools\n" );
263 MingwBackend::GenerateXmlBuildFilesMacro() const
266 "XMLBUILDFILES = %s \\\n",
267 ProjectNode
.GetProjectFilename ().c_str () );
268 string xmlbuildFilenames
;
269 int numberOfExistingFiles
= 0;
270 for ( size_t i
= 0; i
< ProjectNode
.xmlbuildfiles
.size (); i
++ )
272 XMLInclude
& xmlbuildfile
= *ProjectNode
.xmlbuildfiles
[i
];
273 if ( !xmlbuildfile
.fileExists
)
275 numberOfExistingFiles
++;
276 if ( xmlbuildFilenames
.length () > 0 )
277 xmlbuildFilenames
+= " ";
278 xmlbuildFilenames
+= NormalizeFilename ( xmlbuildfile
.topIncludeFilename
);
279 if ( numberOfExistingFiles
% 5 == 4 || i
== ProjectNode
.xmlbuildfiles
.size () - 1 )
283 xmlbuildFilenames
.c_str ());
284 if ( i
== ProjectNode
.xmlbuildfiles
.size () - 1 )
293 xmlbuildFilenames
.c_str () );
295 xmlbuildFilenames
.resize ( 0 );
297 numberOfExistingFiles
++;
304 MingwBackend::CheckAutomaticDependencies ()
306 AutomaticDependency
automaticDependency ( ProjectNode
);
307 automaticDependency
.Process ();
308 automaticDependency
.CheckAutomaticDependencies ();
312 MingwBackend::ProcessModule ( Module
& module
) const
314 MingwModuleHandler
* h
= MingwModuleHandler::LookupHandler (
315 module
.node
.location
,
317 h
->Process ( module
);
318 h
->GenerateDirectoryTargets ();
322 FixupTargetFilename ( const string
& targetFilename
)
324 return string("$(ROS_INTERMEDIATE)") + NormalizeFilename ( targetFilename
);