5 #include "../../rbuild.h"
7 #include "modulehandler.h"
12 MingwModuleHandler::MingwModuleHandler ( FILE* fMakefile
)
13 : fMakefile ( fMakefile
)
18 MingwModuleHandler::GetWorkingDirectory () const
24 MingwModuleHandler::ReplaceExtension ( const string
& filename
,
25 const string
& newExtension
) const
27 size_t index
= filename
.find_last_of ( '.' );
28 if (index
!= string::npos
)
29 return filename
.substr ( 0, index
) + newExtension
;
34 MingwModuleHandler::GetModuleArchiveFilename ( const Module
& module
) const
36 return ReplaceExtension ( module
.GetPath ().c_str (),
41 MingwModuleHandler::GetImportLibraryDependencies ( const Module
& module
) const
43 if ( module
.libraries
.size () == 0 )
46 string
dependencies ( "" );
47 for ( size_t i
= 0; i
< module
.libraries
.size (); i
++ )
49 if ( dependencies
.size () > 0 )
51 const Module
* importedModule
= module
.project
.LocateModule ( module
.libraries
[i
]->name
);
52 assert ( importedModule
!= NULL
);
53 dependencies
+= importedModule
->GetPath ().c_str ();
59 MingwModuleHandler::GetSourceFilenames ( const Module
& module
) const
61 if ( module
.files
.size () == 0 )
64 string
sourceFilenames ( "" );
65 for ( size_t i
= 0; i
< module
.files
.size (); i
++ )
67 if ( sourceFilenames
.size () > 0 )
68 sourceFilenames
+= " ";
69 sourceFilenames
+= module
.files
[i
]->name
;
71 return sourceFilenames
;
75 MingwModuleHandler::GetObjectFilename ( const string
& sourceFilename
) const
77 return ReplaceExtension ( sourceFilename
,
82 MingwModuleHandler::GetObjectFilenames ( const Module
& module
) const
84 if ( module
.files
.size () == 0 )
87 string
objectFilenames ( "" );
88 for ( size_t i
= 0; i
< module
.files
.size (); i
++ )
90 if ( objectFilenames
.size () > 0 )
91 objectFilenames
+= " ";
92 objectFilenames
+= GetObjectFilename ( module
.files
[i
]->name
);
94 return objectFilenames
;
98 MingwModuleHandler::GenerateGccDefineParametersFromVector ( const vector
<Define
*>& defines
) const
101 for (size_t i
= 0; i
< defines
.size (); i
++)
103 Define
& define
= *defines
[i
];
104 if (parameters
.length () > 0)
107 parameters
+= define
.name
;
108 if (define
.value
.length () > 0)
111 parameters
+= define
.value
;
118 MingwModuleHandler::GenerateGccDefineParameters ( const Module
& module
) const
120 string parameters
= GenerateGccDefineParametersFromVector ( module
.project
.defines
);
121 string s
= GenerateGccDefineParametersFromVector ( module
.defines
);
131 MingwModuleHandler::ConcatenatePaths ( const string
& path1
,
132 const string
& path2
) const
134 if ( ( path1
.length () == 0 ) || ( path1
== "." ) || ( path1
== "./" ) )
136 if ( path1
[path1
.length ()] == CSEP
)
137 return path1
+ path2
;
139 return path1
+ CSEP
+ path2
;
143 MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const vector
<Include
*>& includes
) const
146 for (size_t i
= 0; i
< includes
.size (); i
++)
148 Include
& include
= *includes
[i
];
149 if (parameters
.length () > 0)
151 parameters
+= "-I" + include
.directory
;
157 MingwModuleHandler::GenerateGccIncludeParameters ( const Module
& module
) const
159 string parameters
= GenerateGccIncludeParametersFromVector ( module
.project
.includes
);
160 string s
= GenerateGccIncludeParametersFromVector ( module
.includes
);
170 MingwModuleHandler::GenerateGccParameters ( const Module
& module
) const
172 string parameters
= GenerateGccDefineParameters ( module
);
173 string s
= GenerateGccIncludeParameters ( module
);
183 MingwModuleHandler::GenerateObjectFileTargets ( const Module
& module
) const
185 if ( module
.files
.size () == 0 )
188 for ( size_t i
= 0; i
< module
.files
.size (); i
++ )
190 string sourceFilename
= module
.files
[i
]->name
;
191 string objectFilename
= GetObjectFilename ( sourceFilename
);
194 objectFilename
.c_str (),
195 sourceFilename
.c_str() );
197 "\t${gcc} -c %s -o %s %s\n",
198 sourceFilename
.c_str (),
199 objectFilename
.c_str (),
200 GenerateGccParameters ( module
).c_str () );
203 fprintf ( fMakefile
, "\n" );
207 MingwModuleHandler::GenerateArchiveTarget ( const Module
& module
) const
209 string archiveFilename
= GetModuleArchiveFilename ( module
);
210 string sourceFilenames
= GetSourceFilenames ( module
);
211 string objectFilenames
= GetObjectFilenames ( module
);
215 archiveFilename
.c_str (),
216 objectFilenames
.c_str ());
219 "\t${ar} -rc %s %s\n\n",
220 archiveFilename
.c_str (),
221 objectFilenames
.c_str ());
225 MingwKernelModuleHandler::MingwKernelModuleHandler ( FILE* fMakefile
)
226 : MingwModuleHandler ( fMakefile
)
231 MingwKernelModuleHandler::CanHandleModule ( const Module
& module
) const
233 return module
.type
== KernelModeDLL
;
237 MingwKernelModuleHandler::Process ( const Module
& module
)
239 GenerateKernelModuleTarget ( module
);
243 MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module
& module
)
245 string workingDirectory
= GetWorkingDirectory ( );
246 string archiveFilename
= GetModuleArchiveFilename ( module
);
247 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
248 fprintf ( fMakefile
, "%s: %s %s\n",
249 module
.GetPath ().c_str (),
250 archiveFilename
.c_str (),
251 importLibraryDependencies
.c_str () );
253 "\t${gcc} -Wl,--base-file,%s" SSEP
"base.tmp -o %s" SSEP
"junk.tmp %s %s\n",
254 workingDirectory
.c_str (),
255 workingDirectory
.c_str (),
256 archiveFilename
.c_str (),
257 importLibraryDependencies
.c_str () );
259 "\t${rm} %s" SSEP
"junk.tmp\n",
260 workingDirectory
.c_str () );
262 "\t${dlltool} --dllname %s --base-file %s" SSEP
"base.tmp --output-exp %s" SSEP
"temp.exp --kill-at\n",
263 module
.GetPath ().c_str (),
264 workingDirectory
.c_str (),
265 workingDirectory
.c_str ());
267 "\t${rm} %s" SSEP
"base.tmp\n",
268 workingDirectory
.c_str () );
270 "\t${ld} -Wl,%s" SSEP
"temp.exp -o %s %s %s\n",
271 workingDirectory
.c_str (),
272 module
.GetPath ().c_str (),
273 archiveFilename
.c_str (),
274 importLibraryDependencies
.c_str () );
276 "\t${rm} %s" SSEP
"temp.exp\n",
277 workingDirectory
.c_str () );
279 GenerateArchiveTarget ( module
);
280 GenerateObjectFileTargets ( module
);
284 MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ( FILE* fMakefile
)
285 : MingwModuleHandler ( fMakefile
)
290 MingwStaticLibraryModuleHandler::CanHandleModule ( const Module
& module
) const
292 return module
.type
== StaticLibrary
;
296 MingwStaticLibraryModuleHandler::Process ( const Module
& module
)
298 GenerateStaticLibraryModuleTarget ( module
);
302 MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Module
& module
)
304 GenerateArchiveTarget ( module
);
305 GenerateObjectFileTargets ( module
);