Generate dependencies for kernel module type.
[reactos.git] / reactos / tools / rbuild / backend / mingw / mingw.cpp
1
2 #include "../../pch.h"
3
4 #include "mingw.h"
5
6 using std::string;
7 using std::vector;
8
9 static class MingwFactory : public Backend::Factory
10 {
11 public:
12 MingwFactory() : Factory ( "mingw" ) {}
13 Backend* operator() ( Project& project )
14 {
15 return new MingwBackend ( project );
16 }
17 } factory;
18
19
20 MingwBackend::MingwBackend ( Project& project )
21 : Backend ( project )
22 {
23 }
24
25 void
26 MingwBackend::Process ()
27 {
28 CreateMakefile ();
29 GenerateHeader ();
30 GenerateGlobalVariables ();
31 GenerateAllTarget ();
32 for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )
33 {
34 Module& module = *ProjectNode.modules[i];
35 ProcessModule ( module );
36 }
37 CloseMakefile ();
38 }
39
40 void
41 MingwBackend::CreateMakefile ()
42 {
43 fMakefile = fopen ( ProjectNode.makefile.c_str (), "w" );
44 if ( !fMakefile )
45 throw AccessDeniedException ( ProjectNode.makefile );
46 }
47
48 void
49 MingwBackend::CloseMakefile ()
50 {
51 if (fMakefile)
52 fclose ( fMakefile );
53 }
54
55 void
56 MingwBackend::GenerateHeader ()
57 {
58 fprintf ( fMakefile, "# THIS FILE IS AUTOMATICALLY GENERATED, EDIT 'ReactOS.xml' INSTEAD\n\n" );
59 }
60
61 void
62 MingwBackend::GenerateGlobalVariables ()
63 {
64 fprintf ( fMakefile, "gcc = gcc\n" );
65 fprintf ( fMakefile, "ld = ld\n" );
66 fprintf ( fMakefile, "ar = ar\n" );
67 fprintf ( fMakefile, "\n" );
68 }
69
70 void
71 MingwBackend::GenerateAllTarget ()
72 {
73 fprintf ( fMakefile, "all:" );
74 for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )
75 {
76 Module& module = *ProjectNode.modules[i];
77 fprintf ( fMakefile,
78 " %s",
79 module.GetPath ().c_str () );
80 }
81 fprintf ( fMakefile, "\n\t\n\n" );
82 }
83
84 void
85 MingwBackend::ProcessModule ( Module& module )
86 {
87 MingwModuleHandlerList moduleHandlers;
88 GetModuleHandlers ( moduleHandlers );
89 for (size_t i = 0; i < moduleHandlers.size (); i++)
90 {
91 MingwModuleHandler& moduleHandler = *moduleHandlers[i];
92 if (moduleHandler.CanHandleModule ( module ) )
93 {
94 moduleHandler.Process ( module );
95 return;
96 }
97 }
98 }
99
100 void
101 MingwBackend::GetModuleHandlers ( MingwModuleHandlerList& moduleHandlers )
102 {
103 moduleHandlers.push_back ( new MingwKernelModuleHandler ( fMakefile ) );
104 }