5 #include "../../rbuild.h"
7 #include "modulehandler.h"
12 MingwModuleHandler::MingwModuleHandler ( FILE* fMakefile
)
13 : fMakefile ( fMakefile
)
18 MingwModuleHandler::GetWorkingDirectory ()
24 MingwModuleHandler::ReplaceExtension ( string filename
,
27 size_t index
= filename
.find_last_of ( '.' );
28 if (index
!= string::npos
)
29 return filename
.substr ( 0, index
) + newExtension
;
34 MingwModuleHandler::GetModuleArchiveFilename ( Module
& module
)
36 return ReplaceExtension ( module
.GetPath ().c_str (),
41 MingwModuleHandler::GetImportLibraryDependencies ( Module
& module
)
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 Module
* importedModule
= module
.project
->LocateModule ( module
.libraries
[i
]->name
);
52 assert ( importedModule
!= NULL
);
53 dependencies
+= importedModule
->GetPath ().c_str ();
59 MingwModuleHandler::GetSourceFilenames ( Module
& module
)
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 ( string sourceFilename
)
77 return ReplaceExtension ( sourceFilename
,
82 MingwModuleHandler::GetObjectFilenames ( Module
& module
)
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 ( vector
<Define
*> defines
)
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 ( Module
& module
)
120 string parameters
= GenerateGccDefineParametersFromVector ( module
.project
->defines
);
121 string s
= GenerateGccDefineParametersFromVector ( module
.defines
);
131 MingwModuleHandler::ConcatenatePaths ( string path1
,
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 ( string basePath
,
144 vector
<Include
*> includes
)
147 for (size_t i
= 0; i
< includes
.size (); i
++)
149 Include
& include
= *includes
[i
];
150 if (parameters
.length () > 0)
153 parameters
+= ConcatenatePaths ( basePath
,
160 MingwModuleHandler::GenerateGccIncludeParameters ( Module
& module
)
162 string parameters
= GenerateGccIncludeParametersFromVector ( ".",
163 module
.project
->includes
);
164 string s
= GenerateGccIncludeParametersFromVector ( module
.path
,
175 MingwModuleHandler::GenerateGccParameters ( Module
& module
)
177 string parameters
= GenerateGccDefineParameters ( module
);
178 string s
= GenerateGccIncludeParameters ( module
);
188 MingwModuleHandler::GenerateObjectFileTargets ( Module
& module
)
190 if ( module
.files
.size () == 0 )
193 for ( size_t i
= 0; i
< module
.files
.size (); i
++ )
195 string sourceFilename
= module
.files
[i
]->name
;
196 string objectFilename
= GetObjectFilename ( sourceFilename
);
199 objectFilename
.c_str (),
200 sourceFilename
.c_str() );
202 "\t${gcc} -c %s -o %s %s\n",
203 sourceFilename
.c_str (),
204 objectFilename
.c_str (),
205 GenerateGccParameters ( module
).c_str () );
208 fprintf ( fMakefile
, "\n" );
212 MingwModuleHandler::GenerateArchiveTarget ( Module
& module
)
214 string archiveFilename
= GetModuleArchiveFilename ( module
);
215 string sourceFilenames
= GetSourceFilenames ( module
);
216 string objectFilenames
= GetObjectFilenames ( module
);
220 archiveFilename
.c_str (),
221 objectFilenames
.c_str ());
224 "\t${ar} -rc %s %s\n\n",
225 archiveFilename
.c_str (),
226 objectFilenames
.c_str ());
230 MingwKernelModuleHandler::MingwKernelModuleHandler ( FILE* fMakefile
)
231 : MingwModuleHandler ( fMakefile
)
236 MingwKernelModuleHandler::CanHandleModule ( Module
& module
)
238 return module
.type
== KernelModeDLL
;
242 MingwKernelModuleHandler::Process ( Module
& module
)
244 GenerateKernelModuleTarget ( module
);
248 MingwKernelModuleHandler::GenerateKernelModuleTarget ( Module
& module
)
250 string workingDirectory
= GetWorkingDirectory ( );
251 string archiveFilename
= GetModuleArchiveFilename ( module
);
252 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
253 fprintf ( fMakefile
, "%s: %s %s\n",
254 module
.GetPath ().c_str (),
255 archiveFilename
.c_str (),
256 importLibraryDependencies
.c_str () );
258 "\t${gcc} -Wl,--base-file,%s" SSEP
"base.tmp -o %s" SSEP
"junk.tmp %s %s\n",
259 workingDirectory
.c_str (),
260 workingDirectory
.c_str (),
261 archiveFilename
.c_str (),
262 importLibraryDependencies
.c_str () );
264 "\t${rm} %s" SSEP
"junk.tmp\n",
265 workingDirectory
.c_str () );
267 "\t${dlltool} --dllname %s --base-file %s" SSEP
"base.tmp --output-exp %s" SSEP
"temp.exp --kill-at\n",
268 module
.GetPath ().c_str (),
269 workingDirectory
.c_str (),
270 workingDirectory
.c_str ());
272 "\t${rm} %s" SSEP
"base.tmp\n",
273 workingDirectory
.c_str () );
275 "\t${ld} -Wl,%s" SSEP
"temp.exp -o %s %s %s\n",
276 workingDirectory
.c_str (),
277 module
.GetPath ().c_str (),
278 archiveFilename
.c_str (),
279 importLibraryDependencies
.c_str () );
281 "\t${rm} %s" SSEP
"temp.exp\n",
282 workingDirectory
.c_str () );
284 GenerateArchiveTarget ( module
);
285 GenerateObjectFileTargets ( module
);
289 MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ( FILE* fMakefile
)
290 : MingwModuleHandler ( fMakefile
)
295 MingwStaticLibraryModuleHandler::CanHandleModule ( Module
& module
)
297 return module
.type
== StaticLibrary
;
301 MingwStaticLibraryModuleHandler::Process ( Module
& module
)
303 GenerateStaticLibraryModuleTarget ( module
);
307 MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( Module
& module
)
309 GenerateArchiveTarget ( module
);
310 GenerateObjectFileTargets ( module
);