\r
#include "../../pch.h"\r
+#include <assert.h>\r
\r
#include "../../rbuild.h"\r
#include "mingw.h"\r
#include "modulehandler.h"\r
\r
using std::string;\r
+using std::vector;\r
+using std::map;\r
\r
-MingwModuleHandler::MingwModuleHandler ( FILE* fMakefile )\r
- : fMakefile ( fMakefile )\r
+map<ModuleType,MingwModuleHandler*>*\r
+MingwModuleHandler::handler_map = NULL;\r
+int\r
+MingwModuleHandler::ref = 0;\r
+\r
+FILE*\r
+MingwModuleHandler::fMakefile = NULL;\r
+\r
+MingwModuleHandler::MingwModuleHandler ( ModuleType moduletype )\r
+{\r
+ if ( !ref++ )\r
+ handler_map = new map<ModuleType,MingwModuleHandler*>;\r
+ (*handler_map)[moduletype] = this;\r
+}\r
+\r
+MingwModuleHandler::~MingwModuleHandler()\r
+{\r
+ if ( !--ref )\r
+ {\r
+ delete handler_map;\r
+ handler_map = NULL;\r
+ }\r
+}\r
+\r
+/*static*/ void\r
+MingwModuleHandler::SetMakefile ( FILE* f )\r
{\r
+ fMakefile = f;\r
+}\r
+\r
+/*static*/ MingwModuleHandler*\r
+MingwModuleHandler::LookupHandler ( const string& location,\r
+ ModuleType moduletype )\r
+{\r
+ if ( !handler_map )\r
+ throw Exception ( "internal tool error: no registered module handlers" );\r
+ MingwModuleHandler* h = (*handler_map)[moduletype];\r
+ if ( !h )\r
+ {\r
+ throw UnknownModuleTypeException ( location, moduletype );\r
+ return NULL;\r
+ }\r
+ return h;\r
}\r
\r
string\r
-MingwModuleHandler::GetModuleDependencies ( Module& module )\r
+MingwModuleHandler::GetWorkingDirectory () const\r
{\r
- if ( !module.libraries.size() )\r
+ return ".";\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetExtension ( const string& filename ) const\r
+{\r
+ size_t index = filename.find_last_of ( '.' );\r
+ if (index != string::npos)\r
+ return filename.substr ( index );\r
+ return "";\r
+}\r
+\r
+string\r
+MingwModuleHandler::ReplaceExtension ( const string& filename,\r
+ const string& newExtension ) const\r
+{\r
+ size_t index = filename.find_last_of ( '.' );\r
+ if (index != string::npos)\r
+ return filename.substr ( 0, index ) + newExtension;\r
+ return filename;\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetModuleArchiveFilename ( const Module& module ) const\r
+{\r
+ return ReplaceExtension ( FixupTargetFilename ( module.GetPath () ).c_str (),\r
+ ".a" );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetImportLibraryDependencies ( const Module& module ) const\r
+{\r
+ if ( module.libraries.size () == 0 )\r
return "";\r
+ \r
+ string dependencies ( "" );\r
+ for ( size_t i = 0; i < module.libraries.size (); i++ )\r
+ {\r
+ if ( dependencies.size () > 0 )\r
+ dependencies += " ";\r
+ const Module* importedModule = module.project.LocateModule ( module.libraries[i]->name );\r
+ assert ( importedModule != NULL );\r
+ dependencies += FixupTargetFilename ( importedModule->GetDependencyPath () ).c_str ();\r
+ }\r
+ return dependencies;\r
+}\r
\r
- string dependencies ( module.libraries[0]->name );\r
+string\r
+MingwModuleHandler::GetModuleDependencies ( const Module& module ) const\r
+{\r
+ if ( module.dependencies.size () == 0 )\r
+ return "";\r
+ \r
+ string dependencies ( "" );\r
+ for ( size_t i = 0; i < module.dependencies.size (); i++ )\r
+ {\r
+ if ( dependencies.size () > 0 )\r
+ dependencies += " ";\r
+ const Dependency* dependency = module.dependencies[i];\r
+ const Module* dependencyModule = dependency->dependencyModule;\r
+ dependencies += dependencyModule->GetTargets ();\r
+ }\r
+ return dependencies;\r
+}\r
\r
- for ( size_t i = 1; i < module.libraries.size(); i++ )\r
+string\r
+MingwModuleHandler::GetAllDependencies ( const Module& module ) const\r
+{\r
+ string dependencies = GetImportLibraryDependencies ( module );\r
+ string s = GetModuleDependencies ( module );\r
+ if (s.length () > 0)\r
{\r
- dependencies += " " + module.libraries[i]->name;\r
+ dependencies += " ";\r
+ dependencies += s;\r
}\r
return dependencies;\r
}\r
\r
+string\r
+MingwModuleHandler::GetSourceFilenames ( const Module& module ) const\r
+{\r
+ size_t i;\r
+\r
+ string sourceFilenames ( "" );\r
+ for ( i = 0; i < module.files.size (); i++ )\r
+ sourceFilenames += " " + module.files[i]->name;\r
+ vector<If*> ifs = module.ifs;\r
+ for ( i = 0; i < ifs.size(); i++ )\r
+ {\r
+ size_t j;\r
+ If& rIf = *ifs[i];\r
+ for ( j = 0; j < rIf.ifs.size(); j++ )\r
+ ifs.push_back ( rIf.ifs[j] );\r
+ for ( j = 0; j < rIf.files.size(); j++ )\r
+ sourceFilenames += " " + rIf.files[j]->name;\r
+ }\r
+ return sourceFilenames;\r
+}\r
\r
-MingwKernelModuleHandler::MingwKernelModuleHandler ( FILE* fMakefile )\r
- : MingwModuleHandler ( fMakefile )\r
+string\r
+MingwModuleHandler::GetObjectFilename ( const string& sourceFilename ) const\r
{\r
+ return FixupTargetFilename ( ReplaceExtension ( sourceFilename,\r
+ ".o" ) );\r
}\r
\r
-bool\r
-MingwKernelModuleHandler::CanHandleModule ( Module& module )\r
+string\r
+MingwModuleHandler::GetObjectFilenames ( const Module& module ) const\r
{\r
- return true;\r
+ if ( module.files.size () == 0 )\r
+ return "";\r
+ \r
+ string objectFilenames ( "" );\r
+ for ( size_t i = 0; i < module.files.size (); i++ )\r
+ {\r
+ if ( objectFilenames.size () > 0 )\r
+ objectFilenames += " ";\r
+ objectFilenames += GetObjectFilename ( module.files[i]->name );\r
+ }\r
+ return objectFilenames;\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateGccDefineParametersFromVector ( const vector<Define*>& defines ) const\r
+{\r
+ string parameters;\r
+ for (size_t i = 0; i < defines.size (); i++)\r
+ {\r
+ Define& define = *defines[i];\r
+ if (parameters.length () > 0)\r
+ parameters += " ";\r
+ parameters += "-D";\r
+ parameters += define.name;\r
+ if (define.value.length () > 0)\r
+ {\r
+ parameters += "=";\r
+ parameters += define.value;\r
+ }\r
+ }\r
+ return parameters;\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateGccDefineParameters ( const Module& module ) const\r
+{\r
+ string parameters = GenerateGccDefineParametersFromVector ( module.project.defines );\r
+ string s = GenerateGccDefineParametersFromVector ( module.defines );\r
+ if (s.length () > 0)\r
+ {\r
+ parameters += " ";\r
+ parameters += s;\r
+ }\r
+ return parameters;\r
+}\r
+\r
+string\r
+MingwModuleHandler::ConcatenatePaths ( const string& path1,\r
+ const string& path2 ) const\r
+{\r
+ if ( ( path1.length () == 0 ) || ( path1 == "." ) || ( path1 == "./" ) )\r
+ return path2;\r
+ if ( path1[path1.length ()] == CSEP )\r
+ return path1 + path2;\r
+ else\r
+ return path1 + CSEP + path2;\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const vector<Include*>& includes ) const\r
+{\r
+ string parameters;\r
+ for ( size_t i = 0; i < includes.size (); i++ )\r
+ {\r
+ Include& include = *includes[i];\r
+ if (parameters.length () > 0)\r
+ parameters += " ";\r
+ parameters += "-I" + include.directory;\r
+ }\r
+ return parameters;\r
}\r
\r
void\r
-MingwKernelModuleHandler::Process ( Module& module )\r
+MingwModuleHandler::GenerateGccModuleIncludeVariable ( const Module& module ) const\r
{\r
- GenerateKernelModuleTarget ( module );\r
+#if 0\r
+ string name ( module.name + "_CFLAGS" );\r
+ fprintf ( fMakefile,\r
+ "%s := %s %s\n",\r
+ name.c_str(),\r
+ GenerateGccDefineParameters(module).c_str(),\r
+ GenerateGccIncludeParameters(module).c_str() );\r
+#endif\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const\r
+{\r
+ string parameters = GenerateGccIncludeParametersFromVector ( module.includes );\r
+ string s = GenerateGccIncludeParametersFromVector ( module.project.includes );\r
+ if ( s.length () > 0 )\r
+ {\r
+ parameters += " ";\r
+ parameters += s;\r
+ }\r
+ return parameters;\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateMacros (\r
+ const char* op,\r
+ const vector<File*>& files,\r
+ const vector<Include*>& includes,\r
+ const vector<Define*>& defines,\r
+ const vector<If*>& ifs,\r
+ const string& cflags_macro,\r
+ const string& nasmflags_macro,\r
+ const string& objs_macro) const\r
+{\r
+ size_t i;\r
+\r
+ if ( includes.size() || defines.size() )\r
+ {\r
+ fprintf (\r
+ fMakefile,\r
+ "%s %s",\r
+ cflags_macro.c_str(),\r
+ op );\r
+ for ( i = 0; i < includes.size(); i++ )\r
+ {\r
+ fprintf (\r
+ fMakefile,\r
+ " -I%s",\r
+ includes[i]->directory.c_str() );\r
+ }\r
+ for ( i = 0; i < defines.size(); i++ )\r
+ {\r
+ Define& d = *defines[i];\r
+ fprintf (\r
+ fMakefile,\r
+ " -D%s",\r
+ d.name.c_str() );\r
+ if ( d.value.size() )\r
+ fprintf (\r
+ fMakefile,\r
+ "=%s",\r
+ d.value.c_str() );\r
+ }\r
+ fprintf ( fMakefile, "\n" );\r
+ }\r
+\r
+ if ( files.size() )\r
+ {\r
+ fprintf (\r
+ fMakefile,\r
+ "%s %s",\r
+ objs_macro.c_str(),\r
+ op );\r
+ for ( i = 0; i < files.size(); i++ )\r
+ {\r
+ fprintf (\r
+ fMakefile,\r
+ "%s%s",\r
+ ( i%10 == 9 ? "\\\n\t" : " " ),\r
+ GetObjectFilename(files[i]->name).c_str() );\r
+ }\r
+ fprintf ( fMakefile, "\n" );\r
+ }\r
+\r
+ for ( i = 0; i < ifs.size(); i++ )\r
+ {\r
+ If& rIf = *ifs[i];\r
+ if ( rIf.defines.size() || rIf.includes.size() || rIf.files.size() || rIf.ifs.size() )\r
+ {\r
+ fprintf (\r
+ fMakefile,\r
+ "ifeq (\"$(%s)\",\"%s\")\n",\r
+ rIf.property.c_str(),\r
+ rIf.value.c_str() );\r
+ GenerateMacros (\r
+ "+=",\r
+ rIf.files,\r
+ rIf.includes,\r
+ rIf.defines,\r
+ rIf.ifs,\r
+ cflags_macro,\r
+ nasmflags_macro,\r
+ objs_macro );\r
+ fprintf ( \r
+ fMakefile,\r
+ "endif\n\n" );\r
+ }\r
+ }\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateMacros (\r
+ const Module& module,\r
+ const string& cflags_macro,\r
+ const string& nasmflags_macro,\r
+ const string& objs_macro) const\r
+{\r
+ GenerateMacros (\r
+ "=",\r
+ module.files,\r
+ module.includes,\r
+ module.defines,\r
+ module.ifs,\r
+ cflags_macro,\r
+ nasmflags_macro,\r
+ objs_macro );\r
+ fprintf ( fMakefile, "\n" );\r
+\r
+ fprintf (\r
+ fMakefile,\r
+ "%s += $(PROJECT_CFLAGS)\n\n",\r
+ cflags_macro.c_str () );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateGccCommand ( const Module& module,\r
+ const string& sourceFilename,\r
+ const string& cc,\r
+ const string& cflagsMacro ) const\r
+{\r
+ string objectFilename = GetObjectFilename ( sourceFilename );\r
+ return ssprintf ( "%s -c %s -o %s %s\n",\r
+ cc.c_str (),\r
+ sourceFilename.c_str (),\r
+ objectFilename.c_str (),\r
+ cflagsMacro.c_str () );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateGccAssemblerCommand ( const Module& module,\r
+ const string& sourceFilename,\r
+ const string& cc,\r
+ const string& cflagsMacro ) const\r
+{\r
+ string objectFilename = GetObjectFilename ( sourceFilename );\r
+ return ssprintf ( "%s -x assembler-with-cpp -c %s -o %s -D__ASM__ %s\n",\r
+ cc.c_str (),\r
+ sourceFilename.c_str (),\r
+ objectFilename.c_str (),\r
+ cflagsMacro.c_str () );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateNasmCommand ( const Module& module,\r
+ const string& sourceFilename,\r
+ const string& nasmflagsMacro ) const\r
+{\r
+ string objectFilename = GetObjectFilename ( sourceFilename );\r
+ return ssprintf ( "%s -f win32 %s -o %s %s\n",\r
+ "nasm",\r
+ sourceFilename.c_str (),\r
+ objectFilename.c_str (),\r
+ nasmflagsMacro.c_str () );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateCommand ( const Module& module,\r
+ const string& sourceFilename,\r
+ const string& cc,\r
+ const string& cflagsMacro,\r
+ const string& nasmflagsMacro ) const\r
+{\r
+ string extension = GetExtension ( sourceFilename );\r
+ if ( extension == ".c" || extension == ".C" )\r
+ return GenerateGccCommand ( module,\r
+ sourceFilename,\r
+ cc,\r
+ cflagsMacro );\r
+ else if ( extension == ".s" || extension == ".S" )\r
+ return GenerateGccAssemblerCommand ( module,\r
+ sourceFilename,\r
+ cc,\r
+ cflagsMacro );\r
+ else if ( extension == ".asm" || extension == ".ASM" )\r
+ return GenerateNasmCommand ( module,\r
+ sourceFilename,\r
+ nasmflagsMacro );\r
+\r
+ throw InvalidOperationException ( __FILE__,\r
+ __LINE__,\r
+ "Unsupported filename extension '%s' in file '%s'",\r
+ extension.c_str (),\r
+ sourceFilename.c_str () );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,\r
+ const vector<File*>& files,\r
+ const vector<If*>& ifs,\r
+ const string& cc,\r
+ const string& cflagsMacro,\r
+ const string& nasmflagsMacro ) const\r
+{\r
+ size_t i;\r
+\r
+ for ( i = 0; i < files.size (); i++ )\r
+ {\r
+ string sourceFilename = files[i]->name;\r
+ string objectFilename = GetObjectFilename ( sourceFilename );\r
+ fprintf ( fMakefile,\r
+ "%s: %s\n",\r
+ objectFilename.c_str (),\r
+ sourceFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t%s\n",\r
+ GenerateCommand ( module,\r
+ sourceFilename,\r
+ cc,\r
+ cflagsMacro,\r
+ nasmflagsMacro ).c_str () );\r
+ }\r
+\r
+ for ( i = 0; i < ifs.size(); i++ )\r
+ GenerateObjectFileTargets ( module, ifs[i]->files, ifs[i]->ifs, cc, cflagsMacro, nasmflagsMacro );\r
}\r
\r
void\r
-MingwKernelModuleHandler::GenerateKernelModuleTarget ( Module& module )\r
+MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,\r
+ const string& cc,\r
+ const string& cflagsMacro,\r
+ const string& nasmflagsMacro ) const\r
{\r
- fprintf ( fMakefile, "%s: %s",\r
- module.name.c_str (),\r
- GetModuleDependencies ( module ).c_str () );\r
+ GenerateObjectFileTargets ( module, module.files, module.ifs, cc, cflagsMacro, nasmflagsMacro );\r
fprintf ( fMakefile, "\n" );\r
- fprintf ( fMakefile, "\t" );\r
- fprintf ( fMakefile, "\n\n" );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GetCleanTargets ( vector<string>& out,\r
+ const vector<File*>& files,\r
+ const vector<If*>& ifs ) const\r
+{\r
+ size_t i;\r
+\r
+ for ( i = 0; i < files.size(); i++ )\r
+ out.push_back ( GetObjectFilename(files[i]->name) );\r
+\r
+ for ( i = 0; i < ifs.size(); i++ )\r
+ GetCleanTargets ( out, ifs[i]->files, ifs[i]->ifs );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateArchiveTarget ( const Module& module,\r
+ const string& ar,\r
+ const string& objs_macro ) const\r
+{\r
+ string archiveFilename = GetModuleArchiveFilename ( module );\r
+ \r
+ fprintf ( fMakefile,\r
+ "%s: %s\n",\r
+ archiveFilename.c_str (),\r
+ objs_macro.c_str ());\r
+\r
+ fprintf ( fMakefile,\r
+ "\t%s -rc %s %s\n\n",\r
+ ar.c_str (),\r
+ archiveFilename.c_str (),\r
+ objs_macro.c_str ());\r
+\r
+ return archiveFilename;\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateMacrosAndTargets (\r
+ const Module& module,\r
+ const string& cc,\r
+ const string& ar ) const\r
+{\r
+ string cflagsMacro = ssprintf("%s_CFLAGS",module.name.c_str());\r
+ string nasmflagsMacro = ssprintf("%s_NASMFLAGS",module.name.c_str());\r
+ string objectsMacro = ssprintf("%s_OBJS",module.name.c_str());\r
+\r
+ GenerateMacros ( module, cflagsMacro, nasmflagsMacro, objectsMacro );\r
+\r
+ // generate phony target for module name\r
+ fprintf ( fMakefile, ".PHONY: %s\n",\r
+ module.name.c_str() );\r
+ fprintf ( fMakefile, "%s: %s\n\n",\r
+ module.name.c_str(),\r
+ module.GetPath().c_str() );\r
+\r
+ // future references to the macros will be to get their values\r
+ cflagsMacro = ssprintf("$(%s)",cflagsMacro.c_str());\r
+ nasmflagsMacro = ssprintf("$(%s)",nasmflagsMacro.c_str());\r
+ objectsMacro = ssprintf("$(%s)",objectsMacro.c_str());\r
+\r
+ string ar_target = GenerateArchiveTarget ( module, ar, objectsMacro );\r
+ GenerateObjectFileTargets ( module, cc, cflagsMacro, nasmflagsMacro );\r
+\r
+ vector<string> clean_files;\r
+ clean_files.push_back ( ar_target );\r
+ GetCleanTargets ( clean_files, module.files, module.ifs );\r
+\r
+ fprintf ( fMakefile, "clean::\n\t-@$(rm)" );\r
+ for ( size_t i = 0; i < clean_files.size(); i++ )\r
+ {\r
+ if ( 9==(i%10) )\r
+ fprintf ( fMakefile, " 2>NUL\n\t-@$(rm)" );\r
+ fprintf ( fMakefile, " %s", clean_files[i].c_str() );\r
+ }\r
+ fprintf ( fMakefile, " 2>NUL\n\n" );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateMacrosAndTargetsHost ( const Module& module ) const\r
+{\r
+ GenerateMacrosAndTargets ( module, "${host_gcc}", "${host_ar}" );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateMacrosAndTargetsTarget ( const Module& module ) const\r
+{\r
+ GenerateMacrosAndTargets ( module, "${gcc}", "${ar}" );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetInvocationDependencies ( const Module& module ) const\r
+{\r
+ string dependencies;\r
+ for ( size_t i = 0; i < module.invocations.size (); i++ )\r
+ {\r
+ Invoke& invoke = *module.invocations[i];\r
+ if (invoke.invokeModule == &module)\r
+ /* Protect against circular dependencies */\r
+ continue;\r
+ if ( dependencies.length () > 0 )\r
+ dependencies += " ";\r
+ dependencies += invoke.GetTargets ();\r
+ }\r
+ return dependencies;\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetInvocationParameters ( const Invoke& invoke ) const\r
+{\r
+ string parameters ( "" );\r
+ size_t i;\r
+ for (i = 0; i < invoke.output.size (); i++)\r
+ {\r
+ if (parameters.length () > 0)\r
+ parameters += " ";\r
+ InvokeFile& invokeFile = *invoke.output[i];\r
+ if (invokeFile.switches.length () > 0)\r
+ {\r
+ parameters += invokeFile.switches;\r
+ parameters += " ";\r
+ }\r
+ parameters += invokeFile.name;\r
+ }\r
+\r
+ for (i = 0; i < invoke.input.size (); i++)\r
+ {\r
+ if (parameters.length () > 0)\r
+ parameters += " ";\r
+ InvokeFile& invokeFile = *invoke.input[i];\r
+ if (invokeFile.switches.length () > 0)\r
+ {\r
+ parameters += invokeFile.switches;\r
+ parameters += " ";\r
+ }\r
+ parameters += invokeFile.name;\r
+ }\r
+\r
+ return parameters;\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateInvocations ( const Module& module ) const\r
+{\r
+ if ( module.invocations.size () == 0 )\r
+ return;\r
+ \r
+ for ( size_t i = 0; i < module.invocations.size (); i++ )\r
+ {\r
+ const Invoke& invoke = *module.invocations[i];\r
+\r
+ if ( invoke.invokeModule->type != BuildTool )\r
+ throw InvalidBuildFileException ( module.node.location,\r
+ "Only modules of type buildtool can be invoked." );\r
+\r
+ string invokeTarget = module.GetInvocationTarget ( i );\r
+ fprintf ( fMakefile,\r
+ "%s: %s\n\n",\r
+ invoke.GetTargets ().c_str (),\r
+ invokeTarget.c_str () );\r
+ fprintf ( fMakefile,\r
+ "%s: %s\n",\r
+ invokeTarget.c_str (),\r
+ FixupTargetFilename ( invoke.invokeModule->GetPath () ).c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t%s %s\n\n",\r
+ FixupTargetFilename ( invoke.invokeModule->GetPath () ).c_str (),\r
+ GetInvocationParameters ( invoke ).c_str () );\r
+ fprintf ( fMakefile,\r
+ ".PNONY: %s\n\n",\r
+ invokeTarget.c_str () );\r
+ }\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetPreconditionDependenciesName ( const Module& module ) const\r
+{\r
+ return ssprintf ( "%s_precondition",\r
+ module.name.c_str () );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GeneratePreconditionDependencies ( const Module& module ) const\r
+{\r
+ string preconditionDependenciesName = GetPreconditionDependenciesName ( module );\r
+ string sourceFilenames = GetSourceFilenames ( module );\r
+ string dependencies = GetModuleDependencies ( module );\r
+ string s = GetInvocationDependencies ( module );\r
+ if ( s.length () > 0 )\r
+ {\r
+ if ( dependencies.length () > 0 )\r
+ dependencies += " ";\r
+ dependencies += s;\r
+ }\r
+ \r
+ fprintf ( fMakefile,\r
+ ".PHONY: %s\n\n",\r
+ preconditionDependenciesName.c_str () );\r
+ fprintf ( fMakefile,\r
+ "%s: %s\n\n",\r
+ preconditionDependenciesName.c_str (),\r
+ dependencies.c_str () );\r
+ const char* p = sourceFilenames.c_str();\r
+ const char* end = p + strlen(p);\r
+ while ( p < end )\r
+ {\r
+ const char* p2 = &p[512];\r
+ if ( p2 > end )\r
+ p2 = end;\r
+ while ( p2 > p && !isspace(*p2) )\r
+ --p2;\r
+ if ( p == p2 )\r
+ {\r
+ p2 = strpbrk ( p, " \t" );\r
+ if ( !p2 )\r
+ p2 = end;\r
+ }\r
+ fprintf ( fMakefile,\r
+ "%.*s: %s\n",\r
+ p2-p,\r
+ p,\r
+ preconditionDependenciesName.c_str ());\r
+ p = p2;\r
+ p += strspn ( p, " \t" );\r
+ }\r
+ fprintf ( fMakefile, "\n" );\r
+}\r
+\r
+\r
+static MingwBuildToolModuleHandler buildtool_handler;\r
+\r
+MingwBuildToolModuleHandler::MingwBuildToolModuleHandler()\r
+ : MingwModuleHandler ( BuildTool )\r
+{\r
+}\r
+\r
+void\r
+MingwBuildToolModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateBuildToolModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ( const Module& module )\r
+{\r
+ string target ( FixupTargetFilename ( module.GetPath () ) );\r
+ string archiveFilename = GetModuleArchiveFilename ( module );\r
+\r
+ GenerateMacrosAndTargetsHost ( module );\r
+\r
+ fprintf ( fMakefile, "%s: %s\n",\r
+ target.c_str (),\r
+ archiveFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${host_gcc} -o %s %s\n\n",\r
+ target.c_str (),\r
+ archiveFilename.c_str () );\r
+}\r
+\r
+static MingwKernelModuleHandler kernelmodule_handler;\r
+\r
+MingwKernelModuleHandler::MingwKernelModuleHandler ()\r
+ : MingwModuleHandler ( Kernel )\r
+{\r
+}\r
+\r
+void\r
+MingwKernelModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateKernelModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module& module )\r
+{\r
+ static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+ //static string ros_output ( "$(ROS_INTERMEDIATE)" );\r
+ string target ( FixupTargetFilename(module.GetPath()) );\r
+ string workingDirectory = GetWorkingDirectory ( );\r
+ string archiveFilename = GetModuleArchiveFilename ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+ string base_tmp = ros_junk + module.name + ".base.tmp";\r
+ string junk_tmp = ros_junk + module.name + ".junk.tmp";\r
+ string temp_exp = ros_junk + module.name + ".temp.exp";\r
+ string gccOptions = ssprintf ("-Wl,-T,%s" SSEP "ntoskrnl.lnk -Wl,--subsystem,native -Wl,--entry,_NtProcessStartup -Wl,--image-base,0xC0000000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\r
+ module.GetBasePath ().c_str () );\r
+\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ archiveFilename.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${gcc} %s -Wl,--base-file,%s -o %s %s %s\n",\r
+ gccOptions.c_str (),\r
+ base_tmp.c_str (),\r
+ junk_tmp.c_str (),\r
+ archiveFilename.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${rm} %s\n",\r
+ junk_tmp.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${dlltool} --dllname %s --base-file %s --output-exp %s --kill-at\n",\r
+ target.c_str (),\r
+ base_tmp.c_str (),\r
+ temp_exp.c_str ());\r
+ fprintf ( fMakefile,\r
+ "\t${rm} %s\n",\r
+ base_tmp.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${gcc} %s -Wl,%s -o %s %s %s\n",\r
+ gccOptions.c_str (),\r
+ temp_exp.c_str (),\r
+ target.c_str (),\r
+ archiveFilename.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${rm} %s\n\n",\r
+ temp_exp.c_str () );\r
+}\r
+\r
+\r
+static MingwStaticLibraryModuleHandler staticlibrary_handler;\r
+\r
+MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ()\r
+ : MingwModuleHandler ( StaticLibrary )\r
+{\r
+}\r
+\r
+void\r
+MingwStaticLibraryModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateStaticLibraryModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Module& module )\r
+{\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+}\r
+\r
+\r
+static MingwKernelModeDLLModuleHandler kernelmodedll_handler;\r
+\r
+MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler ()\r
+ : MingwModuleHandler ( KernelModeDLL )\r
+{\r
+}\r
+\r
+void\r
+MingwKernelModeDLLModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateKernelModeDLLModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ( const Module& module )\r
+{\r
+ static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+ string target ( FixupTargetFilename ( module.GetPath () ) );\r
+ string workingDirectory = GetWorkingDirectory ( );\r
+ string archiveFilename = GetModuleArchiveFilename ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+ if (module.importLibrary != NULL)\r
+ {\r
+ fprintf ( fMakefile, "%s:\n",\r
+ module.GetDependencyPath ().c_str () );\r
+\r
+ fprintf ( fMakefile,\r
+ "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",\r
+ module.GetTargetName ().c_str (),\r
+ FixupTargetFilename ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
+ FixupTargetFilename ( module.GetDependencyPath () ).c_str () );\r
+ }\r
+\r
+ if (module.files.size () > 0)\r
+ {\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ archiveFilename.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ \r
+ fprintf ( fMakefile,\r
+ "\t${gcc} -Wl,--subsystem,native -Wl,--entry,_DriverEntry@8 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll -o %s %s %s\n\n",\r
+ target.c_str (),\r
+ archiveFilename.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile, "%s:\n",\r
+ target.c_str ());\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ target.c_str ());\r
+ }\r
+}\r
+\r
+\r
+static MingwNativeDLLModuleHandler nativedll_handler;\r
+\r
+MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler ()\r
+ : MingwModuleHandler ( NativeDLL )\r
+{\r
+}\r
+\r
+void\r
+MingwNativeDLLModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateNativeDLLModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ( const Module& module )\r
+{\r
+ static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+ string target ( FixupTargetFilename ( module.GetPath () ) );\r
+ string workingDirectory = GetWorkingDirectory ( );\r
+ string archiveFilename = GetModuleArchiveFilename ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+ if (module.importLibrary != NULL)\r
+ {\r
+ fprintf ( fMakefile, "%s:\n",\r
+ module.GetDependencyPath ().c_str () );\r
+\r
+ fprintf ( fMakefile,\r
+ "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",\r
+ module.GetTargetName ().c_str (),\r
+ FixupTargetFilename ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
+ FixupTargetFilename ( module.GetDependencyPath () ).c_str () );\r
+ }\r
+\r
+ if (module.files.size () > 0)\r
+ {\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ archiveFilename.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ \r
+ fprintf ( fMakefile,\r
+ "\t${gcc} -Wl,--subsystem,native -Wl,--entry,_DllMainCRTStartup@12 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll -o %s %s %s\n\n",\r
+ target.c_str (),\r
+ archiveFilename.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile, "%s:\n\n",\r
+ target.c_str ());\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ target.c_str ());\r
+ }\r
+}\r
+\r
+\r
+static MingwWin32DLLModuleHandler win32dll_handler;\r
+\r
+MingwWin32DLLModuleHandler::MingwWin32DLLModuleHandler ()\r
+ : MingwModuleHandler ( Win32DLL )\r
+{\r
+}\r
+\r
+void\r
+MingwWin32DLLModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateWin32DLLModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module& module )\r
+{\r
+ static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+ string target ( FixupTargetFilename ( module.GetPath () ) );\r
+ string workingDirectory = GetWorkingDirectory ( );\r
+ string archiveFilename = GetModuleArchiveFilename ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+ if (module.importLibrary != NULL)\r
+ {\r
+ fprintf ( fMakefile, "%s:\n",\r
+ module.GetDependencyPath ().c_str () );\r
+\r
+ fprintf ( fMakefile,\r
+ "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",\r
+ module.GetTargetName ().c_str (),\r
+ FixupTargetFilename ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
+ FixupTargetFilename ( module.GetDependencyPath () ).c_str () );\r
+ }\r
+\r
+ if (module.files.size () > 0)\r
+ {\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ archiveFilename.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+\r
+ fprintf ( fMakefile,\r
+ "\t${gcc} -Wl,--subsystem,console -Wl,--entry,_DllMain@12 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll -o %s %s %s\n",\r
+ target.c_str (),\r
+ archiveFilename.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile, "%s:\n\n",\r
+ target.c_str ());\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ target.c_str ());\r
+ }\r
}\r