-\r
#include "../../pch.h"\r
#include <assert.h>\r
\r
\r
using std::string;\r
using std::vector;\r
+using std::map;\r
+using std::set;\r
+\r
+typedef set<string> set_string;\r
+\r
+map<ModuleType,MingwModuleHandler*>*\r
+MingwModuleHandler::handler_map = NULL;\r
+set_string\r
+MingwModuleHandler::directory_set;\r
+int\r
+MingwModuleHandler::ref = 0;\r
+\r
+FILE*\r
+MingwModuleHandler::fMakefile = NULL;\r
+\r
+string\r
+ReplaceExtension ( const string& filename,\r
+ const string& newExtension )\r
+{\r
+ size_t index = filename.find_last_of ( '/' );\r
+ if (index == string::npos) index = 0;\r
+ string tmp = filename.substr( index, filename.size() - index );\r
+ size_t ext_index = tmp.find_last_of( '.' );\r
+ if (ext_index != string::npos) \r
+ return filename.substr ( 0, index + ext_index ) + newExtension;\r
+ return filename + newExtension;\r
+}\r
+\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
+const string &\r
+MingwModuleHandler::PassThruCacheDirectory ( const string &file ) const \r
+{\r
+ directory_set.insert ( GetDirectory ( file ) );\r
+ return file;\r
+}\r
+\r
+void\r
+MingwModuleHandler::SetMakefile ( FILE* f )\r
+{\r
+ fMakefile = f;\r
+}\r
\r
-MingwModuleHandler::MingwModuleHandler ( FILE* fMakefile )\r
- : fMakefile ( fMakefile )\r
+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
}\r
\r
string\r
-MingwModuleHandler::ReplaceExtension ( const string& filename,\r
- const string& newExtension ) const\r
+MingwModuleHandler::GetBasename ( const string& filename ) 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
+ if ( index != string::npos )\r
+ return filename.substr ( 0, index );\r
+ return "";\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetActualSourceFilename ( const string& filename ) const\r
+{\r
+ string extension = GetExtension ( filename );\r
+ if ( extension == ".spec" || extension == "SPEC" )\r
+ {\r
+ string basename = GetBasename ( filename );\r
+ return basename + ".stubs.c";\r
+ }\r
+ else\r
+ return filename;\r
}\r
\r
string\r
MingwModuleHandler::GetModuleArchiveFilename ( const Module& module ) const\r
{\r
- return ReplaceExtension ( FixupTargetFilename ( module.GetPath () ).c_str (),\r
+ return ReplaceExtension ( FixupTargetFilename ( module.GetPath () ),\r
".a" );\r
}\r
\r
+bool\r
+MingwModuleHandler::IsGeneratedFile ( const File& file ) const\r
+{\r
+ string extension = GetExtension ( file.name );\r
+ if ( extension == ".spec" || extension == "SPEC" )\r
+ return true;\r
+ else\r
+ return false;\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetImportLibraryDependency ( const Module& importedModule ) const\r
+{\r
+ if ( importedModule.type == ObjectLibrary )\r
+ return GetObjectsMacro ( importedModule );\r
+ else\r
+ return PassThruCacheDirectory ( FixupTargetFilename ( importedModule.GetDependencyPath () ) );\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
dependencies += " ";\r
const Module* importedModule = module.project.LocateModule ( module.libraries[i]->name );\r
assert ( importedModule != NULL );\r
- dependencies += FixupTargetFilename ( importedModule->GetPath () ).c_str ();\r
+ dependencies += GetImportLibraryDependency ( *importedModule );\r
}\r
return dependencies;\r
}\r
const Module* dependencyModule = dependency->dependencyModule;\r
dependencies += dependencyModule->GetTargets ();\r
}\r
+ string definitionDependencies = GetDefinitionDependencies ( module );\r
+ if ( dependencies.length () > 0 && definitionDependencies.length () > 0 )\r
+ dependencies += " " + definitionDependencies;\r
+ else if ( definitionDependencies.length () > 0 )\r
+ dependencies = definitionDependencies;\r
return dependencies;\r
}\r
\r
{\r
string dependencies = GetImportLibraryDependencies ( module );\r
string s = GetModuleDependencies ( module );\r
- if (s.length () > 0)\r
+ if ( s.length () > 0 )\r
{\r
dependencies += " ";\r
dependencies += s;\r
}\r
\r
string\r
-MingwModuleHandler::GetSourceFilenames ( const Module& module ) const\r
+MingwModuleHandler::GetSourceFilenames ( const Module& module,\r
+ bool includeGeneratedFiles ) const\r
{\r
- if ( module.files.size () == 0 )\r
- return "";\r
- \r
+ size_t i;\r
+\r
string sourceFilenames ( "" );\r
- for ( size_t i = 0; i < module.files.size (); i++ )\r
+ for ( i = 0; i < module.files.size (); i++ )\r
+ {\r
+ if ( includeGeneratedFiles || !IsGeneratedFile ( *module.files[i] ) )\r
+ sourceFilenames += " " + GetActualSourceFilename ( module.files[i]->name );\r
+ }\r
+ vector<If*> ifs = module.ifs;\r
+ for ( i = 0; i < ifs.size (); i++ )\r
{\r
- if ( sourceFilenames.size () > 0 )\r
- sourceFilenames += " ";\r
- sourceFilenames += module.files[i]->name;\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
+ {\r
+ if ( includeGeneratedFiles || !IsGeneratedFile ( *rIf.files[j] ) )\r
+ sourceFilenames += " " + GetActualSourceFilename ( rIf.files[j]->name );\r
+ }\r
}\r
return sourceFilenames;\r
}\r
\r
string\r
-MingwModuleHandler::GetObjectFilename ( const string& sourceFilename ) const\r
+MingwModuleHandler::GetSourceFilenames ( const Module& module ) const\r
+{\r
+ return GetSourceFilenames ( module,\r
+ true );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetSourceFilenamesWithoutGeneratedFiles ( const Module& module ) const\r
+{\r
+ return GetSourceFilenames ( module,\r
+ false );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetObjectFilename ( const string& sourceFilename )\r
{\r
- return FixupTargetFilename ( ReplaceExtension ( sourceFilename,\r
- ".o" ) );\r
+ string newExtension;\r
+ string extension = GetExtension ( sourceFilename );\r
+ if ( extension == ".rc" || extension == ".RC" )\r
+ newExtension = ".coff";\r
+ else if ( extension == ".spec" || extension == ".SPEC" )\r
+ newExtension = ".stubs.o";\r
+ else\r
+ newExtension = ".o";\r
+ return FixupTargetFilename ( ReplaceExtension ( sourceFilename, newExtension ) );\r
}\r
\r
string\r
{\r
if ( objectFilenames.size () > 0 )\r
objectFilenames += " ";\r
- objectFilenames += GetObjectFilename ( module.files[i]->name );\r
+ objectFilenames += PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( module.files[i]->name ) );\r
}\r
return objectFilenames;\r
}\r
\r
+bool\r
+MingwModuleHandler::IncludeDirectoryTarget ( const string& directory ) const\r
+{\r
+ if ( directory == "$(ROS_INTERMEDIATE)." SSEP "tools")\r
+ return false;\r
+ else\r
+ return true;\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateDirectoryTargets () const\r
+{\r
+ if ( directory_set.size () == 0 )\r
+ return;\r
+ \r
+ set_string::iterator i;\r
+ fprintf ( fMakefile, "directories::" );\r
+\r
+ for ( i = directory_set.begin ();\r
+ i != directory_set.end ();\r
+ i++ )\r
+ {\r
+ if ( IncludeDirectoryTarget ( *i ) )\r
+ {\r
+ fprintf ( fMakefile,\r
+ " %s",\r
+ i->c_str () );\r
+ }\r
+ }\r
+\r
+ fprintf ( fMakefile, "\n\n" );\r
+\r
+ for ( i = directory_set.begin ();\r
+ i != directory_set.end ();\r
+ i++ )\r
+ {\r
+ if ( IncludeDirectoryTarget ( *i ) )\r
+ {\r
+ fprintf ( fMakefile,\r
+ "%s ",\r
+ i->c_str () );\r
+ }\r
+ }\r
+\r
+ fprintf ( fMakefile, \r
+ "::\n\t${mkdir} $@\n\n" );\r
+\r
+ directory_set.clear ();\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
+ for ( size_t i = 0; i < defines.size (); i++ )\r
{\r
Define& define = *defines[i];\r
if (parameters.length () > 0)\r
{\r
string parameters = GenerateGccDefineParametersFromVector ( module.project.defines );\r
string s = GenerateGccDefineParametersFromVector ( module.defines );\r
- if (s.length () > 0)\r
+ if ( s.length () > 0 )\r
{\r
parameters += " ";\r
parameters += s;\r
for ( size_t i = 0; i < includes.size (); i++ )\r
{\r
Include& include = *includes[i];\r
- if (parameters.length () > 0)\r
+ if ( parameters.length () > 0 )\r
parameters += " ";\r
parameters += "-I" + include.directory;\r
}\r
string\r
MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const\r
{\r
- string parameters = GenerateGccIncludeParametersFromVector ( module.project.includes );\r
- string s = GenerateGccIncludeParametersFromVector ( module.includes );\r
- if (s.length () > 0)\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
return parameters;\r
}\r
\r
+\r
string\r
-MingwModuleHandler::GenerateGccParameters ( const Module& module ) const\r
+MingwModuleHandler::GenerateCompilerParametersFromVector ( const vector<CompilerFlag*>& compilerFlags ) const\r
{\r
- string parameters = GenerateGccDefineParameters ( module );\r
- string s = GenerateGccIncludeParameters ( module );\r
- if (s.length () > 0)\r
+ string parameters;\r
+ for ( size_t i = 0; i < compilerFlags.size (); i++ )\r
{\r
- parameters += " ";\r
- parameters += s;\r
+ CompilerFlag& compilerFlag = *compilerFlags[i];\r
+ if ( parameters.length () > 0 )\r
+ parameters += " ";\r
+ parameters += compilerFlag.flag;\r
}\r
return parameters;\r
}\r
\r
-void\r
-MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,\r
- const string& cc) const\r
+string\r
+MingwModuleHandler::GenerateLinkerParametersFromVector ( const vector<LinkerFlag*>& linkerFlags ) const\r
{\r
- if ( module.files.size () == 0 )\r
- return;\r
- \r
- for ( size_t i = 0; i < module.files.size (); i++ )\r
+ string parameters;\r
+ for ( size_t i = 0; i < linkerFlags.size (); i++ )\r
{\r
- string sourceFilename = module.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 -c %s -o %s %s\n",\r
- cc.c_str (),\r
- sourceFilename.c_str (),\r
- objectFilename.c_str (),\r
- GenerateGccParameters ( module ).c_str () );\r
+ LinkerFlag& linkerFlag = *linkerFlags[i];\r
+ if ( parameters.length () > 0 )\r
+ parameters += " ";\r
+ parameters += linkerFlag.flag;\r
}\r
- \r
- fprintf ( fMakefile, "\n" );\r
+ return parameters;\r
}\r
\r
-void\r
-MingwModuleHandler::GenerateObjectFileTargetsHost ( const Module& module ) const\r
+string\r
+MingwModuleHandler::GenerateLinkerParameters ( const Module& module ) const\r
{\r
- GenerateObjectFileTargets ( module,\r
- "${host_gcc}" );\r
+ return GenerateLinkerParametersFromVector ( module.linkerFlags );\r
}\r
\r
void\r
-MingwModuleHandler::GenerateObjectFileTargetsTarget ( const Module& module ) const\r
+MingwModuleHandler::GenerateMacro ( const char* assignmentOperation,\r
+ const string& macro,\r
+ const vector<Include*>& includes,\r
+ const vector<Define*>& defines,\r
+ const vector<CompilerFlag*>* compilerFlags ) const\r
{\r
- GenerateObjectFileTargets ( module,\r
- "${gcc}" );\r
-}\r
+ size_t i;\r
\r
-void\r
-MingwModuleHandler::GenerateArchiveTarget ( const Module& module,\r
- const string& ar ) const\r
-{\r
- string archiveFilename = GetModuleArchiveFilename ( module );\r
- string sourceFilenames = GetSourceFilenames ( module );\r
- string objectFilenames = GetObjectFilenames ( module );\r
+ fprintf (\r
+ fMakefile,\r
+ "%s %s",\r
+ macro.c_str(),\r
+ assignmentOperation );\r
\r
- fprintf ( fMakefile,\r
- "%s: %s\n",\r
- archiveFilename.c_str (),\r
- objectFilenames.c_str ());\r
-\r
- fprintf ( fMakefile,\r
- "\t%s -rc %s %s\n\n",\r
- ar.c_str (),\r
- archiveFilename.c_str (),\r
- objectFilenames.c_str ());\r
-}\r
+ if ( compilerFlags != NULL )\r
+ {\r
+ string compilerParameters = GenerateCompilerParametersFromVector ( *compilerFlags );\r
+ if ( compilerParameters.size () > 0 )\r
+ {\r
+ fprintf (\r
+ fMakefile,\r
+ " %s",\r
+ compilerParameters.c_str () );\r
+ }\r
+ }\r
\r
-void\r
-MingwModuleHandler::GenerateArchiveTargetHost ( const Module& module ) const\r
-{\r
- GenerateArchiveTarget ( module,\r
- "${host_ar}" );\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
void\r
-MingwModuleHandler::GenerateArchiveTargetTarget ( const Module& module ) const\r
+MingwModuleHandler::GenerateMacros (\r
+ const char* assignmentOperation,\r
+ const vector<File*>& files,\r
+ const vector<Include*>& includes,\r
+ const vector<Define*>& defines,\r
+ const vector<CompilerFlag*>* compilerFlags,\r
+ const vector<LinkerFlag*>* linkerFlags,\r
+ const vector<If*>& ifs,\r
+ const string& cflags_macro,\r
+ const string& nasmflags_macro,\r
+ const string& windresflags_macro,\r
+ const string& linkerflags_macro,\r
+ const string& objs_macro) const\r
{\r
- GenerateArchiveTarget ( module,\r
- "${ar}" );\r
-}\r
+ size_t i;\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
+ if ( includes.size () > 0 || defines.size () > 0 )\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
+ GenerateMacro ( assignmentOperation,\r
+ cflags_macro,\r
+ includes,\r
+ defines,\r
+ compilerFlags );\r
+ GenerateMacro ( assignmentOperation,\r
+ windresflags_macro,\r
+ includes,\r
+ defines,\r
+ compilerFlags );\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 ( linkerFlags != NULL )\r
{\r
- if (parameters.length () > 0)\r
- parameters += " ";\r
- InvokeFile& invokeFile = *invoke.output[i];\r
- if (invokeFile.switches.length () > 0)\r
+ string linkerParameters = GenerateLinkerParametersFromVector ( *linkerFlags );\r
+ if ( linkerParameters.size () > 0 )\r
{\r
- parameters += invokeFile.switches;\r
- parameters += " ";\r
+ fprintf (\r
+ fMakefile,\r
+ "%s %s %s\n",\r
+ linkerflags_macro.c_str (),\r
+ assignmentOperation,\r
+ linkerParameters.c_str() );\r
}\r
- parameters += invokeFile.name;\r
}\r
-\r
- for (i = 0; i < invoke.input.size (); i++)\r
+ \r
+ if ( files.size () > 0 )\r
{\r
- if (parameters.length () > 0)\r
- parameters += " ";\r
- InvokeFile& invokeFile = *invoke.input[i];\r
- if (invokeFile.switches.length () > 0)\r
+ for ( i = 0; i < files.size (); i++ )\r
{\r
- parameters += invokeFile.switches;\r
- parameters += " ";\r
+ if ( files[i]->first )\r
+ {\r
+ fprintf ( fMakefile,\r
+ "%s := %s $(%s)\n",\r
+ objs_macro.c_str(),\r
+ PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( files[i]->name ) ).c_str (),\r
+ objs_macro.c_str() );\r
+ }\r
+ }\r
+ fprintf (\r
+ fMakefile,\r
+ "%s %s",\r
+ objs_macro.c_str (),\r
+ assignmentOperation );\r
+ for ( i = 0; i < files.size(); i++ )\r
+ {\r
+ if ( !files[i]->first )\r
+ {\r
+ fprintf (\r
+ fMakefile,\r
+ "%s%s",\r
+ ( i%10 == 9 ? "\\\n\t" : " " ),\r
+ PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( files[i]->name ) ).c_str () );\r
+ }\r
}\r
- parameters += invokeFile.name;\r
+ fprintf ( fMakefile, "\n" );\r
}\r
\r
- return parameters;\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
+ NULL,\r
+ NULL,\r
+ rIf.ifs,\r
+ cflags_macro,\r
+ nasmflags_macro,\r
+ windresflags_macro,\r
+ linkerflags_macro,\r
+ objs_macro );\r
+ fprintf ( \r
+ fMakefile,\r
+ "endif\n\n" );\r
+ }\r
+ }\r
}\r
\r
void\r
-MingwModuleHandler::GenerateInvocations ( const Module& module ) const\r
+MingwModuleHandler::GenerateMacros (\r
+ const Module& module,\r
+ const string& cflags_macro,\r
+ const string& nasmflags_macro,\r
+ const string& windresflags_macro,\r
+ const string& linkerflags_macro,\r
+ const string& objs_macro) 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
+ GenerateMacros (\r
+ "=",\r
+ module.files,\r
+ module.includes,\r
+ module.defines,\r
+ &module.compilerFlags,\r
+ &module.linkerFlags,\r
+ module.ifs,\r
+ cflags_macro,\r
+ nasmflags_macro,\r
+ windresflags_macro,\r
+ linkerflags_macro,\r
+ objs_macro );\r
+ fprintf ( fMakefile, "\n" );\r
\r
- if ( invoke.invokeModule->type != BuildTool )\r
- throw InvalidBuildFileException ( module.node.location,\r
- "Only modules of type buildtool can be invoked." );\r
+ fprintf (\r
+ fMakefile,\r
+ "%s += $(PROJECT_CFLAGS)\n\n",\r
+ cflags_macro.c_str () );\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
+ fprintf (\r
+ fMakefile,\r
+ "%s += $(PROJECT_RCFLAGS)\n\n",\r
+ windresflags_macro.c_str () );\r
\r
-string\r
-MingwModuleHandler::GetPreconditionDependenciesName ( const Module& module ) const\r
-{\r
- return ssprintf ( "%s_precondition",\r
- module.name.c_str () );\r
+ fprintf (\r
+ fMakefile,\r
+ "%s_LFLAGS += $(PROJECT_LFLAGS)\n\n",\r
+ module.name.c_str () );\r
}\r
\r
void\r
-MingwModuleHandler::GeneratePreconditionDependencies ( const Module& module ) const\r
+MingwModuleHandler::GenerateGccCommand ( const Module& module,\r
+ const string& sourceFilename,\r
+ const string& cc,\r
+ const string& cflagsMacro ) 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
- "%s: %s\n\n",\r
- preconditionDependenciesName.c_str (),\r
- dependencies.c_str () );\r
+ string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
fprintf ( fMakefile,\r
- "%s: %s\n\n",\r
- sourceFilenames.c_str (),\r
- preconditionDependenciesName.c_str ());\r
+ "%s: %s\n",\r
+ objectFilename.c_str (),\r
+ sourceFilename.c_str () );\r
fprintf ( fMakefile,\r
- ".PNONY: %s\n\n",\r
- preconditionDependenciesName.c_str () );\r
+ "\t%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
-\r
-MingwBuildToolModuleHandler::MingwBuildToolModuleHandler ( FILE* fMakefile )\r
- : MingwModuleHandler ( fMakefile )\r
+void\r
+MingwModuleHandler::GenerateGccAssemblerCommand ( const Module& module,\r
+ const string& sourceFilename,\r
+ const string& cc,\r
+ const string& cflagsMacro ) const\r
{\r
+ string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
+ fprintf ( fMakefile,\r
+ "%s: %s\n",\r
+ objectFilename.c_str (),\r
+ sourceFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t%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
-bool\r
-MingwBuildToolModuleHandler::CanHandleModule ( const Module& module ) const\r
+void\r
+MingwModuleHandler::GenerateNasmCommand ( const Module& module,\r
+ const string& sourceFilename,\r
+ const string& nasmflagsMacro ) const\r
{\r
- return module.type == BuildTool;\r
+ string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
+ fprintf ( fMakefile,\r
+ "%s: %s\n",\r
+ objectFilename.c_str (),\r
+ sourceFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t%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
void\r
-MingwBuildToolModuleHandler::Process ( const Module& module )\r
+MingwModuleHandler::GenerateWindresCommand ( const Module& module,\r
+ const string& sourceFilename,\r
+ const string& windresflagsMacro ) const\r
{\r
- GeneratePreconditionDependencies ( module );\r
- GenerateBuildToolModuleTarget ( module );\r
- GenerateInvocations ( module );\r
+ string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
+ string rciFilename = ReplaceExtension ( sourceFilename,\r
+ ".rci" );\r
+ string resFilename = ReplaceExtension ( sourceFilename,\r
+ ".res" );\r
+ fprintf ( fMakefile,\r
+ "%s: %s\n",\r
+ objectFilename.c_str (),\r
+ sourceFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${gcc} -xc -E -DRC_INVOKED ${%s} %s > %s\n",\r
+ windresflagsMacro.c_str (),\r
+ sourceFilename.c_str (),\r
+ rciFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${wrc} ${%s} %s %s\n",\r
+ windresflagsMacro.c_str (),\r
+ rciFilename.c_str (),\r
+ resFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${rm} %s\n",\r
+ rciFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${windres} %s -o %s\n",\r
+ resFilename.c_str (),\r
+ objectFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${rm} %s\n",\r
+ resFilename.c_str () );\r
}\r
\r
void\r
-MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ( const Module& module )\r
+MingwModuleHandler::GenerateWinebuildCommands ( const Module& module,\r
+ const string& sourceFilename ) const\r
{\r
- string target ( FixupTargetFilename ( module.GetPath () ) );\r
- string archiveFilename = GetModuleArchiveFilename ( module );\r
- fprintf ( fMakefile, "%s: %s\n",\r
- target.c_str (),\r
- archiveFilename.c_str () );\r
+ string basename = GetBasename ( sourceFilename );\r
fprintf ( fMakefile,\r
- "\t${host_gcc} -o %s %s\n",\r
- target.c_str (),\r
- archiveFilename.c_str () );\r
- GenerateArchiveTargetHost ( module );\r
- GenerateObjectFileTargetsHost ( module );\r
+ "%s.spec.def: %s\n",\r
+ basename.c_str (),\r
+ sourceFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t%s --def=%s -o %s.spec.def\n",\r
+ "${winebuild}",\r
+ sourceFilename.c_str (),\r
+ basename.c_str () );\r
+\r
+ fprintf ( fMakefile,\r
+ "%s.stubs.c: %s\n",\r
+ basename.c_str (),\r
+ sourceFilename.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t%s --pedll=%s -o %s.stubs.c\n",\r
+ "${winebuild}",\r
+ sourceFilename.c_str (),\r
+ basename.c_str () );\r
}\r
\r
+void\r
+MingwModuleHandler::GenerateCommands ( const Module& module,\r
+ const string& sourceFilename,\r
+ const string& cc,\r
+ const string& cppc,\r
+ const string& cflagsMacro,\r
+ const string& nasmflagsMacro,\r
+ const string& windresflagsMacro ) const\r
+{\r
+ string extension = GetExtension ( sourceFilename );\r
+ if ( extension == ".c" || extension == ".C" )\r
+ {\r
+ GenerateGccCommand ( module,\r
+ sourceFilename,\r
+ cc,\r
+ cflagsMacro );\r
+ return;\r
+ }\r
+ else if ( extension == ".cc" || extension == ".CC" ||\r
+ extension == ".cpp" || extension == ".CPP" ||\r
+ extension == ".cxx" || extension == ".CXX" )\r
+ {\r
+ GenerateGccCommand ( module,\r
+ sourceFilename,\r
+ cppc,\r
+ cflagsMacro );\r
+ return;\r
+ }\r
+ else if ( extension == ".s" || extension == ".S" )\r
+ {\r
+ GenerateGccAssemblerCommand ( module,\r
+ sourceFilename,\r
+ cc,\r
+ cflagsMacro );\r
+ return;\r
+ }\r
+ else if ( extension == ".asm" || extension == ".ASM" )\r
+ {\r
+ GenerateNasmCommand ( module,\r
+ sourceFilename,\r
+ nasmflagsMacro );\r
+ return;\r
+ }\r
+ else if ( extension == ".rc" || extension == ".RC" )\r
+ {\r
+ GenerateWindresCommand ( module,\r
+ sourceFilename,\r
+ windresflagsMacro );\r
+ return;\r
+ }\r
+ else if ( extension == ".spec" || extension == ".SPEC" )\r
+ {\r
+ GenerateWinebuildCommands ( module,\r
+ sourceFilename );\r
+ GenerateGccCommand ( module,\r
+ GetActualSourceFilename ( sourceFilename ),\r
+ cc,\r
+ cflagsMacro );\r
+ return;\r
+ }\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::GenerateLinkerCommand ( const Module& module,\r
+ const string& linker,\r
+ const string& linkerParameters,\r
+ const string& objectFilenames ) const\r
+{\r
+ string targetName ( module.GetTargetName () );\r
+ string target ( FixupTargetFilename ( module.GetPath () ) );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+ if ( module.importLibrary != NULL )\r
+ {\r
+ static string ros_junk ( "$(ROS_TEMPORARY)" );\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
+\r
+ fprintf ( fMakefile,\r
+ "\t%s %s -Wl,--base-file,%s -o %s %s %s %s\n",\r
+ linker.c_str (),\r
+ linkerParameters.c_str (),\r
+ base_tmp.c_str (),\r
+ junk_tmp.c_str (),\r
+ objectFilenames.c_str (),\r
+ importLibraryDependencies.c_str (),\r
+ GetLinkerMacro ( module ).c_str () );\r
+\r
+ fprintf ( fMakefile,\r
+ "\t${rm} %s\n",\r
+ junk_tmp.c_str () );\r
+\r
+ string killAt = module.mangledSymbols ? "" : "--kill-at";\r
+ fprintf ( fMakefile,\r
+ "\t${dlltool} --dllname %s --base-file %s --def %s --output-exp %s %s\n",\r
+ targetName.c_str (),\r
+ base_tmp.c_str (),\r
+ ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
+ temp_exp.c_str (),\r
+ killAt.c_str () );\r
+\r
+ fprintf ( fMakefile,\r
+ "\t${rm} %s\n",\r
+ base_tmp.c_str () );\r
+\r
+ fprintf ( fMakefile,\r
+ "\t%s %s %s -o %s %s %s %s\n\n",\r
+ linker.c_str (),\r
+ linkerParameters.c_str (),\r
+ temp_exp.c_str (),\r
+ target.c_str (),\r
+ objectFilenames.c_str (),\r
+ importLibraryDependencies.c_str (),\r
+ GetLinkerMacro ( module ).c_str () );\r
+\r
+ fprintf ( fMakefile,\r
+ "\t${rm} %s\n\n",\r
+ temp_exp.c_str () );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile,\r
+ "\t%s %s -o %s %s %s %s\n\n",\r
+ linker.c_str (),\r
+ linkerParameters.c_str (),\r
+ target.c_str (),\r
+ objectFilenames.c_str (),\r
+ importLibraryDependencies.c_str (),\r
+ GetLinkerMacro ( module ).c_str () );\r
+ }\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& cppc,\r
+ const string& cflagsMacro,\r
+ const string& nasmflagsMacro,\r
+ const string& windresflagsMacro ) const\r
+{\r
+ size_t i;\r
+\r
+ for ( i = 0; i < files.size (); i++ )\r
+ {\r
+ string sourceFilename = files[i]->name;\r
+ GenerateCommands ( module,\r
+ sourceFilename,\r
+ cc,\r
+ cppc,\r
+ cflagsMacro,\r
+ nasmflagsMacro,\r
+ windresflagsMacro );\r
+ fprintf ( fMakefile,\r
+ "\n" );\r
+ }\r
+\r
+ for ( i = 0; i < ifs.size(); i++ )\r
+ {\r
+ GenerateObjectFileTargets ( module,\r
+ ifs[i]->files,\r
+ ifs[i]->ifs,\r
+ cc,\r
+ cppc,\r
+ cflagsMacro,\r
+ nasmflagsMacro,\r
+ windresflagsMacro );\r
+ }\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,\r
+ const string& cc,\r
+ const string& cppc,\r
+ const string& cflagsMacro,\r
+ const string& nasmflagsMacro,\r
+ const string& windresflagsMacro ) const\r
+{\r
+ GenerateObjectFileTargets ( module,\r
+ module.files,\r
+ module.ifs,\r
+ cc,\r
+ cppc,\r
+ cflagsMacro,\r
+ nasmflagsMacro,\r
+ windresflagsMacro );\r
+ fprintf ( fMakefile, "\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 ( PassThruCacheDirectory ( MingwModuleHandler::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
+string\r
+MingwModuleHandler::GetCFlagsMacro ( const Module& module ) const\r
+{\r
+ return ssprintf ( "$(%s_CFLAGS)",\r
+ module.name.c_str () );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetObjectsMacro ( const Module& module ) const\r
+{\r
+ return ssprintf ( "$(%s_OBJS)",\r
+ module.name.c_str () );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetLinkerMacro ( const Module& module ) const\r
+{\r
+ return ssprintf ( "$(%s_LFLAGS)",\r
+ module.name.c_str () );\r
+}\r
+ \r
+void\r
+MingwModuleHandler::GenerateMacrosAndTargets (\r
+ const Module& module,\r
+ const string& cc,\r
+ const string& cppc,\r
+ const string& ar,\r
+ const string* cflags,\r
+ const string* nasmflags ) const\r
+{\r
+ string cflagsMacro = ssprintf ("%s_CFLAGS", module.name.c_str ());\r
+ string nasmflagsMacro = ssprintf ("%s_NASMFLAGS", module.name.c_str ());\r
+ string windresflagsMacro = ssprintf ("%s_RCFLAGS", module.name.c_str ());\r
+ string linkerFlagsMacro = ssprintf ("%s_LFLAGS", module.name.c_str ());\r
+ string objectsMacro = ssprintf ("%s_OBJS", module.name.c_str ());\r
+\r
+ GenerateMacros ( module,\r
+ cflagsMacro,\r
+ nasmflagsMacro,\r
+ windresflagsMacro,\r
+ linkerFlagsMacro,\r
+ objectsMacro );\r
+\r
+ if ( cflags != NULL )\r
+ {\r
+ fprintf ( fMakefile,\r
+ "%s += %s\n\n",\r
+ cflagsMacro.c_str (),\r
+ cflags->c_str () );\r
+ }\r
+\r
+ if ( nasmflags != NULL )\r
+ {\r
+ fprintf ( fMakefile,\r
+ "%s += %s\n\n",\r
+ nasmflagsMacro.c_str (),\r
+ nasmflags->c_str () );\r
+ }\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
+ FixupTargetFilename ( 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,\r
+ cc,\r
+ cppc,\r
+ cflagsMacro,\r
+ nasmflagsMacro,\r
+ windresflagsMacro );\r
+\r
+ vector<string> clean_files;\r
+ clean_files.push_back ( FixupTargetFilename(module.GetPath()) );\r
+ clean_files.push_back ( ar_target );\r
+ GetCleanTargets ( clean_files, module.files, module.ifs );\r
+\r
+ fprintf ( fMakefile, ".PHONY: %s_clean\n", module.name.c_str() );\r
+ fprintf ( fMakefile, "%s_clean:\n\t-@$(rm)", module.name.c_str() );\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" );\r
+ fprintf ( fMakefile, "clean: %s_clean\n\n", module.name.c_str() );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateMacrosAndTargetsHost ( const Module& module ) const\r
+{\r
+ GenerateMacrosAndTargets ( module,\r
+ "${host_gcc}",\r
+ "${host_gpp}",\r
+ "${host_ar}",\r
+ NULL,\r
+ NULL );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateMacrosAndTargetsTarget ( const Module& module ) const\r
+{\r
+ GenerateMacrosAndTargetsTarget ( module,\r
+ NULL,\r
+ NULL );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateMacrosAndTargetsTarget ( const Module& module,\r
+ const string* cflags,\r
+ const string* nasmflags ) const\r
+{\r
+ GenerateMacrosAndTargets ( module,\r
+ "${gcc}",\r
+ "${gpp}",\r
+ "${ar}",\r
+ cflags,\r
+ nasmflags );\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
+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
+ {\r
+ throw InvalidBuildFileException ( module.node.location,\r
+ "Only modules of type buildtool can be invoked." );\r
+ }\r
+\r
+ string invokeTarget = module.GetInvocationTarget ( i );\r
+ fprintf ( fMakefile,\r
+ ".PHONY: %s\n\n",\r
+ invokeTarget.c_str () );\r
+ fprintf ( fMakefile,\r
+ "%s: %s\n\n",\r
+ invokeTarget.c_str (),\r
+ invoke.GetTargets ().c_str () );\r
+ fprintf ( fMakefile,\r
+ "%s: %s\n",\r
+ invoke.GetTargets ().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
+ invoke.GetParameters ().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
+string\r
+MingwModuleHandler::GetDefaultDependencies ( const Module& module ) const\r
+{\r
+ /* Avoid circular dependency */\r
+ if ( module.type == BuildTool || module.name == "zlib" )\r
+ return "$(ROS_INTERMEDIATE)." SSEP "tools $(ROS_INTERMEDIATE)." SSEP "lib" SSEP "zlib";\r
+ else\r
+ return "init";\r
+}\r
+\r
+void\r
+MingwModuleHandler::GeneratePreconditionDependencies ( const Module& module ) const\r
+{\r
+ string preconditionDependenciesName = GetPreconditionDependenciesName ( module );\r
+ string sourceFilenames = GetSourceFilenamesWithoutGeneratedFiles ( module );\r
+ string dependencies = GetDefaultDependencies ( module );\r
+ string s = GetModuleDependencies ( module );\r
+ if ( s.length () > 0 )\r
+ {\r
+ if ( dependencies.length () > 0 )\r
+ dependencies += " ";\r
+ dependencies += s;\r
+ }\r
+\r
+ 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
+void\r
+MingwModuleHandler::GenerateImportLibraryTargetIfNeeded ( const Module& module ) const\r
+{\r
+ if ( module.importLibrary != NULL )\r
+ {\r
+ string definitionDependencies = GetDefinitionDependencies ( module );\r
+ fprintf ( fMakefile, "%s: %s\n",\r
+ FixupTargetFilename( module.GetDependencyPath () ).c_str (),\r
+ definitionDependencies.c_str () );\r
+\r
+ string killAt = module.mangledSymbols ? "" : "--kill-at";\r
+ fprintf ( fMakefile,\r
+ "\t${dlltool} --dllname %s --def %s --output-lib %s %s\n\n",\r
+ module.GetTargetName ().c_str (),\r
+ ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
+ FixupTargetFilename ( module.GetDependencyPath () ).c_str (),\r
+ killAt.c_str () );\r
+ }\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetSpecObjectDependencies ( const string& filename ) const\r
+{\r
+ string basename = GetBasename ( filename );\r
+ return basename + ".spec.def" + " " + basename + ".stubs.c";\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetDefinitionDependencies ( const Module& module ) const\r
+{\r
+ string dependencies;\r
+ string dkNkmLibNoFixup = "dk/nkm/lib";\r
+ dependencies += FixupTargetFilename ( dkNkmLibNoFixup );\r
+ PassThruCacheDirectory ( dkNkmLibNoFixup + SSEP );\r
+ for ( size_t i = 0; i < module.files.size (); i++ )\r
+ {\r
+ File& file = *module.files[i];\r
+ string extension = GetExtension ( file.name );\r
+ if ( extension == ".spec" || extension == ".SPEC" )\r
+ {\r
+ if ( dependencies.length () > 0 )\r
+ dependencies += " ";\r
+ dependencies += GetSpecObjectDependencies ( file.name );\r
+ }\r
+ }\r
+ return dependencies;\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetLinkingDependencies ( const Module& module ) const\r
+{\r
+ string dependencies = GetImportLibraryDependencies ( module );\r
+ string s = GetDefinitionDependencies ( module );\r
+ if ( s.length () > 0 )\r
+ {\r
+ dependencies += " ";\r
+ dependencies += s;\r
+ }\r
+ return dependencies;\r
+}\r
+\r
+bool\r
+MingwModuleHandler::IsCPlusPlusModule ( const Module& module ) const\r
+{\r
+ if ( module.HasFileWithExtensions ( ".cc", ".CC" ) )\r
+ return true;\r
+ if ( module.HasFileWithExtensions ( ".cxx", ".CXX" ) )\r
+ return true;\r
+ if ( module.HasFileWithExtensions ( ".cpp", ".CPP" ) )\r
+ return true;\r
+ return false;\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 objectsMacro = GetObjectsMacro ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+ GenerateMacrosAndTargetsHost ( module );\r
+\r
+ string linker;\r
+ if ( IsCPlusPlusModule ( module ) )\r
+ linker = "${host_gpp}";\r
+ else\r
+ linker = "${host_gcc}";\r
+ \r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ objectsMacro.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t%s %s -o %s %s %s\n\n",\r
+ linker.c_str (),\r
+ GetLinkerMacro ( module ).c_str (),\r
+ target.c_str (),\r
+ objectsMacro.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+}\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
+ string targetName ( module.GetTargetName () );\r
+ string target ( FixupTargetFilename (module.GetPath ()) );\r
+ string workingDirectory = GetWorkingDirectory ();\r
+ string objectsMacro = GetObjectsMacro ( 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,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\r
+ module.GetBasePath ().c_str (),\r
+ module.entrypoint.c_str (),\r
+ module.baseaddress.c_str () );\r
+\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+\r
+ GenerateImportLibraryTargetIfNeeded ( module );\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ objectsMacro.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${gcc} %s %s -Wl,--base-file,%s -o %s %s %s\n",\r
+ GetLinkerMacro ( module ).c_str (),\r
+ gccOptions.c_str (),\r
+ base_tmp.c_str (),\r
+ junk_tmp.c_str (),\r
+ objectsMacro.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${rm} %s\n",\r
+ junk_tmp.c_str () );\r
+ string killAt = module.mangledSymbols ? "" : "--kill-at";\r
+ fprintf ( fMakefile,\r
+ "\t${dlltool} --dllname %s --base-file %s --def ntoskrnl/ntoskrnl.def --output-exp %s %s\n",\r
+ targetName.c_str (),\r
+ base_tmp.c_str (),\r
+ temp_exp.c_str (),\r
+ killAt.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${rm} %s\n",\r
+ base_tmp.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${gcc} %s %s -Wl,%s -o %s %s %s\n",\r
+ GetLinkerMacro ( module ).c_str (),\r
+ gccOptions.c_str (),\r
+ temp_exp.c_str (),\r
+ target.c_str (),\r
+ objectsMacro.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 MingwObjectLibraryModuleHandler objectlibrary_handler;\r
+\r
+MingwObjectLibraryModuleHandler::MingwObjectLibraryModuleHandler ()\r
+ : MingwModuleHandler ( ObjectLibrary )\r
+{\r
+}\r
+\r
+void\r
+MingwObjectLibraryModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateObjectLibraryModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwObjectLibraryModuleHandler::GenerateObjectLibraryModuleTarget ( 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 objectsMacro = GetObjectsMacro ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+ GenerateImportLibraryTargetIfNeeded ( module );\r
+\r
+ if ( module.files.size () > 0 )\r
+ {\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ objectsMacro.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+\r
+ string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\r
+ module.entrypoint.c_str (),\r
+ module.baseaddress.c_str () );\r
+ GenerateLinkerCommand ( module,\r
+ "${gcc}",\r
+ linkerParameters,\r
+ objectsMacro );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ target.c_str ());\r
+ fprintf ( fMakefile, "%s:\n",\r
+ target.c_str ());\r
+ }\r
+}\r
+\r
+\r
+static MingwKernelModeDriverModuleHandler kernelmodedriver_handler;\r
+\r
+MingwKernelModeDriverModuleHandler::MingwKernelModeDriverModuleHandler ()\r
+ : MingwModuleHandler ( KernelModeDriver )\r
+{\r
+}\r
+\r
+void\r
+MingwKernelModeDriverModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateKernelModeDriverModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+\r
+void\r
+MingwKernelModeDriverModuleHandler::GenerateKernelModeDriverModuleTarget ( const Module& module )\r
+{\r
+ static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+ string target ( PassThruCacheDirectory( FixupTargetFilename ( module.GetPath () ) ) );\r
+ string workingDirectory = GetWorkingDirectory ();\r
+ string objectsMacro = GetObjectsMacro ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+ GenerateImportLibraryTargetIfNeeded ( module );\r
+\r
+ if ( module.files.size () > 0 )\r
+ {\r
+ string* cflags = new string ( "-D__NTDRIVER__" );\r
+ GenerateMacrosAndTargetsTarget ( module,\r
+ cflags,\r
+ NULL );\r
+ delete cflags;\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ objectsMacro.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+\r
+ string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\r
+ module.entrypoint.c_str (),\r
+ module.baseaddress.c_str () );\r
+ GenerateLinkerCommand ( module,\r
+ "${gcc}",\r
+ linkerParameters,\r
+ objectsMacro );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ target.c_str ());\r
+ fprintf ( fMakefile, "%s:\n",\r
+ target.c_str () );\r
+ }\r
+}\r
+\r
+\r
+static MingwNativeDLLModuleHandler nativedll_handler;\r
\r
-MingwKernelModuleHandler::MingwKernelModuleHandler ( FILE* fMakefile )\r
- : MingwModuleHandler ( fMakefile )\r
+MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler ()\r
+ : MingwModuleHandler ( NativeDLL )\r
{\r
}\r
\r
-bool\r
-MingwKernelModuleHandler::CanHandleModule ( const Module& module ) const\r
+void\r
+MingwNativeDLLModuleHandler::Process ( const Module& module )\r
{\r
- return module.type == KernelModeDLL;\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateNativeDLLModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
}\r
\r
void\r
-MingwKernelModuleHandler::Process ( const Module& module )\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 objectsMacro = GetObjectsMacro ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+ \r
+ GenerateImportLibraryTargetIfNeeded ( module );\r
+\r
+ if ( module.files.size () > 0 )\r
+ {\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ objectsMacro.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+\r
+ string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll",\r
+ module.entrypoint.c_str (),\r
+ module.baseaddress.c_str () );\r
+ GenerateLinkerCommand ( module,\r
+ "${gcc}",\r
+ linkerParameters,\r
+ objectsMacro );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ target.c_str ());\r
+ fprintf ( fMakefile, "%s:\n\n",\r
+ target.c_str ());\r
+ }\r
+}\r
+\r
+\r
+static MingwNativeCUIModuleHandler nativecui_handler;\r
+\r
+MingwNativeCUIModuleHandler::MingwNativeCUIModuleHandler ()\r
+ : MingwModuleHandler ( NativeCUI )\r
+{\r
+}\r
+\r
+void\r
+MingwNativeCUIModuleHandler::Process ( const Module& module )\r
{\r
GeneratePreconditionDependencies ( module );\r
- GenerateKernelModuleTarget ( module );\r
+ GenerateNativeCUIModuleTarget ( module );\r
GenerateInvocations ( module );\r
}\r
\r
void\r
-MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module& module )\r
+MingwNativeCUIModuleHandler::GenerateNativeCUIModuleTarget ( 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 target ( FixupTargetFilename ( module.GetPath () ) );\r
string workingDirectory = GetWorkingDirectory ( );\r
- string archiveFilename = GetModuleArchiveFilename ( module );\r
+ string objectsMacro = GetObjectsMacro ( module );\r
string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
- string base_tmp = ros_junk + module.name + ".base.tmp";\r
+ \r
+ GenerateImportLibraryTargetIfNeeded ( module );\r
+\r
+ if ( module.files.size () > 0 )\r
+ {\r
+ string* cflags = new string ( "-D__NTAPP__" );\r
+ GenerateMacrosAndTargetsTarget ( module,\r
+ cflags,\r
+ NULL );\r
+ delete cflags;\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ objectsMacro.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+\r
+ string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib",\r
+ module.entrypoint.c_str (),\r
+ module.baseaddress.c_str () );\r
+ GenerateLinkerCommand ( module,\r
+ "${gcc}",\r
+ linkerParameters,\r
+ objectsMacro );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ target.c_str ());\r
+ fprintf ( fMakefile, "%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
+ GenerateExtractWineDLLResourcesTarget ( module );\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateWin32DLLModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwWin32DLLModuleHandler::GenerateExtractWineDLLResourcesTarget ( const Module& module )\r
+{\r
+ fprintf ( fMakefile, ".PHONY: %s_extractresources\n\n",\r
+ module.name.c_str () );\r
+ fprintf ( fMakefile, "%s_extractresources: bin2res\n",\r
+ module.name.c_str () );\r
+ for ( size_t i = 0; i < module.files.size (); i++ )\r
+ {\r
+ File& file = *module.files[i];\r
+ string extension = GetExtension ( file.name );\r
+ if ( extension == ".rc" || extension == ".RC" )\r
+ {\r
+ string resource = FixupTargetFilename ( file.name );\r
+ fprintf ( fMakefile, "\t@echo ${bin2res} -f -x %s\n",\r
+ resource.c_str () );\r
+ }\r
+ }\r
+ fprintf ( fMakefile, "\n");\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 objectsMacro = GetObjectsMacro ( module );\r
+ string linkingDependencies = GetLinkingDependencies ( module );\r
+\r
+ GenerateImportLibraryTargetIfNeeded ( module );\r
+ if ( module.files.size () > 0 )\r
+ {\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+ \r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ objectsMacro.c_str (),\r
+ linkingDependencies.c_str () );\r
+\r
+ string linker;\r
+ if ( IsCPlusPlusModule ( module ) )\r
+ linker = "${gpp}";\r
+ else\r
+ linker = "${gcc}";\r
+\r
+ string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -mdll",\r
+ module.entrypoint.c_str (),\r
+ module.baseaddress.c_str () );\r
+ GenerateLinkerCommand ( module,\r
+ linker,\r
+ linkerParameters,\r
+ objectsMacro );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ target.c_str () );\r
+ fprintf ( fMakefile, "%s:\n\n",\r
+ target.c_str () );\r
+ }\r
+}\r
+\r
+\r
+static MingwWin32CUIModuleHandler win32cui_handler;\r
+\r
+MingwWin32CUIModuleHandler::MingwWin32CUIModuleHandler ()\r
+ : MingwModuleHandler ( Win32CUI )\r
+{\r
+}\r
+\r
+void\r
+MingwWin32CUIModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateWin32CUIModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwWin32CUIModuleHandler::GenerateWin32CUIModuleTarget ( const Module& module )\r
+{\r
+ static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+ string target ( FixupTargetFilename ( module.GetPath () ) );\r
+ string workingDirectory = GetWorkingDirectory ( );\r
+ string objectsMacro = GetObjectsMacro ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+ GenerateImportLibraryTargetIfNeeded ( module );\r
+\r
+ if ( module.files.size () > 0 )\r
+ {\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ objectsMacro.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+\r
+ string linker;\r
+ if ( IsCPlusPlusModule ( module ) )\r
+ linker = "${gpp}";\r
+ else\r
+ linker = "${gcc}";\r
+\r
+ string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",\r
+ module.entrypoint.c_str (),\r
+ module.baseaddress.c_str () );\r
+ GenerateLinkerCommand ( module,\r
+ linker,\r
+ linkerParameters,\r
+ objectsMacro );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ target.c_str ());\r
+ fprintf ( fMakefile, "%s:\n\n",\r
+ target.c_str ());\r
+ }\r
+}\r
+\r
+\r
+static MingwWin32GUIModuleHandler win32gui_handler;\r
+\r
+MingwWin32GUIModuleHandler::MingwWin32GUIModuleHandler ()\r
+ : MingwModuleHandler ( Win32GUI )\r
+{\r
+}\r
+\r
+void\r
+MingwWin32GUIModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateWin32GUIModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwWin32GUIModuleHandler::GenerateWin32GUIModuleTarget ( const Module& module )\r
+{\r
+ static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+ string target ( FixupTargetFilename ( module.GetPath () ) );\r
+ string workingDirectory = GetWorkingDirectory ( );\r
+ string objectsMacro = GetObjectsMacro ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+ GenerateImportLibraryTargetIfNeeded ( module );\r
+\r
+ if ( module.files.size () > 0 )\r
+ {\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+\r
+ fprintf ( fMakefile, "%s: %s %s\n",\r
+ target.c_str (),\r
+ objectsMacro.c_str (),\r
+ importLibraryDependencies.c_str () );\r
+\r
+ string linker;\r
+ if ( IsCPlusPlusModule ( module ) )\r
+ linker = "${gpp}";\r
+ else\r
+ linker = "${gcc}";\r
+\r
+ string linkerParameters = ssprintf ( "-Wl,--subsystem,windows -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",\r
+ module.entrypoint.c_str (),\r
+ module.baseaddress.c_str () );\r
+ GenerateLinkerCommand ( module,\r
+ linker,\r
+ linkerParameters,\r
+ objectsMacro );\r
+ }\r
+ else\r
+ {\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ target.c_str ());\r
+ fprintf ( fMakefile, "%s:\n\n",\r
+ target.c_str ());\r
+ }\r
+}\r
+\r
+\r
+static MingwBootLoaderModuleHandler bootloadermodule_handler;\r
+\r
+MingwBootLoaderModuleHandler::MingwBootLoaderModuleHandler ()\r
+ : MingwModuleHandler ( BootLoader )\r
+{\r
+}\r
+\r
+void\r
+MingwBootLoaderModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateBootLoaderModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwBootLoaderModuleHandler::GenerateBootLoaderModuleTarget ( const Module& module )\r
+{\r
+ static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+ string targetName ( module.GetTargetName () );\r
+ string target ( FixupTargetFilename ( module.GetPath () ) );\r
+ string workingDirectory = GetWorkingDirectory ();\r
string junk_tmp = ros_junk + module.name + ".junk.tmp";\r
- string temp_exp = ros_junk + module.name + ".temp.exp";\r
+ string objectsMacro = GetObjectsMacro ( module );\r
+ string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+ GenerateMacrosAndTargetsTarget ( module );\r
+\r
fprintf ( fMakefile, "%s: %s %s\n",\r
target.c_str (),\r
- archiveFilename.c_str (),\r
+ objectsMacro.c_str (),\r
importLibraryDependencies.c_str () );\r
+\r
fprintf ( fMakefile,\r
- "\t${gcc} -Wl,--base-file,%s -o %s %s %s\n",\r
- base_tmp.c_str (),\r
+ "\t${ld} %s -N -Ttext=0x8000 -o %s %s %s\n",\r
+ GetLinkerMacro ( module ).c_str (),\r
junk_tmp.c_str (),\r
- archiveFilename.c_str (),\r
+ objectsMacro.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${ld} -Wl,%s -o %s %s %s\n",\r
- temp_exp.c_str (),\r
- target.c_str (),\r
- archiveFilename.c_str (),\r
- importLibraryDependencies.c_str () );\r
+ "\t${objcopy} -O binary %s %s\n",\r
+ junk_tmp.c_str (),\r
+ target.c_str () );\r
fprintf ( fMakefile,\r
"\t${rm} %s\n",\r
- temp_exp.c_str () );\r
- \r
- GenerateArchiveTargetTarget ( module );\r
- GenerateObjectFileTargetsTarget ( module );\r
+ junk_tmp.c_str () );\r
}\r
\r
\r
-MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ( FILE* fMakefile )\r
- : MingwModuleHandler ( fMakefile )\r
+static MingwBootSectorModuleHandler bootsectormodule_handler;\r
+\r
+MingwBootSectorModuleHandler::MingwBootSectorModuleHandler ()\r
+ : MingwModuleHandler ( BootSector )\r
{\r
}\r
\r
-bool\r
-MingwStaticLibraryModuleHandler::CanHandleModule ( const Module& module ) const\r
+void\r
+MingwBootSectorModuleHandler::Process ( const Module& module )\r
{\r
- return module.type == StaticLibrary;\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateBootSectorModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
}\r
\r
void\r
-MingwStaticLibraryModuleHandler::Process ( const Module& module )\r
+MingwBootSectorModuleHandler::GenerateBootSectorModuleTarget ( const Module& module )\r
+{\r
+ string objectsMacro = GetObjectsMacro ( module );\r
+\r
+ string* nasmflags = new string ( "-f bin" );\r
+ GenerateMacrosAndTargetsTarget ( module,\r
+ NULL,\r
+ nasmflags);\r
+\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ module.name.c_str ());\r
+ fprintf ( fMakefile,\r
+ "%s: %s\n",\r
+ module.name.c_str (),\r
+ objectsMacro.c_str () );\r
+}\r
+\r
+\r
+static MingwIsoModuleHandler isomodule_handler;\r
+\r
+MingwIsoModuleHandler::MingwIsoModuleHandler ()\r
+ : MingwModuleHandler ( Iso )\r
+{\r
+}\r
+\r
+void\r
+MingwIsoModuleHandler::Process ( const Module& module )\r
{\r
GeneratePreconditionDependencies ( module );\r
- GenerateStaticLibraryModuleTarget ( module );\r
+ GenerateIsoModuleTarget ( module );\r
GenerateInvocations ( module );\r
}\r
\r
void\r
-MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Module& module )\r
+MingwIsoModuleHandler::OutputBootstrapfileCopyCommands ( const string bootcdDirectory,\r
+ const Module& module ) const\r
+{\r
+ for ( size_t i = 0; i < module.project.modules.size (); i++ )\r
+ {\r
+ const Module& m = *module.project.modules[i];\r
+ if ( m.bootstrap != NULL )\r
+ {\r
+ string targetFilenameNoFixup = bootcdDirectory + SSEP + m.bootstrap->base + SSEP + m.bootstrap->nameoncd;\r
+ string targetFilename = PassThruCacheDirectory ( FixupTargetFilename ( targetFilenameNoFixup ) );\r
+ fprintf ( fMakefile,\r
+ "\t${cp} %s %s\n",\r
+ m.GetPath ().c_str (),\r
+ targetFilename.c_str () );\r
+ }\r
+ }\r
+}\r
+\r
+void\r
+MingwIsoModuleHandler::OutputCdfileCopyCommands ( const string bootcdDirectory,\r
+ const Module& module ) const\r
+{\r
+ for ( size_t i = 0; i < module.project.cdfiles.size (); i++ )\r
+ {\r
+ const CDFile& cdfile = *module.project.cdfiles[i];\r
+ string targetFilenameNoFixup = bootcdDirectory + SSEP + cdfile.base + SSEP + cdfile.nameoncd;\r
+ string targetFilename = PassThruCacheDirectory ( FixupTargetFilename ( targetFilenameNoFixup ) );\r
+ fprintf ( fMakefile,\r
+ "\t${cp} %s %s\n",\r
+ cdfile.GetPath ().c_str (),\r
+ targetFilename.c_str () );\r
+ }\r
+}\r
+\r
+string\r
+MingwIsoModuleHandler::GetBootstrapCdDirectories ( const string bootcdDirectory,\r
+ const Module& module ) const\r
+{\r
+ string directories;\r
+ for ( size_t i = 0; i < module.project.modules.size (); i++ )\r
+ {\r
+ const Module& m = *module.project.modules[i];\r
+ if ( m.bootstrap != NULL )\r
+ {\r
+ string targetDirecctory = bootcdDirectory + SSEP + m.bootstrap->base;\r
+ if ( directories.size () > 0 )\r
+ directories += " ";\r
+ directories += FixupTargetFilename ( targetDirecctory );\r
+ }\r
+ }\r
+ return directories;\r
+}\r
+\r
+string\r
+MingwIsoModuleHandler::GetNonModuleCdDirectories ( const string bootcdDirectory,\r
+ const Module& module ) const\r
+{\r
+ string directories;\r
+ for ( size_t i = 0; i < module.project.cdfiles.size (); i++ )\r
+ {\r
+ const CDFile& cdfile = *module.project.cdfiles[i];\r
+ string targetDirecctory = bootcdDirectory + SSEP + cdfile.base;\r
+ if ( directories.size () > 0 )\r
+ directories += " ";\r
+ directories += FixupTargetFilename ( targetDirecctory );\r
+ }\r
+ return directories;\r
+}\r
+\r
+string\r
+MingwIsoModuleHandler::GetCdDirectories ( const string bootcdDirectory,\r
+ const Module& module ) const\r
+{\r
+ string directories = GetBootstrapCdDirectories ( bootcdDirectory,\r
+ module );\r
+ directories += " " + GetNonModuleCdDirectories ( bootcdDirectory,\r
+ module );\r
+ return directories;\r
+}\r
+\r
+string\r
+MingwIsoModuleHandler::GetBootstrapCdFiles ( const string bootcdDirectory,\r
+ const Module& module ) const\r
+{\r
+ string cdfiles;\r
+ for ( size_t i = 0; i < module.project.modules.size (); i++ )\r
+ {\r
+ const Module& m = *module.project.modules[i];\r
+ if ( m.bootstrap != NULL )\r
+ {\r
+ if ( cdfiles.size () > 0 )\r
+ cdfiles += " ";\r
+ cdfiles += FixupTargetFilename ( m.GetPath () );\r
+ }\r
+ }\r
+ return cdfiles;\r
+}\r
+\r
+string\r
+MingwIsoModuleHandler::GetNonModuleCdFiles ( const string bootcdDirectory,\r
+ const Module& module ) const\r
+{\r
+ string cdfiles;\r
+ for ( size_t i = 0; i < module.project.cdfiles.size (); i++ )\r
+ {\r
+ const CDFile& cdfile = *module.project.cdfiles[i];\r
+ if ( cdfiles.size () > 0 )\r
+ cdfiles += " ";\r
+ cdfiles += NormalizeFilename ( cdfile.GetPath () );\r
+ }\r
+ return cdfiles;\r
+}\r
+\r
+string\r
+MingwIsoModuleHandler::GetCdFiles ( const string bootcdDirectory,\r
+ const Module& module ) const\r
+{\r
+ string cdfiles = GetBootstrapCdFiles ( bootcdDirectory,\r
+ module );\r
+ cdfiles += " " + GetNonModuleCdFiles ( bootcdDirectory,\r
+ module );\r
+ return cdfiles;\r
+}\r
+\r
+void\r
+MingwIsoModuleHandler::GenerateIsoModuleTarget ( const Module& module )\r
{\r
- GenerateArchiveTargetTarget ( module );\r
- GenerateObjectFileTargetsTarget ( module );\r
+ string bootcdDirectory = "cd";\r
+ string isoboot = FixupTargetFilename ( "boot/freeldr/bootsect/isoboot.o" );\r
+ string bootcdReactosNoFixup = bootcdDirectory + "/reactos";\r
+ string bootcdReactos = FixupTargetFilename ( bootcdReactosNoFixup );\r
+ PassThruCacheDirectory ( bootcdReactos + SSEP );\r
+ string reactosInf = FixupTargetFilename ( bootcdReactosNoFixup + "/reactos.inf" );\r
+ string reactosDff = NormalizeFilename ( "bootdata/packages/reactos.dff" );\r
+ string cdDirectories = bootcdReactos + " " + GetCdDirectories ( bootcdDirectory,\r
+ module );\r
+ string cdFiles = GetCdFiles ( bootcdDirectory,\r
+ module );\r
+\r
+ fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+ module.name.c_str ());\r
+ fprintf ( fMakefile,\r
+ "%s: all %s %s %s\n",\r
+ module.name.c_str (),\r
+ isoboot.c_str (),\r
+ cdDirectories.c_str (),\r
+ cdFiles.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${cabman} -C %s -L %s -I\n",\r
+ reactosDff.c_str (),\r
+ bootcdReactos.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t${cabman} -C %s -RC %s -L %s -N\n",\r
+ reactosDff.c_str (),\r
+ reactosInf.c_str (),\r
+ bootcdReactos.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\t- ${rm} %s\n",\r
+ reactosInf.c_str () );\r
+ OutputBootstrapfileCopyCommands ( bootcdDirectory,\r
+ module );\r
+ OutputCdfileCopyCommands ( bootcdDirectory,\r
+ module );\r
+ fprintf ( fMakefile,\r
+ "\t${cdmake} -v -m -b %s %s REACTOS ReactOS.iso\n",\r
+ isoboot.c_str (),\r
+ bootcdDirectory.c_str () );\r
+ fprintf ( fMakefile,\r
+ "\n" );\r
}\r