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 ( FixupTargetFilename(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
+= FixupTargetFilename(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
78 FixupTargetFilename ( ReplaceExtension ( sourceFilename
,
83 MingwModuleHandler::GetObjectFilenames ( const Module
& module
) const
85 if ( module
.files
.size () == 0 )
88 string
objectFilenames ( "" );
89 for ( size_t i
= 0; i
< module
.files
.size (); i
++ )
91 if ( objectFilenames
.size () > 0 )
92 objectFilenames
+= " ";
93 objectFilenames
+= GetObjectFilename ( module
.files
[i
]->name
);
95 return objectFilenames
;
99 MingwModuleHandler::GenerateGccDefineParametersFromVector ( const vector
<Define
*>& defines
) const
102 for (size_t i
= 0; i
< defines
.size (); i
++)
104 Define
& define
= *defines
[i
];
105 if (parameters
.length () > 0)
108 parameters
+= define
.name
;
109 if (define
.value
.length () > 0)
112 parameters
+= define
.value
;
119 MingwModuleHandler::GenerateGccDefineParameters ( const Module
& module
) const
121 string parameters
= GenerateGccDefineParametersFromVector ( module
.project
.defines
);
122 string s
= GenerateGccDefineParametersFromVector ( module
.defines
);
132 MingwModuleHandler::ConcatenatePaths ( const string
& path1
,
133 const string
& path2
) const
135 if ( ( path1
.length () == 0 ) || ( path1
== "." ) || ( path1
== "./" ) )
137 if ( path1
[path1
.length ()] == CSEP
)
138 return path1
+ path2
;
140 return path1
+ CSEP
+ path2
;
144 MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const vector
<Include
*>& includes
) const
147 for (size_t i
= 0; i
< includes
.size (); i
++)
149 Include
& include
= *includes
[i
];
150 if (parameters
.length () > 0)
152 parameters
+= "-I" + include
.directory
;
158 MingwModuleHandler::GenerateGccIncludeParameters ( const Module
& module
) const
160 string parameters
= GenerateGccIncludeParametersFromVector ( module
.project
.includes
);
161 string s
= GenerateGccIncludeParametersFromVector ( module
.includes
);
171 MingwModuleHandler::GenerateGccParameters ( const Module
& module
) const
173 string parameters
= GenerateGccDefineParameters ( module
);
174 string s
= GenerateGccIncludeParameters ( module
);
184 MingwModuleHandler::GenerateObjectFileTargets ( const Module
& module
) const
186 if ( module
.files
.size () == 0 )
189 for ( size_t i
= 0; i
< module
.files
.size (); i
++ )
191 string sourceFilename
= module
.files
[i
]->name
;
192 string objectFilename
= GetObjectFilename ( sourceFilename
);
195 objectFilename
.c_str (),
196 sourceFilename
.c_str() );
198 "\t${gcc} -c %s -o %s %s\n",
199 sourceFilename
.c_str (),
200 objectFilename
.c_str (),
201 GenerateGccParameters ( module
).c_str () );
204 fprintf ( fMakefile
, "\n" );
208 MingwModuleHandler::GenerateArchiveTarget ( const Module
& module
) const
210 string archiveFilename
= GetModuleArchiveFilename ( module
);
211 string sourceFilenames
= GetSourceFilenames ( module
);
212 string objectFilenames
= GetObjectFilenames ( module
);
216 archiveFilename
.c_str (),
217 objectFilenames
.c_str ());
220 "\t${ar} -rc %s %s\n\n",
221 archiveFilename
.c_str (),
222 objectFilenames
.c_str ());
226 MingwKernelModuleHandler::MingwKernelModuleHandler ( FILE* fMakefile
)
227 : MingwModuleHandler ( fMakefile
)
232 MingwKernelModuleHandler::CanHandleModule ( const Module
& module
) const
234 return module
.type
== KernelModeDLL
;
238 MingwKernelModuleHandler::Process ( const Module
& module
)
240 GenerateKernelModuleTarget ( module
);
244 MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module
& module
)
246 static string
ros_junk ( "$(ROS_TEMPORARY)" );
247 //static string ros_output ( "$(ROS_INTERMEDIATE)" );
248 string
target ( FixupTargetFilename(module
.GetPath()) );
249 string workingDirectory
= GetWorkingDirectory ( );
250 string archiveFilename
= GetModuleArchiveFilename ( module
);
251 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
252 string base_tmp
= ros_junk
+ module
.name
+ ".base.tmp";
253 string junk_tmp
= ros_junk
+ module
.name
+ ".junk.tmp";
254 string temp_exp
= ros_junk
+ module
.name
+ ".temp.exp";
255 fprintf ( fMakefile
, "%s: %s %s\n",
257 archiveFilename
.c_str (),
258 importLibraryDependencies
.c_str () );
260 "\t${gcc} -Wl,--base-file,%s -o %s %s %s\n",
263 archiveFilename
.c_str (),
264 importLibraryDependencies
.c_str () );
269 "\t${dlltool} --dllname %s --base-file %s --output-exp %s --kill-at\n",
277 "\t${ld} -Wl,%s -o %s %s %s\n",
280 archiveFilename
.c_str (),
281 importLibraryDependencies
.c_str () );
286 GenerateArchiveTarget ( module
);
287 GenerateObjectFileTargets ( module
);
291 MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ( FILE* fMakefile
)
292 : MingwModuleHandler ( fMakefile
)
297 MingwStaticLibraryModuleHandler::CanHandleModule ( const Module
& module
) const
299 return module
.type
== StaticLibrary
;
303 MingwStaticLibraryModuleHandler::Process ( const Module
& module
)
305 GenerateStaticLibraryModuleTarget ( module
);
309 MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Module
& module
)
311 GenerateArchiveTarget ( module
);
312 GenerateObjectFileTargets ( module
);