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
}\r
\r
const string &\r
-MingwModuleHandler::PassThruCacheDirectory( const string &file ) const \r
+MingwModuleHandler::PassThruCacheDirectory ( const string &file ) const \r
{\r
- directory_set.insert( ReplaceExtension( GetDirectory( file ), "" ) );\r
- return file;\r
+ directory_set.insert ( GetDirectory ( file ) );\r
+ return file;\r
}\r
\r
void\r
return ".";\r
}\r
\r
-string \r
-MingwModuleHandler::GetDirectory ( const string& filename ) const \r
-{\r
- size_t index = filename.find_last_of ( '/' );\r
- if (index == string::npos)\r
- return ".";\r
- else\r
- return filename.substr ( 0, index );\r
-}\r
-\r
string\r
MingwModuleHandler::GetBasename ( const string& filename ) const\r
{\r
size_t index = filename.find_last_of ( '.' );\r
- if (index != string::npos)\r
+ if ( index != string::npos )\r
return filename.substr ( 0, 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) 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
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
+ string basename = GetBasename ( filename );\r
return basename + ".stubs.c";\r
}\r
else\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
sourceFilenames += " " + GetActualSourceFilename ( module.files[i]->name );\r
}\r
vector<If*> ifs = module.ifs;\r
- for ( i = 0; i < ifs.size(); i++ )\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
+ 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
+ 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
string\r
-MingwModuleHandler::GetObjectFilename ( const string& sourceFilename ) const\r
+MingwModuleHandler::GetObjectFilename ( const string& sourceFilename )\r
{\r
string newExtension;\r
string extension = GetExtension ( sourceFilename );\r
newExtension = ".stubs.o";\r
else\r
newExtension = ".o";\r
- return PassThruCacheDirectory (\r
- FixupTargetFilename (\r
- ReplaceExtension ( sourceFilename, newExtension ) ) );\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
+MingwModuleHandler::GenerateDirectoryTargets () const\r
{\r
+ if ( directory_set.size () == 0 )\r
+ return;\r
+ \r
set_string::iterator i;\r
- fprintf( fMakefile, "ifneq ($(ROS_INTERMEDIATE),)\ndirectories::" );\r
+ fprintf ( fMakefile, "directories::" );\r
\r
- for ( i = directory_set.begin();\r
- i != directory_set.end();\r
+ for ( i = directory_set.begin ();\r
+ i != directory_set.end ();\r
i++ )\r
{\r
- fprintf ( fMakefile, " %s", i->c_str() );\r
+ if ( IncludeDirectoryTarget ( *i ) )\r
+ {\r
+ fprintf ( fMakefile,\r
+ " %s",\r
+ i->c_str () );\r
+ }\r
}\r
\r
- fprintf( fMakefile, "\n\n" );\r
+ fprintf ( fMakefile, "\n\n" );\r
\r
- for ( i = directory_set.begin();\r
- i != directory_set.end();\r
+ for ( i = directory_set.begin ();\r
+ i != directory_set.end ();\r
i++ )\r
{\r
- fprintf ( fMakefile, "%s ", i->c_str() );\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
- "else\n"\r
- "directories::\n\n"\r
- "endif\n\n" );\r
+ "::\n\t${mkdir} $@\n\n" );\r
\r
- directory_set.clear();\r
+ directory_set.clear ();\r
}\r
\r
string\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
{\r
size_t i;\r
\r
- if ( includes.size() || defines.size() )\r
+ if ( includes.size () > 0 || defines.size () > 0 )\r
{\r
GenerateMacro ( assignmentOperation,\r
cflags_macro,\r
}\r
}\r
\r
- if ( files.size() )\r
+ if ( files.size () > 0 )\r
{\r
- for ( i = 0; i < files.size(); i++ )\r
+ for ( i = 0; i < files.size (); i++ )\r
{\r
if ( files[i]->first )\r
{\r
fprintf ( fMakefile,\r
"%s := %s $(%s)\n",\r
objs_macro.c_str(),\r
- GetObjectFilename(files[i]->name).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
+ objs_macro.c_str (),\r
assignmentOperation );\r
for ( i = 0; i < files.size(); i++ )\r
{\r
- string extension = GetExtension ( files[i]->name );\r
- if ( extension != ".spec"\r
- && extension != ".SPEC"\r
- && !files[i]->first )\r
+ if ( !files[i]->first )\r
{\r
fprintf (\r
fMakefile,\r
"%s%s",\r
( i%10 == 9 ? "\\\n\t" : " " ),\r
- GetObjectFilename(files[i]->name).c_str() );\r
+ PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( files[i]->name ) ).c_str () );\r
}\r
}\r
fprintf ( fMakefile, "\n" );\r
const string& cc,\r
const string& cflagsMacro ) const\r
{\r
- string objectFilename = GetObjectFilename ( sourceFilename );\r
+ string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
fprintf ( fMakefile,\r
"%s: %s\n",\r
objectFilename.c_str (),\r
const string& cc,\r
const string& cflagsMacro ) const\r
{\r
- string objectFilename = GetObjectFilename ( sourceFilename );\r
+ string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
fprintf ( fMakefile,\r
"%s: %s\n",\r
objectFilename.c_str (),\r
const string& sourceFilename,\r
const string& nasmflagsMacro ) const\r
{\r
- string objectFilename = GetObjectFilename ( sourceFilename );\r
+ string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
fprintf ( fMakefile,\r
"%s: %s\n",\r
objectFilename.c_str (),\r
const string& sourceFilename,\r
const string& windresflagsMacro ) const\r
{\r
- string objectFilename = GetObjectFilename ( sourceFilename );\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%s %s -o %s ${%s}\n",\r
- "${windres}",\r
+ "\t${gcc} -xc -E -DRC_INVOKED ${%s} %s > %s\n",\r
+ windresflagsMacro.c_str (),\r
sourceFilename.c_str (),\r
- objectFilename.c_str (),\r
- windresflagsMacro.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
cflagsMacro );\r
return;\r
}\r
- else if ( extension == ".cxx" || extension == ".CXX" )\r
+ else if ( extension == ".cc" || extension == ".CC" ||\r
+ extension == ".cpp" || extension == ".CPP" ||\r
+ extension == ".cxx" || extension == ".CXX" )\r
{\r
GenerateGccCommand ( module,\r
sourceFilename,\r
size_t i;\r
\r
for ( i = 0; i < files.size(); i++ )\r
- out.push_back ( GetObjectFilename(files[i]->name) );\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
clean_files.push_back ( ar_target );\r
GetCleanTargets ( clean_files, module.files, module.ifs );\r
\r
- fprintf ( fMakefile, "clean::\n\t-@$(rm)" );\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\n" );\r
+ fprintf ( fMakefile, " 2>$(NUL)\n" );\r
+ fprintf ( fMakefile, "clean: %s_clean\n\n", module.name.c_str() );\r
}\r
\r
void\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
fprintf ( fMakefile,\r
"\t%s %s\n\n",\r
FixupTargetFilename ( invoke.invokeModule->GetPath () ).c_str (),\r
- GetInvocationParameters ( invoke ).c_str () );\r
+ invoke.GetParameters ().c_str () );\r
}\r
}\r
\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 = GetModuleDependencies ( module );\r
- string s = GetInvocationDependencies ( 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
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
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::GenerateBuildToolModuleTarget ( const Module& module )\r
{\r
string target ( FixupTargetFilename ( module.GetPath () ) );\r
- string archiveFilename = GetModuleArchiveFilename ( module );\r
+ string objectsMacro = GetObjectsMacro ( module );\r
string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
\r
GenerateMacrosAndTargetsHost ( module );\r
\r
string linker;\r
- if ( module.HasFileWithExtensions ( ".cxx", ".CXX" ) )\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
- archiveFilename.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
- archiveFilename.c_str (),\r
+ objectsMacro.c_str (),\r
importLibraryDependencies.c_str () );\r
}\r
\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,0xC0000000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\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.entrypoint.c_str (),\r
+ module.baseaddress.c_str () );\r
\r
GenerateMacrosAndTargetsTarget ( 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 objectsMacro = GetObjectsMacro ( module );\r
string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
\r
GenerateImportLibraryTargetIfNeeded ( 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
- string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\r
- module.entrypoint.c_str () );\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
- archiveFilename );\r
+ objectsMacro );\r
}\r
else\r
{\r
{\r
static string ros_junk ( "$(ROS_TEMPORARY)" );\r
string target ( PassThruCacheDirectory( FixupTargetFilename ( module.GetPath () ) ) );\r
- string workingDirectory = GetWorkingDirectory ( );\r
- string archiveFilename = GetModuleArchiveFilename ( module );\r
+ string workingDirectory = GetWorkingDirectory ();\r
+ string objectsMacro = GetObjectsMacro ( module );\r
string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
\r
GenerateImportLibraryTargetIfNeeded ( 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
- string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\r
- module.entrypoint.c_str () );\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
- archiveFilename );\r
+ objectsMacro );\r
}\r
else\r
{\r
static string ros_junk ( "$(ROS_TEMPORARY)" );\r
string target ( FixupTargetFilename ( module.GetPath () ) );\r
string workingDirectory = GetWorkingDirectory ( );\r
- string objectFilenames = GetObjectFilenames ( module );\r
- string archiveFilename = GetModuleArchiveFilename ( module );\r
+ string objectsMacro = GetObjectsMacro ( module );\r
string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
\r
GenerateImportLibraryTargetIfNeeded ( module );\r
\r
if ( module.files.size () > 0 )\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
+ 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
- if (module.files.size () > 0)\r
+MingwNativeCUIModuleHandler::MingwNativeCUIModuleHandler ()\r
+ : MingwModuleHandler ( NativeCUI )\r
+{\r
+}\r
+\r
+void\r
+MingwNativeCUIModuleHandler::Process ( const Module& module )\r
+{\r
+ GeneratePreconditionDependencies ( module );\r
+ GenerateNativeCUIModuleTarget ( module );\r
+ GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwNativeCUIModuleHandler::GenerateNativeCUIModuleTarget ( 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
+ 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
- archiveFilename.c_str (),\r
+ objectsMacro.c_str (),\r
importLibraryDependencies.c_str () );\r
\r
- string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll",\r
- module.entrypoint.c_str () );\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
- objectFilenames );\r
+ objectsMacro );\r
}\r
else\r
{\r
static string ros_junk ( "$(ROS_TEMPORARY)" );\r
string target ( FixupTargetFilename ( module.GetPath () ) );\r
string workingDirectory = GetWorkingDirectory ( );\r
- string objectFilenames = GetObjectFilenames ( module );\r
+ string objectsMacro = GetObjectsMacro ( module );\r
string linkingDependencies = GetLinkingDependencies ( module );\r
\r
GenerateImportLibraryTargetIfNeeded ( module );\r
\r
fprintf ( fMakefile, "%s: %s %s\n",\r
target.c_str (),\r
- objectFilenames.c_str (),\r
+ objectsMacro.c_str (),\r
linkingDependencies.c_str () );\r
\r
- string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -mdll",\r
- module.entrypoint.c_str () );\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
- "${gcc}",\r
+ linker,\r
linkerParameters,\r
- objectFilenames );\r
+ objectsMacro );\r
}\r
else\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
static string ros_junk ( "$(ROS_TEMPORARY)" );\r
string target ( FixupTargetFilename ( module.GetPath () ) );\r
string workingDirectory = GetWorkingDirectory ( );\r
- string objectFilenames = GetObjectFilenames ( module );\r
+ string objectsMacro = GetObjectsMacro ( module );\r
string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
\r
GenerateImportLibraryTargetIfNeeded ( module );\r
\r
fprintf ( fMakefile, "%s: %s %s\n",\r
target.c_str (),\r
- objectFilenames.c_str (),\r
+ objectsMacro.c_str (),\r
importLibraryDependencies.c_str () );\r
\r
- string linkerParameters = ssprintf ( "-Wl,--subsystem,windows -Wl,--entry,%s -Wl,--image-base,0x00400000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",\r
- module.entrypoint.c_str () );\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
- "${gcc}",\r
+ linker,\r
linkerParameters,\r
- objectFilenames );\r
+ objectsMacro );\r
}\r
else\r
{\r
{\r
static string ros_junk ( "$(ROS_TEMPORARY)" );\r
string targetName ( module.GetTargetName () );\r
- string target ( FixupTargetFilename (module.GetPath ()) );\r
+ string target ( FixupTargetFilename ( module.GetPath () ) );\r
string workingDirectory = GetWorkingDirectory ();\r
string junk_tmp = ros_junk + module.name + ".junk.tmp";\r
string objectsMacro = GetObjectsMacro ( module );\r
GenerateInvocations ( module );\r
}\r
\r
+void\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
- string isoboot = "$(ROS_INTERMEDIATE)" + FixupTargetFilename ( "boot/freeldr/bootsect/isoboot.o" );\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\n",\r
+ "%s: all %s %s %s\n",\r
module.name.c_str (),\r
- isoboot.c_str () );\r
+ isoboot.c_str (),\r
+ cdDirectories.c_str (),\r
+ cdFiles.c_str () );\r
fprintf ( fMakefile,\r
- "\t${cabman} /C %s /L $(ROS_INTERMEDIATE)%s /I\n",\r
- FixupTargetFilename ( "bootdata/packages/reactos.dff" ).c_str (),\r
- FixupTargetFilename ( "bootcd/reactos" ).c_str () );\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 $(ROS_INTERMEDIATE)%s /L $(BOOTCD_DIR)reactos /N\n",\r
- FixupTargetFilename ( "bootdata/packages/reactos.dff" ).c_str (),\r
- FixupTargetFilename ( "bootcd/reactos/reactos.inf" ).c_str () );\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} $(ROS_INTERMEDIATE)%s\n",\r
- FixupTargetFilename ( "bootcd/reactos/reactos.inf" ).c_str () );\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 $(ROS_INTERMEDIATE)bootcd REACTOS ReactOS.iso\n",\r
- isoboot.c_str () );\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