/*
* Copyright (C) 2005 Casper S. Hornstrup
+ * 2007-2008 Hervé Poussineau
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*/
#include "../../pch.h"
#include <assert.h>
+#include <algorithm>
#include "../../rbuild.h"
#include "mingw.h"
#include "modulehandler.h"
+#include "rule.h"
+using std::set;
using std::string;
using std::vector;
-#define CLEAN_FILE(f) clean_files.push_back ( (f)->name.length () > 0 ? strFile ( f ) : strDirectory ( f ) );
+#define CLEAN_FILE(f) clean_files.push_back ( (f).name.length () > 0 ? backend->GetFullName ( f ) : backend->GetFullPath ( f ) );
+#define IsStaticLibrary( module ) ( ( module.type == StaticLibrary ) || ( module.type == HostStaticLibrary ) )
MingwBackend*
MingwModuleHandler::backend = NULL;
FILE*
MingwModuleHandler::fMakefile = NULL;
-extern string
-strDirectory ( const FileLocation *file );
-extern string
-strFile ( const FileLocation *file );
-
string
PrefixFilename (
const string& filename,
return file;
}
-/*static*/ const FileLocation*
+/* caller needs to delete the returned object */
+const FileLocation*
MingwModuleHandler::GetTargetFilename (
const Module& module,
string_list* pclean_files )
if ( pclean_files )
{
string_list& clean_files = *pclean_files;
- CLEAN_FILE ( target );
+ CLEAN_FILE ( *target );
}
return target;
}
-/*static*/ const FileLocation*
+/* caller needs to delete the returned object */
+const FileLocation*
MingwModuleHandler::GetImportLibraryFilename (
const Module& module,
string_list* pclean_files )
if ( pclean_files )
{
string_list& clean_files = *pclean_files;
- CLEAN_FILE ( target );
+ CLEAN_FILE ( *target );
}
return target;
}
-/*static*/ MingwModuleHandler*
+/* caller needs to delete the returned object */
+MingwModuleHandler*
MingwModuleHandler::InstanciateHandler (
const Module& module,
MingwBackend* backend )
case StaticLibrary:
handler = new MingwStaticLibraryModuleHandler ( module );
break;
+ case HostStaticLibrary:
+ handler = new MingwHostStaticLibraryModuleHandler ( module );
+ break;
case ObjectLibrary:
handler = new MingwObjectLibraryModuleHandler ( module );
break;
case Win32DLL:
handler = new MingwWin32DLLModuleHandler ( module );
break;
- case Win32OCX:
+ case Win32OCX:
handler = new MingwWin32OCXModuleHandler ( module );
break;
case KernelModeDriver:
case RpcClient:
handler = new MingwRpcClientModuleHandler ( module );
break;
+ case RpcProxy:
+ handler = new MingwRpcProxyModuleHandler ( module );
+ break;
case Alias:
handler = new MingwAliasModuleHandler ( module );
break;
case IdlHeader:
handler = new MingwIdlHeaderModuleHandler ( module );
break;
+ case Cabinet:
+ handler = new MingwCabinetModuleHandler ( module );
+ break;
case EmbeddedTypeLib:
handler = new MingwEmbeddedTypeLibModuleHandler ( module );
break;
return "";
}
+/* caller needs to delete the returned object */
const FileLocation*
MingwModuleHandler::GetActualSourceFilename (
const FileLocation* file ) const
{
string filename = file->name;
- string extension = GetExtension ( filename );
+ string extension = GetExtension ( *file );
if ( extension == ".spec" || extension == ".SPEC" )
{
- string basename = GetBasename ( filename );
- return new FileLocation (
- IntermediateDirectory,
- file->relative_path,
- basename + ".stubs.c" );
- }
- else if ( extension == ".idl" || extension == ".IDL" )
- {
- string basename = GetBasename ( filename );
- if ( module.type == RpcServer )
- {
- return new FileLocation (
- IntermediateDirectory,
- file->relative_path,
- basename + "_s.c" );
- }
- else if ( module.type == RpcClient )
- {
- return new FileLocation (
- IntermediateDirectory,
- file->relative_path,
- basename + "_c.c" );
- }
- else
- {
- return new FileLocation ( *file );
- }
+ const FileLocation *objectFile = GetObjectFilename ( file, module );
+ FileLocation *sourceFile = new FileLocation (
+ objectFile->directory,
+ objectFile->relative_path,
+ ReplaceExtension ( objectFile->name, ".c" ) );
+ delete objectFile;
+ return sourceFile;
+ }
+ else if ( ( extension == ".idl" || extension == ".IDL" ) &&
+ ( module.type == RpcServer || module.type == RpcClient || module.type == RpcProxy ) )
+ {
+ const FileLocation *objectFile = GetObjectFilename ( file, module );
+ FileLocation *sourceFile = new FileLocation (
+ objectFile->directory,
+ objectFile->relative_path,
+ ReplaceExtension ( objectFile->name, ".c" ) );
+ delete objectFile;
+ return sourceFile;
+ }
+ else if ( extension == ".mc" || extension == ".MC" )
+ {
+ const FileLocation *objectFile = GetObjectFilename ( file, module );
+ FileLocation *sourceFile = new FileLocation (
+ objectFile->directory,
+ objectFile->relative_path,
+ ReplaceExtension ( objectFile->name, ".rc" ) );
+ delete objectFile;
+ return sourceFile;
}
else
return new FileLocation ( *file );
MingwModuleHandler::GetExtraDependencies (
const FileLocation *file ) const
{
- string extension = GetExtension ( file->name );
+ string extension = GetExtension ( *file );
if ( extension == ".idl" || extension == ".IDL" )
{
- if ( (module.type == RpcServer) || (module.type == RpcClient) )
- return strFile ( GetRpcServerHeaderFilename ( file ) )
- + " "
- + strFile ( GetRpcClientHeaderFilename ( file ) );
- else if ( module.type == IdlHeader )
- return strFile ( GetIdlHeaderFilename ( file ) );
- else
+ const FileLocation *header;
+ switch ( module.type )
+ {
+ case RpcServer: header = GetRpcServerHeaderFilename ( file ); break;
+ case RpcClient: header = GetRpcClientHeaderFilename ( file ); break;
+ case RpcProxy: header = GetRpcProxyHeaderFilename ( file ); break;
+ case IdlHeader: header = GetIdlHeaderFilename ( file ); break;
+ default: header = NULL; break;
+ }
+ if ( !header )
return "";
+
+ string dependencies = backend->GetFullName ( *header );
+ delete header;
+ return " " + dependencies;
}
else
return "";
MingwModuleHandler::GetCompilationUnitDependencies (
const CompilationUnit& compilationUnit ) const
{
- if ( compilationUnit.files.size () <= 1 )
+ if ( compilationUnit.GetFiles ().size () <= 1 )
return "";
vector<string> sourceFiles;
- for ( size_t i = 0; i < compilationUnit.files.size (); i++ )
+ for ( size_t i = 0; i < compilationUnit.GetFiles ().size (); i++ )
{
- File& file = *compilationUnit.files[i];
- sourceFiles.push_back ( NormalizeFilename ( file.name ) );
+ const File& file = *compilationUnit.GetFiles ()[i];
+ sourceFiles.push_back ( backend->GetFullName ( file.file ) );
}
- return v2s ( sourceFiles, 10 );
+ return string ( " " ) + v2s ( sourceFiles, 10 );
}
+/* caller needs to delete the returned object */
const FileLocation*
MingwModuleHandler::GetModuleArchiveFilename () const
{
- if ( module.type == StaticLibrary )
- return new FileLocation ( *GetTargetFilename ( module, NULL ) );
+ if ( IsStaticLibrary ( module ) )
+ return GetTargetFilename ( module, NULL );
return new FileLocation ( IntermediateDirectory,
module.output->relative_path,
ReplaceExtension ( module.name, ".temp.a" ) );
bool
MingwModuleHandler::IsGeneratedFile ( const File& file ) const
{
- string extension = GetExtension ( file.name );
+ string extension = GetExtension ( file.file );
return ( extension == ".spec" || extension == ".SPEC" );
}
return true;
if ( module.type == RpcClient )
return true;
+ if ( module.type == RpcProxy )
+ return true;
if ( module.type == IdlHeader )
return true;
return false;
"\t$(ECHO_CP)\n" );
fprintf ( fMakefile,
"\t${cp} %s %s 1>$(NUL)\n",
- strFile ( &source ).c_str (),
- strFile ( PassThruCacheDirectory ( &destination ) ).c_str () );
+ backend->GetFullName ( source ).c_str (),
+ backend->GetFullName ( *PassThruCacheDirectory ( &destination ) ).c_str () );
}
string
{
string dep;
if ( ReferenceObjects ( importedModule ) )
+ {
+ const vector<CompilationUnit*>& compilationUnits = importedModule.non_if_data.compilationUnits;
+ size_t i;
+
dep = GetTargetMacro ( importedModule );
+ for ( i = 0; i < compilationUnits.size (); i++ )
+ {
+ CompilationUnit& compilationUnit = *compilationUnits[i];
+ const FileLocation& compilationName = compilationUnit.GetFilename ();
+ const FileLocation *objectFilename = GetObjectFilename ( &compilationName, importedModule );
+ if ( GetExtension ( *objectFilename ) == ".h" )
+ dep += ssprintf ( " $(%s_HEADERS)", importedModule.name.c_str () );
+ else if ( GetExtension ( *objectFilename ) == ".rc" )
+ dep += ssprintf ( " $(%s_MCHEADERS)", importedModule.name.c_str () );
+ }
+ }
else
- dep = strFile ( GetImportLibraryFilename ( importedModule, NULL ) );
+ {
+ const FileLocation *library_target = GetImportLibraryFilename ( importedModule, NULL );
+ dep = backend->GetFullName ( *library_target );
+ delete library_target;
+ }
return dep;
}
}
vector<FileLocation> v;
GetDefinitionDependencies ( v );
+
for ( size_t i = 0; i < v.size (); i++ )
{
const FileLocation& file = v[i];
- dependencies.push_back ( strFile ( &file ) );
+ dependencies.push_back ( backend->GetFullName ( file ) );
}
}
{
if ( includeGeneratedFiles || !compilationUnits[i]->IsGeneratedFile () )
{
- const FileLocation* sourceFileLocation = GetActualSourceFilename (
- compilationUnits[i]->GetFilename () );
+ const FileLocation& compilationName = compilationUnits[i]->GetFilename ();
+ const FileLocation* sourceFileLocation = GetActualSourceFilename ( &compilationName );
list.push_back ( *sourceFileLocation );
+ delete sourceFileLocation;
}
}
// intentionally make a copy so that we can append more work in
CompilationUnit& compilationUnit = *compilationUnits[j];
if ( includeGeneratedFiles || !compilationUnit.IsGeneratedFile () )
{
- const FileLocation* sourceFileLocation = GetActualSourceFilename (
- compilationUnit.GetFilename () );
+ const FileLocation& compilationName = compilationUnit.GetFilename ();
+ const FileLocation* sourceFileLocation = GetActualSourceFilename ( &compilationName );
list.push_back ( *sourceFileLocation );
+ delete sourceFileLocation;
}
}
}
GetSourceFilenames ( list, false );
}
+/* caller needs to delete the returned object */
const FileLocation*
MingwModuleHandler::GetObjectFilename (
const FileLocation* sourceFile,
- string_list* pclean_files ) const
+ const Module& module ) const
{
- string sourceFilename = sourceFile->name;
DirectoryLocation destination_directory;
string newExtension;
- string extension = GetExtension ( sourceFilename );
- if ( extension == ".rc" || extension == ".RC" )
- newExtension = ".coff";
+ string extension = GetExtension ( *sourceFile );
+
+ if ( module.type == BootSector )
+ return new FileLocation ( *module.output );
+ else if ( extension == ".rc" || extension == ".RC" )
+ newExtension = "_" + module.name + ".coff";
+ else if ( extension == ".mc" || extension == ".MC" )
+ newExtension = ".rc";
else if ( extension == ".spec" || extension == ".SPEC" )
newExtension = ".stubs.o";
else if ( extension == ".idl" || extension == ".IDL" )
newExtension = "_s.o";
else if ( module.type == RpcClient )
newExtension = "_c.o";
+ else if ( module.type == RpcProxy )
+ newExtension = "_p.o";
else
newExtension = ".h";
}
else
- newExtension = ".o";
+ newExtension = "_" + module.name + ".o";
if ( module.type == BootSector )
destination_directory = OutputDirectory;
destination_directory,
sourceFile->relative_path,
ReplaceExtension ( sourceFile->name, newExtension ) );
+ PassThruCacheDirectory ( obj_file );
- if ( pclean_files )
- {
- string_list& clean_files = *pclean_files;
- CLEAN_FILE ( obj_file );
- }
return obj_file;
}
fprintf ( fMakefile, " %s", clean_files[i].c_str() );
}
fprintf ( fMakefile, " 2>$(NUL)\n" );
+
+ if( ProxyMakefile::GenerateProxyMakefile(module) )
+ {
+ DirectoryLocation root;
+
+ if ( backend->configuration.GenerateProxyMakefilesInSourceTree )
+ root = SourceDirectory;
+ else
+ root = OutputDirectory;
+
+ FileLocation proxyMakefile ( root,
+ module.output->relative_path,
+ "GNUmakefile" );
+ fprintf ( fMakefile, "\t-@${rm} %s 2>$(NUL)\n",
+ backend->GetFullName ( proxyMakefile ).c_str () );
+ }
+
fprintf ( fMakefile, "clean: %s_clean\n\n", module.name.c_str() );
}
fprintf ( fMakefile,
"%s_install: %s\n",
module.name.c_str (),
- strFile ( module.install ).c_str () );
+ backend->GetFullName ( *module.install ).c_str () );
}
void
{
if ( objectFilenames.size () > 0 )
objectFilenames += " ";
- objectFilenames += strFile ( GetObjectFilename ( compilationUnits[i]->GetFilename (), NULL ) );
+ const FileLocation& compilationName = compilationUnits[i]->GetFilename ();
+ const FileLocation *object_file = GetObjectFilename ( &compilationName, module );
+ objectFilenames += backend->GetFullName ( *object_file );
+ delete object_file;
}
return objectFilenames;
}
/* static */ string
MingwModuleHandler::GenerateGccDefineParametersFromVector (
- const vector<Define*>& defines )
+ const vector<Define*>& defines,
+ set<string>& used_defs)
{
string parameters;
+
for ( size_t i = 0; i < defines.size (); i++ )
{
Define& define = *defines[i];
+ if (used_defs.find(define.name) != used_defs.end())
+ continue;
if (parameters.length () > 0)
parameters += " ";
+ if (define.name.find('(') != string::npos)
+ parameters += "$(QT)";
parameters += "-D";
parameters += define.name;
if (define.value.length () > 0)
parameters += "=";
parameters += define.value;
}
+ if (define.name.find('(') != string::npos)
+ parameters += "$(QT)";
+ used_defs.insert(used_defs.begin(),define.name);
}
return parameters;
}
string
MingwModuleHandler::GenerateGccDefineParameters () const
{
- string parameters = GenerateGccDefineParametersFromVector ( module.project.non_if_data.defines );
- string s = GenerateGccDefineParametersFromVector ( module.non_if_data.defines );
+ set<string> used_defs;
+ string parameters = GenerateGccDefineParametersFromVector ( module.project.non_if_data.defines, used_defs );
+ string s = GenerateGccDefineParametersFromVector ( module.non_if_data.defines, used_defs );
if ( s.length () > 0 )
{
parameters += " ";
Include& include = *includes[i];
if ( parameters.length () > 0 )
parameters += " ";
- parameters += "-I" + strDirectory ( include.directory );;
+ parameters += "-I" + backend->GetFullPath ( *include.directory );;
}
return parameters;
}
}
string
-MingwModuleHandler::GenerateCompilerParametersFromVector ( const vector<CompilerFlag*>& compilerFlags ) const
+MingwModuleHandler::GenerateCompilerParametersFromVector ( const vector<CompilerFlag*>& compilerFlags, const CompilerType type ) const
{
string parameters;
for ( size_t i = 0; i < compilerFlags.size (); i++ )
{
CompilerFlag& compilerFlag = *compilerFlags[i];
- if ( parameters.length () > 0 )
- parameters += " ";
- parameters += compilerFlag.flag;
+ if ( compilerFlag.compiler == type )
+ parameters += " " + compilerFlag.flag;
}
return parameters;
}
MingwModuleHandler::GenerateMacro (
const char* assignmentOperation,
const string& macro,
- const IfableData& data )
+ const IfableData& data,
+ set<const Define *> *used_defs,
+ bool generatingCompilerMacro )
{
size_t i;
bool generateAssignment;
- generateAssignment = (use_pch && module.pch != NULL ) || data.includes.size () > 0 || data.defines.size () > 0 || data.compilerFlags.size () > 0;
+ if ( generatingCompilerMacro )
+ generateAssignment = (use_pch && module.pch != NULL ) || data.includes.size () > 0 || data.defines.size () > 0 || data.compilerFlags.size () > 0;
+ else
+ generateAssignment = (use_pch && module.pch != NULL ) || data.includes.size () > 0 || data.defines.size () > 0;
if ( generateAssignment )
{
fprintf ( fMakefile,
assignmentOperation );
}
- if ( use_pch && module.pch != NULL )
+ const FileLocation *pchFilename = GetPrecompiledHeaderFilename ();
+ if ( pchFilename )
{
fprintf ( fMakefile,
" -I%s",
- strDirectory ( GetPrecompiledHeaderFilename () ).c_str () );
+ backend->GetFullPath ( *pchFilename ).c_str () );
+ delete pchFilename;
}
- string compilerParameters = GenerateCompilerParametersFromVector ( data.compilerFlags );
- if ( compilerParameters.size () > 0 )
+ if ( generatingCompilerMacro )
{
- fprintf (
- fMakefile,
- " %s",
- compilerParameters.c_str () );
+ string compilerParameters = GenerateCompilerParametersFromVector ( data.compilerFlags, CompilerTypeDontCare );
+ if ( compilerParameters.size () > 0 )
+ {
+ fprintf (
+ fMakefile,
+ "%s",
+ compilerParameters.c_str () );
+ }
}
-
for ( i = 0; i < data.includes.size(); i++ )
{
const Include& include = *data.includes[i];
fprintf (
fMakefile,
" -I%s",
- strDirectory ( includeDirectory ).c_str() );
+ backend->GetFullPath ( *includeDirectory ).c_str() );
}
for ( i = 0; i < data.defines.size(); i++ )
{
- Define& d = *data.defines[i];
+ const Define& define = *data.defines[i];
+ if ( used_defs )
+ {
+ set<const Define *>::const_iterator last_define;
+ for (last_define = used_defs->begin ();
+ last_define != used_defs->end ();
+ last_define++)
+ {
+ if ( (*last_define)->name != define.name )
+ continue;
+ if ( !define.overridable )
+ {
+ throw InvalidOperationException ( (*last_define)->node->location.c_str (),
+ 0,
+ "Invalid override of define '%s', already defined at %s",
+ define.name.c_str (),
+ define.node->location.c_str () );
+ }
+ if ( backend->configuration.Verbose )
+ printf("%s: Overriding '%s' already defined at %s\n",
+ (*last_define)->node->location.c_str (), define.name.c_str (),
+ define.node->location.c_str () );
+ break;
+ }
+ if ( last_define != used_defs->end () )
+ continue;
+ }
fprintf (
fMakefile,
" -D%s",
- d.name.c_str() );
- if ( d.value.size() )
+ define.name.c_str() );
+ if (define.value.length () > 0)
fprintf (
fMakefile,
"=%s",
- d.value.c_str() );
+ define.value.c_str() );
+ if ( used_defs )
+ used_defs->insert( used_defs->begin (), &define );
}
if ( generateAssignment )
{
MingwModuleHandler::GenerateMacros (
const char* assignmentOperation,
const IfableData& data,
- const vector<LinkerFlag*>* linkerFlags )
+ const vector<LinkerFlag*>* linkerFlags,
+ set<const Define *>& used_defs )
{
size_t i;
GenerateMacro ( assignmentOperation,
cflagsMacro,
- data );
+ data,
+ &used_defs,
+ true );
GenerateMacro ( assignmentOperation,
windresflagsMacro,
- data );
+ data,
+ NULL,
+ false );
if ( linkerFlags != NULL )
{
GenerateMacros (
"+=",
rIf.data,
- NULL );
+ NULL,
+ used_defs );
fprintf (
fMakefile,
"endif\n\n" );
void
MingwModuleHandler::CleanupCompilationUnitVector ( vector<CompilationUnit*>& compilationUnits )
{
- for (size_t i = 0; i < compilationUnits.size (); i++)
+ for ( size_t i = 0; i < compilationUnits.size (); i++ )
delete compilationUnits[i];
}
{
}
+void
+MingwModuleHandler::GenerateSourceMacros (
+ const char* assignmentOperation,
+ const IfableData& data )
+{
+ size_t i;
+
+ const vector<CompilationUnit*>& compilationUnits = data.compilationUnits;
+ vector<const FileLocation *> headers;
+ if ( compilationUnits.size () > 0 )
+ {
+ fprintf (
+ fMakefile,
+ "%s %s",
+ sourcesMacro.c_str (),
+ assignmentOperation );
+ for ( i = 0; i < compilationUnits.size(); i++ )
+ {
+ CompilationUnit& compilationUnit = *compilationUnits[i];
+ const FileLocation& compilationName = compilationUnit.GetFilename ();
+ fprintf (
+ fMakefile,
+ "%s%s",
+ ( i%10 == 9 ? " \\\n\t" : " " ),
+ backend->GetFullName ( compilationName ).c_str () );
+ }
+ fprintf ( fMakefile, "\n" );
+ }
+
+ const vector<If*>& ifs = data.ifs;
+ for ( i = 0; i < ifs.size(); i++ )
+ {
+ If& rIf = *ifs[i];
+ if ( rIf.data.defines.size()
+ || rIf.data.includes.size()
+ || rIf.data.libraries.size()
+ || rIf.data.compilationUnits.size()
+ || rIf.data.compilerFlags.size()
+ || rIf.data.ifs.size() )
+ {
+ fprintf (
+ fMakefile,
+ "%s (\"$(%s)\",\"%s\")\n",
+ rIf.negated ? "ifneq" : "ifeq",
+ rIf.property.c_str(),
+ rIf.value.c_str() );
+ GenerateSourceMacros (
+ "+=",
+ rIf.data );
+ fprintf (
+ fMakefile,
+ "endif\n\n" );
+ }
+ }
+
+ vector<CompilationUnit*> sourceCompilationUnits;
+ GetModuleSpecificCompilationUnits ( sourceCompilationUnits );
+ for ( i = 0; i < sourceCompilationUnits.size (); i++ )
+ {
+ const FileLocation& compilationName = sourceCompilationUnits[i]->GetFilename ();
+ fprintf (
+ fMakefile,
+ "%s += %s\n",
+ sourcesMacro.c_str(),
+ backend->GetFullName ( compilationName ).c_str () );
+ }
+ CleanupCompilationUnitVector ( sourceCompilationUnits );
+}
+
void
MingwModuleHandler::GenerateObjectMacros (
const char* assignmentOperation,
- const IfableData& data,
- const vector<LinkerFlag*>* linkerFlags )
+ const IfableData& data )
{
size_t i;
const vector<CompilationUnit*>& compilationUnits = data.compilationUnits;
+ vector<const FileLocation *> headers;
+ vector<const FileLocation *> mcheaders;
+ vector<const FileLocation *> mcresources;
if ( compilationUnits.size () > 0 )
{
for ( i = 0; i < compilationUnits.size (); i++ )
CompilationUnit& compilationUnit = *compilationUnits[i];
if ( compilationUnit.IsFirstFile () )
{
+ const FileLocation& compilationName = compilationUnit.GetFilename ();
+ const FileLocation *object_file = GetObjectFilename ( &compilationName, module );
fprintf ( fMakefile,
"%s := %s $(%s)\n",
objectsMacro.c_str(),
- strFile ( GetObjectFilename ( compilationUnit.GetFilename (), NULL ) ).c_str (),
+ backend->GetFullName ( *object_file ).c_str (),
objectsMacro.c_str() );
+ delete object_file;
}
}
fprintf (
CompilationUnit& compilationUnit = *compilationUnits[i];
if ( !compilationUnit.IsFirstFile () )
{
- fprintf (
- fMakefile,
- "%s%s",
- ( i%10 == 9 ? " \\\n\t" : " " ),
- strFile ( GetObjectFilename ( compilationUnit.GetFilename (), NULL ) ).c_str () );
+ const FileLocation& compilationName = compilationUnit.GetFilename ();
+ const FileLocation *objectFilename = GetObjectFilename ( &compilationName, module );
+ if ( GetExtension ( *objectFilename ) == ".h" )
+ headers.push_back ( objectFilename );
+ else if ( GetExtension ( *objectFilename ) == ".rc" )
+ {
+ const FileLocation *headerFilename = GetMcHeaderFilename ( &compilationUnit.GetFilename () );
+ mcheaders.push_back ( headerFilename );
+ mcresources.push_back ( objectFilename );
+ }
+ else
+ {
+ fprintf (
+ fMakefile,
+ "%s%s",
+ ( i%10 == 9 ? " \\\n\t" : " " ),
+ backend->GetFullName ( *objectFilename ).c_str () );
+ delete objectFilename;
+ }
}
}
fprintf ( fMakefile, "\n" );
}
+ if ( headers.size () > 0 )
+ {
+ fprintf (
+ fMakefile,
+ "%s_HEADERS %s",
+ module.name.c_str (),
+ assignmentOperation );
+ for ( i = 0; i < headers.size (); i++ )
+ {
+ fprintf (
+ fMakefile,
+ "%s%s",
+ ( i%10 == 9 ? " \\\n\t" : " " ),
+ backend->GetFullName ( *headers[i] ).c_str () );
+ delete headers[i];
+ }
+ fprintf ( fMakefile, "\n" );
+ }
+
+ if ( mcheaders.size () > 0 )
+ {
+ fprintf (
+ fMakefile,
+ "%s_MCHEADERS %s",
+ module.name.c_str (),
+ assignmentOperation );
+ for ( i = 0; i < mcheaders.size (); i++ )
+ {
+ fprintf (
+ fMakefile,
+ "%s%s",
+ ( i%10 == 9 ? " \\\n\t" : " " ),
+ backend->GetFullName ( *mcheaders[i] ).c_str () );
+ delete mcheaders[i];
+ }
+ fprintf ( fMakefile, "\n" );
+ }
+
+ if ( mcresources.size () > 0 )
+ {
+ fprintf (
+ fMakefile,
+ "%s_RESOURCES %s",
+ module.name.c_str (),
+ assignmentOperation );
+ for ( i = 0; i < mcresources.size (); i++ )
+ {
+ fprintf (
+ fMakefile,
+ "%s%s",
+ ( i%10 == 9 ? " \\\n\t" : " " ),
+ backend->GetFullName ( *mcresources[i] ).c_str () );
+ delete mcresources[i];
+ }
+ fprintf ( fMakefile, "\n" );
+ }
const vector<If*>& ifs = data.ifs;
for ( i = 0; i < ifs.size(); i++ )
rIf.value.c_str() );
GenerateObjectMacros (
"+=",
- rIf.data,
- NULL );
+ rIf.data );
fprintf (
fMakefile,
"endif\n\n" );
GetModuleSpecificCompilationUnits ( sourceCompilationUnits );
for ( i = 0; i < sourceCompilationUnits.size (); i++ )
{
+ const FileLocation& compilationName = sourceCompilationUnits[i]->GetFilename ();
+ const FileLocation *object_file = GetObjectFilename ( &compilationName, module );
fprintf (
fMakefile,
"%s += %s\n",
objectsMacro.c_str(),
- strFile ( GetObjectFilename ( sourceCompilationUnits[i]->GetFilename (), NULL ) ).c_str () );
+ backend->GetFullName ( *object_file ).c_str () );
+ delete object_file;
}
CleanupCompilationUnitVector ( sourceCompilationUnits );
}
+/* caller needs to delete the returned object */
const FileLocation*
MingwModuleHandler::GetPrecompiledHeaderFilename () const
{
- const string& basePchFilename = module.pch->file.name + ".gch";
+ if ( !module.pch || !use_pch )
+ return NULL;
return new FileLocation ( IntermediateDirectory,
- module.pch->file.relative_path,
- basePchFilename );
-}
+ module.pch->file->relative_path,
+ ReplaceExtension ( module.pch->file->name, "_" + module.name + ".gch" ) );
+}
+
+Rule arRule1 ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).a: $($(module_name)_OBJS) | $(INTERMEDIATE)$(SEP)$(source_dir)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).a",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule arRule2 ( "\t$(ECHO_AR)\n"
+ "\t${ar} -rc $@ $($(module_name)_OBJS)\n",
+ NULL );
+Rule arHostRule2 ( "\t$(ECHO_AR)\n"
+ "\t${host_ar} -rc $@ $($(module_name)_OBJS)\n",
+ NULL );
+Rule gasRule ( "$(source): ${$(module_name)_precondition}\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source)$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_GAS)\n"
+ "\t${gcc} -x assembler-with-cpp -c $< -o $@ -D__ASM__ $($(module_name)_CFLAGS)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule bootRule ( "$(source): ${$(module_name)_precondition}\n"
+ "$(module_output): $(source)$(dependencies) | $(OUTPUT)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_NASM)\n"
+ "\t$(Q)${nasm} -f win32 $< -o $@ $($(module_name)_NASMFLAGS)\n",
+ "$(OUTPUT)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule nasmRule ( "$(source): ${$(module_name)_precondition}\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source)$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_NASM)\n"
+ "\t$(Q)${nasm} -f win32 $< -o $@ $($(module_name)_NASMFLAGS)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule windresRule ( "$(source): ${$(module_name)_precondition}\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).coff: $(source)$(dependencies) $(WRC_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir) $(TEMPORARY)\n"
+ "\t$(ECHO_WRC)\n"
+ "\t${gcc} -xc -E -DRC_INVOKED ${$(module_name)_RCFLAGS} $(source) > $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).rci.tmp\n"
+ "\t$(Q)$(WRC_TARGET) ${$(module_name)_RCFLAGS} $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).rci.tmp $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).res.tmp\n"
+ "\t-@${rm} $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).rci.tmp 2>$(NUL)\n"
+ "\t${windres} $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).res.tmp -o $@\n"
+ "\t-@${rm} $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).res.tmp 2>$(NUL)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).coff",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule wmcRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc $(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h: $(WMC_TARGET) $(source)\n"
+ "\t$(ECHO_WMC)\n"
+ "\t$(Q)$(WMC_TARGET) -i -H $(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h -o $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc $(source)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc", "$(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h", NULL );
+Rule winebuildRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec.def: $(source)$(dependencies) $(WINEBUILD_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_WINEBLD)\n"
+ "\t$(Q)$(WINEBUILD_TARGET) $(WINEBUILD_FLAGS) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext).spec.def --def -E $(source)\n"
+ "$(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext).stubs.c: $(source_path)$(SEP)$(source_name_noext).spec $(WINEBUILD_TARGET)\n"
+ "\t$(ECHO_WINEBLD)\n"
+ "\t$(Q)$(WINEBUILD_TARGET) $(WINEBUILD_FLAGS) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext).stubs.c --pedll $(source_path)$(SEP)$(source_name_noext).spec\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).stubs.o: $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).stubs.c$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_CC)\n"
+ "\t${gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec.def",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).stubs.c",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).stubs.o",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule widlHeaderRule ( "$(source): ${$(module_name)_precondition}\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).h: $(source)$(dependencies) $(WIDL_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_WIDL)\n"
+ "\t$(Q)$(WIDL_TARGET) $($(module_name)_WIDLFLAGS) -h -H $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).h $(source)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).h",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule widlServerRule ( "$(source): ${$(module_name)_precondition}\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.c $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.h: $(source)$(dependencies) $(WIDL_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_WIDL)\n"
+ "\t$(Q)$(WIDL_TARGET) $($(module_name)_WIDLFLAGS) -h -H $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.h -s -S $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.c $(source)\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.o: $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.c $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.h$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_CC)\n"
+ "\t${gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.h",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.c",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.o",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule widlClientRule ( "$(source): ${$(module_name)_precondition}\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.c $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.h: $(source)$(dependencies) $(WIDL_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_WIDL)\n"
+ "\t$(Q)$(WIDL_TARGET) $($(module_name)_WIDLFLAGS) -h -H $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.h -c -C $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.c $(source)\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.o: $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.c $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.h$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_CC)\n"
+ "\t${gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.h",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.c",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.o",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule widlProxyRule ( "$(source): ${$(module_name)_precondition}\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.c $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.h: $(source)$(dependencies) $(WIDL_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_WIDL)\n"
+ "\t$(Q)$(WIDL_TARGET) $($(module_name)_WIDLFLAGS) -h -H $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.h -p -P $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.c $(source)\n"
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.o: $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.c $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.h$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_CC)\n"
+ "\t${gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.h",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.c",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.o",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule widlTlbRule ( "$(source): ${$(module_name)_precondition}\n"
+ "$(OUTPUT)$(SEP)$(source_dir)$(SEP)$(module_name).tlb: $(source)$(dependencies) $(WIDL_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_WIDL)\n"
+ "\t$(Q)$(WIDL_TARGET) $($(module_name)_WIDLFLAGS) -t -T $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).tlb $(source)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
+Rule gccRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source) ${$(module_name)_precondition}$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_CC)\n"
+ "\t${gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o", NULL );
+Rule gccHostRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source) ${$(module_name)_precondition}$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_CC)\n"
+ "\t${host_gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o", NULL );
+Rule gppRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source) ${$(module_name)_precondition}$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_CC)\n"
+ "\t${gpp} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o", NULL );
+Rule gppHostRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source) ${$(module_name)_precondition}$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+ "\t$(ECHO_CC)\n"
+ "\t${host_gpp} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+ "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o", NULL );
+Rule emptyRule ( "", NULL );
void
MingwModuleHandler::GenerateGccCommand (
const FileLocation* sourceFile,
- const string& extraDependencies,
- const string& cc,
- const string& cflagsMacro )
-{
- string dependencies = strFile ( sourceFile );
- if ( extraDependencies != "" )
- dependencies += " " + extraDependencies;
- if ( module.pch && use_pch )
- dependencies += " " + strFile ( GetPrecompiledHeaderFilename () );
-
- /* WIDL generated headers may be used */
- vector<FileLocation> rpcDependencies;
- GetRpcHeaderDependencies ( rpcDependencies );
- dependencies += " " + v2s ( rpcDependencies, 5 );
- dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
-
- const FileLocation *objectFilename = GetObjectFilename (
- sourceFile, &clean_files );
- fprintf ( fMakefile,
- "%s: %s | %s\n",
- strFile ( objectFilename ).c_str (),
- dependencies.c_str (),
- strDirectory ( objectFilename ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_CC)\n" );
- fprintf ( fMakefile,
- "\t%s -c $< -o $@ %s\n",
- cc.c_str (),
- cflagsMacro.c_str () );
-}
-
-void
-MingwModuleHandler::GenerateGccAssemblerCommand (
- const FileLocation* sourceFile,
- const string& cc,
- const string& cflagsMacro )
+ const Rule *rule,
+ const string& extraDependencies )
{
- string dependencies = strFile ( sourceFile );
- dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
+ const FileLocation *generatedSourceFileName = GetActualSourceFilename ( sourceFile );
+ const FileLocation *pchFilename = GetPrecompiledHeaderFilename ();
+ string dependencies = extraDependencies;
- const FileLocation *objectFilename = GetObjectFilename (
- sourceFile, &clean_files );
- fprintf ( fMakefile,
- "%s: %s | %s\n",
- strFile ( objectFilename ).c_str (),
- dependencies.c_str (),
- strDirectory ( objectFilename ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_GAS)\n" );
- fprintf ( fMakefile,
- "\t%s -x assembler-with-cpp -c $< -o $@ -D__ASM__ %s\n",
- cc.c_str (),
- cflagsMacro.c_str () );
-}
-
-void
-MingwModuleHandler::GenerateNasmCommand (
- const FileLocation* sourceFile,
- const string& nasmflagsMacro )
-{
- string dependencies = strFile ( sourceFile );
- dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
-
- const FileLocation *objectFilename = GetObjectFilename (
- sourceFile, &clean_files );
- fprintf ( fMakefile,
- "%s: %s | %s\n",
- strFile ( objectFilename ).c_str (),
- dependencies.c_str (),
- strDirectory ( objectFilename ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_NASM)\n" );
- fprintf ( fMakefile,
- "\t%s -f win32 $< -o $@ %s\n",
- "$(Q)${nasm}",
- nasmflagsMacro.c_str () );
-}
-
-void
-MingwModuleHandler::GenerateWindresCommand (
- const FileLocation* sourceFile,
- const string& windresflagsMacro )
-{
- string dependencies = strFile ( sourceFile );
- dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
-
- const FileLocation *objectFilename = GetObjectFilename ( sourceFile, &clean_files );
-
- if ( module.useWRC )
- {
- string sourceFilenamePart = module.name + "." + ReplaceExtension ( sourceFile->name, "" );
- FileLocation rciFilename ( TemporaryDirectory,
- "",
- sourceFilenamePart + ".rci.tmp" );
- FileLocation resFilename ( TemporaryDirectory,
- "",
- sourceFilenamePart + ".res.tmp" );
-
- fprintf ( fMakefile,
- "%s: %s $(WRC_TARGET) | %s\n",
- strFile ( objectFilename ).c_str (),
- dependencies.c_str (),
- strDirectory ( objectFilename ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_WRC)\n" );
- fprintf ( fMakefile,
- "\t${gcc} -xc -E -DRC_INVOKED ${%s} %s > %s\n",
- windresflagsMacro.c_str (),
- strFile ( sourceFile ).c_str (),
- strFile ( &rciFilename ).c_str () );
- fprintf ( fMakefile,
- "\t$(Q)$(WRC_TARGET) ${%s} %s %s\n",
- windresflagsMacro.c_str (),
- strFile ( &rciFilename ).c_str (),
- strFile ( &resFilename ).c_str () );
- fprintf ( fMakefile,
- "\t-@${rm} %s 2>$(NUL)\n",
- strFile ( &rciFilename ).c_str () );
- fprintf ( fMakefile,
- "\t${windres} %s -o $@\n",
- strFile ( &resFilename ).c_str () );
- fprintf ( fMakefile,
- "\t-@${rm} %s 2>$(NUL)\n",
- strFile ( &resFilename ).c_str () );
- }
+ string flags;
+ string extension = GetExtension ( *sourceFile );
+ if ( extension == ".cc" || extension == ".cpp" || extension == ".cxx" )
+ flags = GenerateCompilerParametersFromVector ( module.non_if_data.compilerFlags, CompilerTypeCPP );
else
+ flags = GenerateCompilerParametersFromVector ( module.non_if_data.compilerFlags, CompilerTypeCC );
+
+ if ( pchFilename )
{
- fprintf ( fMakefile,
- "%s: %s $(WRC_TARGET) | %s\n",
- strFile ( objectFilename ).c_str (),
- dependencies.c_str (),
- strDirectory ( objectFilename ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_WRC)\n" );
- fprintf ( fMakefile,
- "\t${windres} $(%s) %s -o $@\n",
- windresflagsMacro.c_str (),
- strFile ( sourceFile ).c_str () );
+ dependencies += " " + backend->GetFullName ( *pchFilename );
+ delete pchFilename;
}
-}
-void
-MingwModuleHandler::GenerateWinebuildCommands (
- const FileLocation* sourceFile )
-{
- string dependencies = strFile ( sourceFile );
- dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
-
- string basename = GetBasename ( sourceFile->name );
- FileLocation def_file ( IntermediateDirectory,
- sourceFile->relative_path,
- basename + ".spec.def" );
- CLEAN_FILE ( &def_file );
+ /* WIDL generated headers may be used */
+ vector<FileLocation> rpcDependencies;
+ GetRpcHeaderDependencies ( rpcDependencies );
+ if ( rpcDependencies.size () > 0 )
+ dependencies += " " + v2s ( backend, rpcDependencies, 5 );
- FileLocation stub_file ( IntermediateDirectory,
- sourceFile->relative_path,
- basename + ".stubs.c" );
- CLEAN_FILE ( &stub_file );
+ rule->Execute ( fMakefile, backend, module, generatedSourceFileName, clean_files, dependencies, flags );
- fprintf ( fMakefile,
- "%s: %s $(WINEBUILD_TARGET) | %s\n",
- strFile ( &def_file ).c_str (),
- dependencies.c_str (),
- strDirectory ( &def_file ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_WINEBLD)\n" );
- fprintf ( fMakefile,
- "\t%s -o %s --def -E %s\n",
- "$(Q)$(WINEBUILD_TARGET)",
- strFile ( &def_file ).c_str (),
- strFile ( sourceFile ).c_str () );
- fprintf ( fMakefile,
- "%s: %s $(WINEBUILD_TARGET)\n",
- strFile ( &stub_file ).c_str (),
- strFile ( sourceFile ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_WINEBLD)\n" );
- fprintf ( fMakefile,
- "\t%s -o %s --pedll %s\n",
- "$(Q)$(WINEBUILD_TARGET)",
- strFile ( &stub_file ).c_str (),
- strFile ( sourceFile ).c_str () );
-}
-
-string
-MingwModuleHandler::GetWidlFlags ( const CompilationUnit& compilationUnit )
-{
- return compilationUnit.GetSwitches ();
+ delete generatedSourceFileName;
}
string
return string ( "" );
}
+/* caller needs to delete the returned object */
const FileLocation*
MingwModuleHandler::GetRpcServerHeaderFilename ( const FileLocation *base ) const
{
return new FileLocation ( IntermediateDirectory, base->relative_path, newname );
}
-void
-MingwModuleHandler::GenerateWidlCommandsServer (
- const CompilationUnit& compilationUnit,
- const string& widlflagsMacro )
-{
- const FileLocation* sourceFile = compilationUnit.GetFilename ();
- string dependencies = strFile ( sourceFile );
- dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
-
- string basename = GetBasename ( sourceFile->name );
-
- const FileLocation *generatedHeaderFilename = GetRpcServerHeaderFilename ( sourceFile );
- CLEAN_FILE(generatedHeaderFilename);
-
- FileLocation generatedServerFilename ( IntermediateDirectory,
- sourceFile->relative_path,
- basename + "_s.c" );
- CLEAN_FILE(&generatedServerFilename);
-
- fprintf ( fMakefile,
- "%s %s: %s $(WIDL_TARGET) | %s\n",
- strFile ( &generatedServerFilename ).c_str (),
- strFile ( generatedHeaderFilename ).c_str (),
- dependencies.c_str (),
- strDirectory ( &generatedServerFilename ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_WIDL)\n" );
- fprintf ( fMakefile,
- "\t%s %s %s -h -H %s -s -S %s %s\n",
- "$(Q)$(WIDL_TARGET)",
- GetWidlFlags ( compilationUnit ).c_str (),
- widlflagsMacro.c_str (),
- strFile ( generatedHeaderFilename ).c_str (),
- strFile ( &generatedServerFilename ).c_str (),
- strFile ( sourceFile ).c_str () );
-}
-
+/* caller needs to delete the returned object */
const FileLocation*
MingwModuleHandler::GetRpcClientHeaderFilename ( const FileLocation *base ) const
{
return new FileLocation ( IntermediateDirectory, base->relative_path, newname );
}
+/* caller needs to delete the returned object */
const FileLocation*
-MingwModuleHandler::GetIdlHeaderFilename ( const FileLocation *base ) const
+MingwModuleHandler::GetRpcProxyHeaderFilename ( const FileLocation *base ) const
{
- string newname = GetBasename ( base->name ) + ".h";
+ string newname = GetBasename ( base->name ) + "_p.h";
return new FileLocation ( IntermediateDirectory, base->relative_path, newname );
}
-void
-MingwModuleHandler::GenerateWidlCommandsEmbeddedTypeLib (
- const CompilationUnit& compilationUnit,
- const string& widlflagsMacro )
-{
- const FileLocation* sourceFile = compilationUnit.GetFilename ();
- string dependencies = strFile ( sourceFile );
- dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
-
- string basename = GetBasename ( sourceFile->name );
-
- FileLocation EmbeddedTypeLibFilename ( IntermediateDirectory,
- sourceFile->relative_path,
- basename + ".tlb" );
-
- fprintf ( fMakefile,
- "%s: %s $(WIDL_TARGET) | %s\n",
- GetTargetMacro ( module ).c_str (),
- dependencies.c_str (),
- strDirectory ( &EmbeddedTypeLibFilename ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_WIDL)\n" );
- fprintf ( fMakefile,
- "\t%s %s %s -t -T %s %s\n",
- "$(Q)$(WIDL_TARGET)",
- GetWidlFlags ( compilationUnit ).c_str (),
- widlflagsMacro.c_str (),
- strFile ( &EmbeddedTypeLibFilename ).c_str(),
- strFile ( sourceFile ).c_str () );
-}
-
-void
-MingwModuleHandler::GenerateWidlCommandsClient (
- const CompilationUnit& compilationUnit,
- const string& widlflagsMacro )
-{
- const FileLocation* sourceFile = compilationUnit.GetFilename ();
- string dependencies = strFile ( sourceFile );
- dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
-
- string basename = GetBasename ( sourceFile->name );
-
- const FileLocation *generatedHeaderFilename = GetRpcClientHeaderFilename ( sourceFile );
- CLEAN_FILE(generatedHeaderFilename);
-
- FileLocation generatedClientFilename ( IntermediateDirectory,
- sourceFile->relative_path,
- basename + "_c.c" );
- CLEAN_FILE(&generatedClientFilename);
-
- fprintf ( fMakefile,
- "%s %s: %s $(WIDL_TARGET) | %s\n",
- strFile ( &generatedClientFilename ).c_str (),
- strFile ( generatedHeaderFilename ).c_str (),
- dependencies.c_str (),
- strDirectory ( &generatedClientFilename ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_WIDL)\n" );
- fprintf ( fMakefile,
- "\t%s %s %s -h -H %s -c -C %s %s\n",
- "$(Q)$(WIDL_TARGET)",
- GetWidlFlags ( compilationUnit ).c_str (),
- widlflagsMacro.c_str (),
- strFile ( generatedHeaderFilename ).c_str (),
- strFile ( &generatedClientFilename ).c_str (),
- strFile ( sourceFile ).c_str () );
-}
-
-void
-MingwModuleHandler::GenerateWidlCommandsIdlHeader (
- const CompilationUnit& compilationUnit,
- const string& widlflagsMacro )
+/* caller needs to delete the returned object */
+const FileLocation*
+MingwModuleHandler::GetIdlHeaderFilename ( const FileLocation *base ) const
{
- const FileLocation* sourceFile = compilationUnit.GetFilename ();
- string dependencies = strFile ( sourceFile );
- dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
-
- string basename = GetBasename ( sourceFile->name );
-
- const FileLocation *generatedHeader = GetIdlHeaderFilename ( sourceFile );
- CLEAN_FILE(generatedHeader);
-
- fprintf ( fMakefile,
- "%s: %s $(WIDL_TARGET) | %s\n",
- strFile( generatedHeader ).c_str (),
- dependencies.c_str (),
- strDirectory ( generatedHeader ).c_str () );
- fprintf ( fMakefile, "\t$(ECHO_WIDL)\n" );
- fprintf ( fMakefile,
- "\t%s %s %s -h -H %s %s\n",
- "$(Q)$(WIDL_TARGET)",
- GetWidlFlags ( compilationUnit ).c_str (),
- widlflagsMacro.c_str (),
- strFile( generatedHeader ).c_str (),
- strFile ( sourceFile ).c_str () );
+ string newname = GetBasename ( base->name ) + ".h";
+ return new FileLocation ( IntermediateDirectory, base->relative_path, newname );
}
-void
-MingwModuleHandler::GenerateWidlCommands (
- const CompilationUnit& compilationUnit,
- const string& widlflagsMacro )
+/* caller needs to delete the returned object */
+const FileLocation*
+MingwModuleHandler::GetMcHeaderFilename ( const FileLocation *base ) const
{
- if ( module.type == RpcServer )
- GenerateWidlCommandsServer ( compilationUnit,
- widlflagsMacro );
- else if ( module.type == RpcClient )
- GenerateWidlCommandsClient ( compilationUnit,
- widlflagsMacro );
- else if ( module.type == EmbeddedTypeLib )
- GenerateWidlCommandsEmbeddedTypeLib ( compilationUnit,
- widlflagsMacro );
- else // applies also for other module.types which include idl files
- GenerateWidlCommandsIdlHeader ( compilationUnit,
- widlflagsMacro );
-}
-
-void
-MingwModuleHandler::GenerateCommands (
- const CompilationUnit& compilationUnit,
- const string& cc,
- const string& cppc,
- const string& cflagsMacro,
- const string& nasmflagsMacro,
- const string& windresflagsMacro,
- const string& widlflagsMacro )
-{
- const FileLocation* sourceFile = compilationUnit.GetFilename ();
- string filename = strFile ( sourceFile );
- string extension = GetExtension ( filename );
- if ( extension == ".c" || extension == ".C" )
- {
- GenerateGccCommand ( sourceFile,
- GetCompilationUnitDependencies ( compilationUnit ),
- cc,
- cflagsMacro );
- return;
- }
- else if ( extension == ".cc" || extension == ".CC" ||
- extension == ".cpp" || extension == ".CPP" ||
- extension == ".cxx" || extension == ".CXX" )
- {
- GenerateGccCommand ( sourceFile,
- GetCompilationUnitDependencies ( compilationUnit ),
- cppc,
- cflagsMacro );
- return;
- }
- else if ( extension == ".s" || extension == ".S" )
- {
- GenerateGccAssemblerCommand ( sourceFile,
- cc,
- cflagsMacro );
- return;
- }
- else if ( extension == ".asm" || extension == ".ASM" )
- {
- GenerateNasmCommand ( sourceFile,
- nasmflagsMacro );
- return;
- }
- else if ( extension == ".rc" || extension == ".RC" )
+ string newname = GetBasename ( base->name ) + ".h";
+ return new FileLocation ( IntermediateDirectory, "include/reactos" , newname );
+}
+
+void
+MingwModuleHandler::GenerateCommands (
+ const CompilationUnit& compilationUnit,
+ const string& extraDependencies )
+{
+ const FileLocation& sourceFile = compilationUnit.GetFilename ();
+ string extension = GetExtension ( sourceFile );
+ std::transform ( extension.begin (), extension.end (), extension.begin (), tolower );
+
+ struct
+ {
+ HostType host;
+ ModuleType type;
+ string extension;
+ Rule* rule;
+ } rules[] = {
+ { HostDontCare, TypeDontCare, ".s", &gasRule },
+ { HostDontCare, BootSector, ".asm", &bootRule },
+ { HostDontCare, TypeDontCare, ".asm", &nasmRule },
+ { HostDontCare, TypeDontCare, ".rc", &windresRule },
+ { HostDontCare, TypeDontCare, ".mc", &wmcRule },
+ { HostDontCare, TypeDontCare, ".spec", &winebuildRule },
+ { HostDontCare, RpcServer, ".idl", &widlServerRule },
+ { HostDontCare, RpcClient, ".idl", &widlClientRule },
+ { HostDontCare, RpcProxy, ".idl", &widlProxyRule },
+ { HostDontCare, EmbeddedTypeLib, ".idl", &widlTlbRule },
+ { HostDontCare, TypeDontCare, ".idl", &widlHeaderRule },
+ { HostTrue, TypeDontCare, ".c", &gccHostRule },
+ { HostTrue, TypeDontCare, ".cc", &gppHostRule },
+ { HostTrue, TypeDontCare, ".cpp", &gppHostRule },
+ { HostTrue, TypeDontCare, ".cxx", &gppHostRule },
+ { HostFalse, TypeDontCare, ".c", &gccRule },
+ { HostFalse, TypeDontCare, ".cc", &gppRule },
+ { HostFalse, TypeDontCare, ".cpp", &gppRule },
+ { HostFalse, TypeDontCare, ".cxx", &gppRule },
+ { HostFalse, Cabinet, ".*", &emptyRule }
+ };
+ size_t i;
+ Rule *customRule = NULL;
+
+ for ( i = 0; i < sizeof ( rules ) / sizeof ( rules[0] ); i++ )
{
- GenerateWindresCommand ( sourceFile,
- windresflagsMacro );
- return;
+ if ( rules[i].host != HostDontCare && rules[i].host != module.host )
+ continue;
+ if ( rules[i].type != TypeDontCare && rules[i].type != module.type )
+ continue;
+ if ( rules[i].extension != extension && rules[i].extension != ".*")
+ continue;
+ customRule = rules[i].rule;
+ break;
}
- else if ( extension == ".spec" || extension == ".SPEC" )
+
+ if ( extension == ".c" || extension == ".cc" || extension == ".cpp" || extension == ".cxx" )
{
- GenerateWinebuildCommands ( sourceFile );
- GenerateGccCommand ( GetActualSourceFilename ( sourceFile ),
- "",
- cc,
- cflagsMacro );
- return;
+ GenerateGccCommand ( &sourceFile,
+ customRule,
+ GetCompilationUnitDependencies ( compilationUnit ) + GetExtraDependencies ( &sourceFile ) + extraDependencies );
}
- else if ( extension == ".idl" || extension == ".IDL" )
+ else if ( customRule )
+ customRule->Execute ( fMakefile, backend, module, &sourceFile, clean_files );
+ else
{
- GenerateWidlCommands ( compilationUnit,
- widlflagsMacro );
- if ( (module.type == RpcServer) || (module.type == RpcClient) )
- {
- GenerateGccCommand ( GetActualSourceFilename ( sourceFile ),
- GetExtraDependencies ( sourceFile ),
- cc,
- cflagsMacro );
- }
- return;
+ throw InvalidOperationException ( __FILE__,
+ __LINE__,
+ "Unsupported filename extension '%s' in file '%s'",
+ extension.c_str (),
+ backend->GetFullName ( sourceFile ).c_str () );
}
-
- throw InvalidOperationException ( __FILE__,
- __LINE__,
- "Unsupported filename extension '%s' in file '%s'",
- extension.c_str (),
- filename.c_str () );
}
void
FileLocation mapFilename ( OutputDirectory,
module.output->relative_path,
GetBasename ( module.output->name ) + ".map" );
- CLEAN_FILE ( &mapFilename );
+ CLEAN_FILE ( mapFilename );
fprintf ( fMakefile,
"\t$(ECHO_OBJDUMP)\n" );
fprintf ( fMakefile,
"\t$(Q)${objdump} -d -S %s > %s\n",
- mapTarget ? strFile ( mapTarget ).c_str () : "$@",
- strFile ( &mapFilename ).c_str () );
+ mapTarget ? backend->GetFullName ( *mapTarget ).c_str () : "$@",
+ backend->GetFullName ( mapFilename ).c_str () );
fprintf ( fMakefile,
"else\n" );
"\t$(ECHO_NM)\n" );
fprintf ( fMakefile,
"\t$(Q)${nm} --numeric-sort %s > %s\n",
- mapTarget ? strFile ( mapTarget ).c_str () : "$@",
- strFile ( &mapFilename ).c_str () );
+ mapTarget ? backend->GetFullName ( *mapTarget ).c_str () : "$@",
+ backend->GetFullName ( mapFilename ).c_str () );
fprintf ( fMakefile,
"endif\n" );
fprintf ( fMakefile,
"ifeq ($(ROS_BUILDNOSTRIP),yes)\n" );
- string filename = module.output->name;
FileLocation nostripFilename ( OutputDirectory,
module.output->relative_path,
- GetBasename ( filename ) + ".nostrip" + GetExtension ( filename ) );
- CLEAN_FILE ( &nostripFilename );
+ GetBasename ( module.output->name ) + ".nostrip" + GetExtension ( *module.output ) );
+ CLEAN_FILE ( nostripFilename );
OutputCopyCommand ( *module.output, nostripFilename );
}
void
-MergeStringVector ( const vector<FileLocation>& input,
+MergeStringVector ( const Backend* backend,
+ const vector<FileLocation>& input,
vector<string>& output )
{
int wrap_at = 25;
}
else if ( s.size () > 0)
s += " ";
- s += strFile ( &input[i] );
+ s += backend->GetFullName ( input[i] );
}
if ( s.length () > 0 )
output.push_back ( s );
for ( size_t i = 0; i < data.compilationUnits.size (); i++ )
{
CompilationUnit& compilationUnit = *data.compilationUnits[i];
- objectFiles.push_back ( *GetObjectFilename ( compilationUnit.GetFilename (), NULL ) );
+ const FileLocation& compilationName = compilationUnit.GetFilename ();
+ const FileLocation *object_file = GetObjectFilename ( &compilationName, module );
+ objectFiles.push_back ( *object_file );
+ delete object_file;
}
}
GetObjectsVector ( module.non_if_data,
objectFiles );
vector<string> lines;
- MergeStringVector ( objectFiles,
+ MergeStringVector ( backend,
+ objectFiles,
lines );
for ( size_t i = 0; i < lines.size (); i++ )
{
void
MingwModuleHandler::GenerateLinkerCommand (
const string& dependencies,
- const string& linker,
const string& linkerParameters,
- const string& objectsMacro,
- const string& libsMacro,
const string& pefixupParameters )
{
- string target ( GetTargetMacro ( module ) );
- string target_folder ( strDirectory ( GetTargetFilename ( module, NULL ) ) );
+ const FileLocation *target_file = GetTargetFilename ( module, NULL );
const FileLocation *definitionFilename = GetDefinitionFilename ();
+ string linker = module.cplusplus ? "${gpp}" : "${gcc}";
+ string objectsMacro = GetObjectsMacro ( module );
+ string libsMacro = GetLibsMacro ();
+
+ string target_macro ( GetTargetMacro ( module ) );
+ string target_folder ( backend->GetFullPath ( *target_file ) );
string linkerScriptArgument;
if ( module.linkerScript != NULL )
- linkerScriptArgument = ssprintf ( "-Wl,-T,%s", module.linkerScript->directory.c_str () );
+ linkerScriptArgument = ssprintf ( " -Wl,-T,%s", backend->GetFullName ( *module.linkerScript->file ).c_str () );
else
linkerScriptArgument = "";
fprintf ( fMakefile,
"%s: %s %s $(RSYM_TARGET) $(PEFIXUP_TARGET) | %s\n",
- target.c_str (),
- strFile ( definitionFilename ).c_str (),
+ target_macro.c_str (),
+ definitionFilename ? backend->GetFullName ( *definitionFilename ).c_str () : "",
dependencies.c_str (),
target_folder.c_str () );
fprintf ( fMakefile, "\t$(ECHO_LD)\n" );
if ( !module.IsDLL () )
{
fprintf ( fMakefile,
- "\t%s %s %s -o %s %s %s %s\n",
+ "\t%s %s%s -o %s %s %s %s\n",
linker.c_str (),
linkerParameters.c_str (),
linkerScriptArgument.c_str (),
- target.c_str (),
+ target_macro.c_str (),
objectsMacro.c_str (),
libsMacro.c_str (),
GetLinkerMacro ().c_str () );
FileLocation temp_exp ( TemporaryDirectory,
"",
module.name + ".temp.exp" );
- CLEAN_FILE ( &temp_exp );
+ CLEAN_FILE ( temp_exp );
fprintf ( fMakefile,
- "\t${dlltool} --dllname %s --def %s --output-exp %s %s %s\n",
+ "\t${dlltool} --dllname %s --def %s --output-exp %s%s%s\n",
targetName.c_str (),
- strFile ( definitionFilename ).c_str (),
- strFile ( &temp_exp ).c_str (),
- module.mangledSymbols ? "" : "--kill-at",
- module.underscoreSymbols ? "--add-underscore" : "" );
+ definitionFilename ? backend->GetFullName ( *definitionFilename ).c_str () : "",
+ backend->GetFullName ( temp_exp ).c_str (),
+ module.mangledSymbols ? "" : " --kill-at",
+ module.underscoreSymbols ? " --add-underscore" : "" );
fprintf ( fMakefile,
- "\t%s %s %s %s -o %s %s %s %s\n",
+ "\t%s %s%s %s -o %s %s %s %s\n",
linker.c_str (),
linkerParameters.c_str (),
linkerScriptArgument.c_str (),
- strFile ( &temp_exp ).c_str (),
- target.c_str (),
+ backend->GetFullName ( temp_exp ).c_str (),
+ target_macro.c_str (),
objectsMacro.c_str (),
libsMacro.c_str (),
GetLinkerMacro ().c_str () );
fprintf ( fMakefile,
- "\t$(Q)$(PEFIXUP_TARGET) %s -exports %s\n",
- target.c_str (),
+ "\t$(Q)$(PEFIXUP_TARGET) %s -exports%s\n",
+ target_macro.c_str (),
pefixupParameters.c_str() );
fprintf ( fMakefile,
"\t-@${rm} %s 2>$(NUL)\n",
- strFile ( &temp_exp ).c_str () );
+ backend->GetFullName ( temp_exp ).c_str () );
}
else
{
//printf ( "%s will have all its functions exported\n",
// module.target->name.c_str () );
fprintf ( fMakefile,
- "\t%s %s %s -o %s %s %s %s\n",
+ "\t%s %s%s -o %s %s %s %s\n",
linker.c_str (),
linkerParameters.c_str (),
linkerScriptArgument.c_str (),
- target.c_str (),
+ target_macro.c_str (),
objectsMacro.c_str (),
libsMacro.c_str (),
GetLinkerMacro ().c_str () );
GenerateRunRsymCode ();
GenerateRunStripCode ();
GenerateCleanObjectsAsYouGoCode ();
+
+ if ( definitionFilename )
+ delete definitionFilename;
+ delete target_file;
}
void
MingwModuleHandler::GeneratePhonyTarget() const
{
string targetMacro ( GetTargetMacro ( module ) );
+ const FileLocation *target_file = GetTargetFilename ( module, NULL );
+
fprintf ( fMakefile,
".PHONY: %s\n\n",
targetMacro.c_str ());
fprintf ( fMakefile, "%s: | %s\n",
targetMacro.c_str (),
- strDirectory ( GetTargetFilename ( module, NULL ) ).c_str () );
+ backend->GetFullPath ( *target_file ).c_str () );
+
+ delete target_file;
}
void
-MingwModuleHandler::GenerateObjectFileTargets (
- const IfableData& data,
- const string& cc,
- const string& cppc,
- const string& cflagsMacro,
- const string& nasmflagsMacro,
- const string& windresflagsMacro,
- const string& widlflagsMacro )
+MingwModuleHandler::GenerateObjectFileTargets ( const IfableData& data )
{
size_t i;
+ string moduleDependencies;
const vector<CompilationUnit*>& compilationUnits = data.compilationUnits;
+ for ( i = 0; i < compilationUnits.size (); i++ )
+ {
+ CompilationUnit& compilationUnit = *compilationUnits[i];
+ const FileLocation& compilationName = compilationUnit.GetFilename ();
+ const FileLocation *objectFilename = GetObjectFilename ( &compilationName, module );
+ if ( GetExtension ( *objectFilename ) == ".h" )
+ moduleDependencies += ssprintf ( " $(%s_HEADERS)", module.name.c_str () );
+ else if ( GetExtension ( *objectFilename ) == ".rc" )
+ moduleDependencies += ssprintf ( " $(%s_RESOURCES)", module.name.c_str () );
+ delete objectFilename;
+ }
+
for ( i = 0; i < compilationUnits.size (); i++ )
{
GenerateCommands ( *compilationUnits[i],
- cc,
- cppc,
- cflagsMacro,
- nasmflagsMacro,
- windresflagsMacro,
- widlflagsMacro );
+ moduleDependencies );
fprintf ( fMakefile,
"\n" );
}
const vector<If*>& ifs = data.ifs;
for ( i = 0; i < ifs.size(); i++ )
{
- GenerateObjectFileTargets ( ifs[i]->data,
- cc,
- cppc,
- cflagsMacro,
- nasmflagsMacro,
- windresflagsMacro,
- widlflagsMacro );
+ GenerateObjectFileTargets ( ifs[i]->data );
}
vector<CompilationUnit*> sourceCompilationUnits;
for ( i = 0; i < sourceCompilationUnits.size (); i++ )
{
GenerateCommands ( *sourceCompilationUnits[i],
- cc,
- cppc,
- cflagsMacro,
- nasmflagsMacro,
- windresflagsMacro,
- widlflagsMacro );
+ moduleDependencies );
}
CleanupCompilationUnitVector ( sourceCompilationUnits );
}
void
-MingwModuleHandler::GenerateObjectFileTargets (
- const string& cc,
- const string& cppc,
- const string& cflagsMacro,
- const string& nasmflagsMacro,
- const string& windresflagsMacro,
- const string& widlflagsMacro )
+MingwModuleHandler::GenerateObjectFileTargets ()
{
- if ( module.pch && use_pch )
+ const FileLocation *pchFilename = GetPrecompiledHeaderFilename ();
+
+ if ( pchFilename )
{
- const FileLocation& baseHeaderFile = module.pch->file;
- const FileLocation *pchFilename = GetPrecompiledHeaderFilename ();
- CLEAN_FILE(pchFilename);
- string dependencies = strFile ( &baseHeaderFile );
+ string cc = ( module.host == HostTrue ? "${host_gcc}" : "${gcc}" );
+ string cppc = ( module.host == HostTrue ? "${host_gpp}" : "${gpp}" );
+
+ const FileLocation& baseHeaderFile = *module.pch->file;
+ CLEAN_FILE ( *pchFilename );
+ string dependencies = backend->GetFullName ( baseHeaderFile );
/* WIDL generated headers may be used */
vector<FileLocation> rpcDependencies;
GetRpcHeaderDependencies ( rpcDependencies );
- dependencies += " " + v2s ( rpcDependencies, 5 );
+ if ( rpcDependencies.size () > 0 )
+ dependencies += " " + v2s ( backend, rpcDependencies, 5 );
fprintf ( fMakefile,
- "%s: %s\n",
- strFile ( pchFilename ).c_str(),
- dependencies.c_str() );
+ "%s: %s ${%s_precondition} | %s\n",
+ backend->GetFullName ( *pchFilename ).c_str(),
+ dependencies.c_str(),
+ module.name.c_str (),
+ backend->GetFullPath ( *pchFilename ).c_str() );
fprintf ( fMakefile, "\t$(ECHO_PCH)\n" );
fprintf ( fMakefile,
"\t%s -o %s %s -g %s\n\n",
module.cplusplus ? cppc.c_str() : cc.c_str(),
- strFile ( pchFilename ).c_str(),
+ backend->GetFullName ( *pchFilename ).c_str(),
cflagsMacro.c_str(),
- strFile ( &baseHeaderFile ).c_str() );
+ backend->GetFullName ( baseHeaderFile ).c_str() );
+ delete pchFilename;
}
- GenerateObjectFileTargets ( module.non_if_data,
- cc,
- cppc,
- cflagsMacro,
- nasmflagsMacro,
- windresflagsMacro,
- widlflagsMacro );
+ GenerateObjectFileTargets ( module.non_if_data );
fprintf ( fMakefile, "\n" );
}
+/* caller needs to delete the returned object */
const FileLocation*
-MingwModuleHandler::GenerateArchiveTarget ( const string& ar,
- const string& objs_macro ) const
+MingwModuleHandler::GenerateArchiveTarget ()
{
const FileLocation *archiveFilename = GetModuleArchiveFilename ();
+ const FileLocation *definitionFilename = GetDefinitionFilename ();
- fprintf ( fMakefile,
- "%s: %s | %s\n",
- strFile ( archiveFilename ).c_str (),
- objs_macro.c_str (),
- strDirectory ( archiveFilename ).c_str() );
+ arRule1.Execute ( fMakefile, backend, module, archiveFilename, clean_files );
- if ( module.type == StaticLibrary && module.importLibrary )
+ if ( IsStaticLibrary ( module ) && definitionFilename )
{
- const FileLocation *definitionFilename ( GetDefinitionFilename () );
-
fprintf ( fMakefile,
- "\t${dlltool} --dllname %s --def %s --output-lib $@ %s %s\n",
+ "\t${dlltool} --dllname %s --def %s --output-lib $@%s%s\n",
module.importLibrary->dllname.c_str (),
- strFile ( definitionFilename ).c_str (),
- module.mangledSymbols ? "" : "--kill-at",
- module.underscoreSymbols ? "--add-underscore" : "" );
+ backend->GetFullName ( *definitionFilename ).c_str (),
+ module.mangledSymbols ? "" : " --kill-at",
+ module.underscoreSymbols ? " --add-underscore" : "" );
}
- fprintf ( fMakefile, "\t$(ECHO_AR)\n" );
+ if ( definitionFilename )
+ delete definitionFilename;
- fprintf ( fMakefile,
- "\t%s -rc $@ %s\n",
- ar.c_str (),
- objs_macro.c_str ());
+ if(module.type == HostStaticLibrary)
+ arHostRule2.Execute ( fMakefile, backend, module, archiveFilename, clean_files );
+ else
+ arRule2.Execute ( fMakefile, backend, module, archiveFilename, clean_files );
GenerateCleanObjectsAsYouGoCode ();
if ( ReferenceObjects ( module ) )
return GetObjectsMacro ( module );
else
- return strFile ( GetTargetFilename ( module, NULL ) ).c_str ();
+ {
+ const FileLocation *target_file = GetTargetFilename ( module, NULL );
+ string target = backend->GetFullName ( *target_file ).c_str ();
+ delete target_file;
+ return target;
+ }
+}
+
+void
+MingwModuleHandler::GenerateSourceMacro ()
+{
+ sourcesMacro = ssprintf ( "%s_SOURCES", module.name.c_str ());
+
+ GenerateSourceMacros (
+ "=",
+ module.non_if_data );
+
+ // future references to the macro will be to get its values
+ sourcesMacro = ssprintf ("$(%s)", sourcesMacro.c_str ());
}
void
GenerateObjectMacros (
"=",
- module.non_if_data,
- &module.linkerFlags );
+ module.non_if_data );
// future references to the macro will be to get its values
objectsMacro = ssprintf ("$(%s)", objectsMacro.c_str ());
Library& library = *module.non_if_data.libraries[i];
if ( library.importedModule->type == RpcServer ||
library.importedModule->type == RpcClient ||
+ library.importedModule->type == RpcProxy ||
library.importedModule->type == IdlHeader )
{
for ( size_t j = 0; j < library.importedModule->non_if_data.compilationUnits.size (); j++ )
{
CompilationUnit& compilationUnit = *library.importedModule->non_if_data.compilationUnits[j];
- const FileLocation* sourceFile = compilationUnit.GetFilename ();
- string extension = GetExtension ( sourceFile->name );
+ const FileLocation& sourceFile = compilationUnit.GetFilename ();
+ string extension = GetExtension ( sourceFile );
if ( extension == ".idl" || extension == ".IDL" )
{
- string basename = GetBasename ( sourceFile->name );
+ string basename = GetBasename ( sourceFile.name );
if ( library.importedModule->type == RpcServer )
- dependencies.push_back ( *GetRpcServerHeaderFilename ( sourceFile ) );
+ {
+ const FileLocation *header = GetRpcServerHeaderFilename ( &sourceFile );
+ dependencies.push_back ( *header );
+ delete header;
+ }
if ( library.importedModule->type == RpcClient )
- dependencies.push_back ( *GetRpcClientHeaderFilename ( sourceFile ) );
+ {
+ const FileLocation *header = GetRpcClientHeaderFilename ( &sourceFile );
+ dependencies.push_back ( *header );
+ delete header;
+ }
+ if ( library.importedModule->type == RpcProxy )
+ {
+ const FileLocation *header = GetRpcProxyHeaderFilename ( &sourceFile );
+ dependencies.push_back ( *header );
+ delete header;
+ }
if ( library.importedModule->type == IdlHeader )
- dependencies.push_back ( *GetIdlHeaderFilename ( sourceFile ) );
+ {
+ const FileLocation *header = GetIdlHeaderFilename ( &sourceFile );
+ dependencies.push_back ( *header );
+ delete header;
+ }
}
}
}
void
MingwModuleHandler::GenerateOtherMacros ()
{
+ set<const Define *> used_defs;
+
cflagsMacro = ssprintf ("%s_CFLAGS", module.name.c_str ());
nasmflagsMacro = ssprintf ("%s_NASMFLAGS", module.name.c_str ());
windresflagsMacro = ssprintf ("%s_RCFLAGS", module.name.c_str ());
GenerateMacros (
"=",
module.non_if_data,
- &module.linkerFlags );
+ &module.linkerFlags,
+ used_defs );
+
+ if ( module.host == HostFalse )
+ {
+ GenerateMacros (
+ "+=",
+ module.project.non_if_data,
+ NULL,
+ used_defs );
+ }
vector<FileLocation> s;
if ( module.importLibrary )
for ( size_t i = 0; i < compilationUnits.size (); i++ )
{
CompilationUnit& compilationUnit = *compilationUnits[i];
- const FileLocation* sourceFile = compilationUnit.GetFilename ();
- string extension = GetExtension ( sourceFile->name );
+ const FileLocation& sourceFile = compilationUnit.GetFilename ();
+ string extension = GetExtension ( sourceFile );
if ( extension == ".spec" || extension == ".SPEC" )
- GetSpecObjectDependencies ( s, sourceFile );
+ GetSpecObjectDependencies ( s, &sourceFile );
}
}
if ( s.size () > 0 )
for ( size_t i = 0; i < s.size(); i++ )
fprintf ( fMakefile,
" %s",
- strFile ( &s[i] ).c_str () );
+ backend->GetFullName ( s[i] ).c_str () );
fprintf ( fMakefile, "\n" );
}
- string globalCflags = "-g";
+ string globalCflags = "";
+ if ( module.host == HostFalse )
+ globalCflags += " $(PROJECT_CFLAGS)";
+ else
+ globalCflags += " -Wall -Wpointer-arith -D__REACTOS__";
+ globalCflags += " -g";
if ( backend->usePipe )
globalCflags += " -pipe";
if ( !module.allowWarnings )
globalCflags += " -Werror";
if ( module.host == HostTrue )
- globalCflags += " $(HOST_CFLAGS)";
+ {
+ if ( module.cplusplus )
+ globalCflags += " $(HOST_CPPFLAGS)";
+ else
+ globalCflags += " -Wno-strict-aliasing $(HOST_CFLAGS)";
+ }
+ else
+ {
+ if ( module.cplusplus )
+ {
+ // HACK: use host headers when building C++
+ globalCflags += " $(HOST_CPPFLAGS)";
+ }
+ else
+ globalCflags += " -nostdinc";
+ }
// Always force disabling of sibling calls optimisation for GCC
// (TODO: Move to version-specific once this bug is fixed in GCC)
fprintf (
fMakefile,
- "%s += $(PROJECT_CFLAGS) %s\n",
+ "%s +=%s\n",
cflagsMacro.c_str (),
globalCflags.c_str () );
- fprintf (
- fMakefile,
- "%s += $(PROJECT_RCFLAGS)\n",
- windresflagsMacro.c_str () );
+ if ( module.host == HostFalse )
+ {
+ fprintf (
+ fMakefile,
+ "%s += $(PROJECT_RCFLAGS)\n",
+ windresflagsMacro.c_str () );
- fprintf (
- fMakefile,
- "%s += $(PROJECT_WIDLFLAGS) -I%s\n",
- widlflagsMacro.c_str (),
- module.output->relative_path.c_str () );
+ fprintf (
+ fMakefile,
+ "%s += $(PROJECT_WIDLFLAGS) -I%s\n",
+ widlflagsMacro.c_str (),
+ module.output->relative_path.c_str () );
- fprintf (
- fMakefile,
- "%s_LFLAGS += $(PROJECT_LFLAGS) -g\n",
- module.name.c_str () );
+ fprintf (
+ fMakefile,
+ "%s_LFLAGS += $(PROJECT_LFLAGS) -g\n",
+ module.name.c_str () );
+ }
+ else
+ {
+ fprintf (
+ fMakefile,
+ "%s_LFLAGS += $(HOST_LFLAGS)\n",
+ module.name.c_str () );
+ }
fprintf (
fMakefile,
linkerflags.c_str () );
}
- if ( module.type == StaticLibrary && module.isStartupLib )
+ if ( IsStaticLibrary ( module ) && module.isStartupLib )
{
fprintf ( fMakefile,
"%s += -Wno-main\n\n",
void
MingwModuleHandler::GenerateRules ()
{
- string cc = ( module.host == HostTrue ? "${host_gcc}" : "${gcc}" );
- string cppc = ( module.host == HostTrue ? "${host_gpp}" : "${gpp}" );
- string ar = ( module.host == HostTrue ? "${host_ar}" : "${ar}" );
-
- if ( module.name != "zlib" ) /* Avoid make warning */
- {
- FileLocation proxyMakefile ( OutputDirectory,
- module.output->relative_path,
- "makefile" );
- CLEAN_FILE ( &proxyMakefile );
- }
-
string targetMacro = GetTargetMacro ( module );
- //CLEAN_FILE ( &targetMacro );
- CLEAN_FILE ( new FileLocation ( SourceDirectory, "", targetMacro ) );
+ //CLEAN_FILE ( targetMacro );
+ CLEAN_FILE ( FileLocation ( SourceDirectory, "", targetMacro ) );
// generate phony target for module name
fprintf ( fMakefile, ".PHONY: %s\n",
if ( !ReferenceObjects ( module ) )
{
- const FileLocation* ar_target = GenerateArchiveTarget ( ar, objectsMacro );
- CLEAN_FILE ( ar_target );
+ const FileLocation* ar_target = GenerateArchiveTarget ();
+ delete ar_target;
}
- GenerateObjectFileTargets ( cc,
- cppc,
- cflagsMacro,
- nasmflagsMacro,
- windresflagsMacro,
- widlflagsMacro );
+ GenerateObjectFileTargets ();
}
void
invoke_targets[i].c_str () );
fprintf ( fMakefile,
": %s\n",
- NormalizeFilename ( strFile ( invoke.invokeModule->output ) ).c_str () );
+ NormalizeFilename ( backend->GetFullName ( *invoke.invokeModule->output ) ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_INVOKE)\n" );
fprintf ( fMakefile,
"\t%s %s\n\n",
- NormalizeFilename ( strFile ( invoke.invokeModule->output ) ).c_str (),
+ NormalizeFilename ( backend->GetFullName ( *invoke.invokeModule->output ) ).c_str (),
invoke.GetParameters ().c_str () );
}
}
string_list& dependencies ) const
{
/* Avoid circular dependency */
- if ( module.type != BuildTool
- && module.name != "zlib"
- && module.name != "hostzlib" )
-
- dependencies.push_back ( "$(INIT)" );
+ if ( module.host == HostTrue )
+ return;
- if ( module.type != BuildTool
- && module.name != "psdk" )
+ if ( module.name != "psdk" )
+ dependencies.push_back ( "$(PSDK_TARGET) $(psdk_HEADERS)" );
- dependencies.push_back ( "$(PSDK_TARGET)" );
+ /* Check if any dependent library relies on the generated headers */
+ for ( size_t i = 0; i < module.project.modules.size (); i++ )
+ {
+ const Module& m = *module.project.modules[i];
+ for ( size_t j = 0; j < m.non_if_data.compilationUnits.size (); j++ )
+ {
+ CompilationUnit& compilationUnit = *m.non_if_data.compilationUnits[j];
+ const FileLocation& sourceFile = compilationUnit.GetFilename ();
+ string extension = GetExtension ( sourceFile );
+ if (extension == ".mc" || extension == ".MC" )
+ {
+ string dependency = ssprintf ( "$(%s_MCHEADERS)", m.name.c_str () );
+ dependencies.push_back ( dependency );
+ }
+ }
+ }
}
void
fprintf ( fMakefile, "\n\n" );
}
- for ( size_t i = 0; i < sourceFilenames.size(); i++ )
- {
- fprintf ( fMakefile,
- "%s: ${%s}\n",
- strFile ( &sourceFilenames[i] ).c_str (),
- preconditionDependenciesName.c_str ());
- }
fprintf ( fMakefile, "\n" );
}
return ( index != string::npos );
}
+/* caller needs to delete the returned object */
const FileLocation*
MingwModuleHandler::GetDefinitionFilename () const
{
- if ( module.importLibrary != NULL )
- {
- DirectoryLocation directory;
- if ( IsWineModule () )
- directory = IntermediateDirectory;
- else
- directory = SourceDirectory;
+ if ( module.importLibrary == NULL )
+ return NULL;
- return new FileLocation ( directory,
- module.importLibrary->source->relative_path,
- module.importLibrary->source->name );
- }
+ DirectoryLocation directory;
+ if ( IsWineModule () )
+ directory = IntermediateDirectory;
else
- return new FileLocation ( SourceDirectory, "tools" + sSep + "rbuild", "empty.def" );
+ directory = SourceDirectory;
+
+ return new FileLocation ( directory,
+ module.importLibrary->source->relative_path,
+ module.importLibrary->source->name );
}
void
{
const FileLocation *library_target = GetImportLibraryFilename ( module, &clean_files );
const FileLocation *defFilename = GetDefinitionFilename ();
+ string empty = "tools" + sSep + "rbuild" + sSep + "empty.def";
vector<FileLocation> deps;
GetDefinitionDependencies ( deps );
fprintf ( fMakefile, "# IMPORT LIBRARY RULE:\n" );
- fprintf ( fMakefile, "%s: %s",
- strFile ( library_target ).c_str (),
- strFile ( defFilename ).c_str () );
+ fprintf ( fMakefile, "%s:",
+ backend->GetFullName ( *library_target ).c_str () );
+
+ if ( defFilename )
+ {
+ fprintf ( fMakefile, " %s",
+ backend->GetFullName ( *defFilename ).c_str () );
+ }
size_t i, iend = deps.size();
for ( i = 0; i < iend; i++ )
fprintf ( fMakefile, " %s",
- strFile ( &deps[i] ).c_str () );
+ backend->GetFullName ( deps[i] ).c_str () );
fprintf ( fMakefile, " | %s\n",
- strDirectory ( GetImportLibraryFilename ( module, NULL ) ).c_str () );
+ backend->GetFullPath ( *library_target ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_DLLTOOL)\n" );
fprintf ( fMakefile,
- "\t${dlltool} --dllname %s --def %s --output-lib %s %s %s\n\n",
+ "\t${dlltool} --dllname %s --def %s --output-lib %s%s%s\n\n",
module.output->name.c_str (),
- strFile ( defFilename ).c_str (),
- strFile ( library_target ).c_str (),
- module.mangledSymbols ? "" : "--kill-at",
- module.underscoreSymbols ? "--add-underscore" : "" );
+ defFilename ? backend->GetFullName ( *defFilename ).c_str ()
+ : empty.c_str (),
+ backend->GetFullName ( *library_target ).c_str (),
+ module.mangledSymbols ? "" : " --kill-at",
+ module.underscoreSymbols ? " --add-underscore" : "" );
+
+ if ( defFilename )
+ delete defFilename;
+ delete library_target;
}
}
dependencies.push_back ( stubsDependency );
}
+void
+MingwModuleHandler::GetMcObjectDependencies (
+ vector<FileLocation>& dependencies,
+ const FileLocation *file ) const
+{
+ string basename = GetBasename ( file->name );
+
+ FileLocation defDependency ( IntermediateDirectory,
+ "include/reactos",
+ basename + ".h" );
+ dependencies.push_back ( defDependency );
+
+ FileLocation stubsDependency ( IntermediateDirectory,
+ file->relative_path,
+ basename + ".rc" );
+ dependencies.push_back ( stubsDependency );
+}
+
void
MingwModuleHandler::GetWidlObjectDependencies (
vector<FileLocation>& dependencies,
const FileLocation *file ) const
{
string basename = GetBasename ( file->name );
+ const FileLocation *generatedHeaderFilename = GetRpcServerHeaderFilename ( file );
FileLocation serverSourceDependency ( IntermediateDirectory,
file->relative_path,
basename + "_s.c" );
dependencies.push_back ( serverSourceDependency );
- dependencies.push_back ( *GetRpcServerHeaderFilename ( file ) );
+ dependencies.push_back ( *generatedHeaderFilename );
+
+ delete generatedHeaderFilename;
}
void
const vector<CompilationUnit*>& compilationUnits = module.non_if_data.compilationUnits;
for ( size_t i = 0; i < compilationUnits.size (); i++ )
{
- CompilationUnit& compilationUnit = *compilationUnits[i];
- const FileLocation* sourceFile = compilationUnit.GetFilename ();
- string extension = GetExtension ( sourceFile->name );
+ const CompilationUnit& compilationUnit = *compilationUnits[i];
+ const FileLocation& sourceFile = compilationUnit.GetFilename ();
+ string extension = GetExtension ( sourceFile );
if ( extension == ".spec" || extension == ".SPEC" )
- GetSpecObjectDependencies ( dependencies, sourceFile );
+ GetSpecObjectDependencies ( dependencies, &sourceFile );
if ( extension == ".idl" || extension == ".IDL" )
{
- if ( ( module.type == RpcServer ) || ( module.type == RpcClient ) )
- GetWidlObjectDependencies ( dependencies, sourceFile );
+ if ( ( module.type == RpcServer ) || ( module.type == RpcClient ) || ( module.type == RpcProxy ) )
+ GetWidlObjectDependencies ( dependencies, &sourceFile );
}
}
}
else
linker = "${host_gcc}";
+ const FileLocation *target_file = GetTargetFilename ( module, NULL );
fprintf ( fMakefile, "%s: %s %s | %s\n",
targetMacro.c_str (),
objectsMacro.c_str (),
linkDepsMacro.c_str (),
- strDirectory(GetTargetFilename(module,NULL)).c_str () );
+ backend->GetFullPath ( *target_file ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_LD)\n" );
fprintf ( fMakefile,
"\t%s %s -o $@ %s %s\n\n",
GetLinkerMacro ().c_str (),
objectsMacro.c_str (),
libsMacro.c_str () );
+
+ delete target_file;
}
{
string targetMacro ( GetTargetMacro ( module ) );
string workingDirectory = GetWorkingDirectory ( );
- string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
- string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
string dependencies = linkDepsMacro + " " + objectsMacro;
- string linkerParameters = ssprintf ( "-Wl,-T,%s%cntoskrnl.lnk -Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -shared",
- module.output->relative_path.c_str (),
- cSep,
- module.GetEntryPoint(true).c_str (),
+ string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s",
+ module.GetEntryPoint(!(Environment::GetArch() == "arm")).c_str (),
module.baseaddress.c_str () );
+
GenerateLinkerCommand ( dependencies,
- "${gcc}",
- linkerParameters,
- objectsMacro,
- libsMacro,
- "-sections" );
+ linkerParameters + " $(NTOSKRNL_SHARED)",
+ " -sections" );
}
else
{
}
+MingwHostStaticLibraryModuleHandler::MingwHostStaticLibraryModuleHandler (
+ const Module& module_ )
+
+ : MingwModuleHandler ( module_ )
+{
+}
+
+void
+MingwHostStaticLibraryModuleHandler::Process ()
+{
+ GenerateHostStaticLibraryModuleTarget ();
+}
+
+void
+MingwHostStaticLibraryModuleHandler::GenerateHostStaticLibraryModuleTarget ()
+{
+ GenerateRules ();
+}
+
+
MingwObjectLibraryModuleHandler::MingwObjectLibraryModuleHandler (
const Module& module_ )
{
string targetMacro ( GetTargetMacro ( module ) );
string workingDirectory = GetWorkingDirectory ( );
- string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
- string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
module.GetEntryPoint(true).c_str (),
module.baseaddress.c_str () );
GenerateLinkerCommand ( dependencies,
- "${gcc}",
linkerParameters,
- objectsMacro,
- libsMacro,
- "-sections" );
+ " -sections" );
}
else
{
{
string targetMacro ( GetTargetMacro (module) );
string workingDirectory = GetWorkingDirectory ();
- string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
- string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
module.GetEntryPoint(true).c_str (),
module.baseaddress.c_str () );
GenerateLinkerCommand ( dependencies,
- "${gcc}",
linkerParameters,
- objectsMacro,
- libsMacro,
- "-sections" );
+ " -sections" );
}
else
{
{
string targetMacro ( GetTargetMacro (module) );
string workingDirectory = GetWorkingDirectory ( );
- string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
- string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
module.GetEntryPoint(true).c_str (),
module.baseaddress.c_str () );
GenerateLinkerCommand ( dependencies,
- "${gcc}",
linkerParameters,
- objectsMacro,
- libsMacro,
"" );
}
else
{
string targetMacro ( GetTargetMacro (module) );
string workingDirectory = GetWorkingDirectory ( );
- string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
- string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
module.GetEntryPoint(true).c_str (),
module.baseaddress.c_str () );
GenerateLinkerCommand ( dependencies,
- "${gcc}",
linkerParameters,
- objectsMacro,
- libsMacro,
"" );
}
else
{
}
+static bool
+LinksToCrt( Module &module )
+{
+ for ( size_t i = 0; i < module.non_if_data.libraries.size (); i++ )
+ {
+ Library& library = *module.non_if_data.libraries[i];
+ if ( library.name == "libcntpr" || library.name == "crt" )
+ return true;
+ }
+ return false;
+}
+
static void
MingwAddImplicitLibraries( Module &module )
{
Library* pLibrary;
+ bool links_to_crt;
+
+ if ( module.type != Win32DLL
+ && module.type != Win32OCX
+ && module.type != Win32CUI
+ && module.type != Win32GUI
+ && module.type != Win32SCR )
+ {
+ // no implicit libraries
+ return;
+ }
+
+ links_to_crt = LinksToCrt ( module );
if ( !module.isDefaultEntryPoint )
{
if ( module.GetEntryPoint(false) == "0" )
{
- pLibrary = new Library ( module, "mingw_common" );
- module.non_if_data.libraries.insert ( module.non_if_data.libraries.begin() , pLibrary );
- pLibrary = new Library ( module, "msvcrt" );
- module.non_if_data.libraries.push_back ( pLibrary );
+ if ( !links_to_crt )
+ {
+ pLibrary = new Library ( module, "mingw_common" );
+ module.non_if_data.libraries.insert ( module.non_if_data.libraries.begin() , pLibrary );
+
+ pLibrary = new Library ( module, "msvcrt" );
+ module.non_if_data.libraries.push_back ( pLibrary );
+ links_to_crt = true;
+ }
}
return;
}
pLibrary = new Library ( module, "mingw_common" );
module.non_if_data.libraries.insert ( module.non_if_data.libraries.begin() + 1, pLibrary );
- if ( module.name != "msvcrt" )
+ if ( !links_to_crt )
{
// always link in msvcrt to get the basic routines
pLibrary = new Library ( module, "msvcrt" );
{
string targetMacro ( GetTargetMacro (module) );
string workingDirectory = GetWorkingDirectory ( );
- string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
- string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
string dependencies = linkDepsMacro + " " + objectsMacro;
- string linker;
- if ( module.cplusplus )
- linker = "${gpp}";
- else
- linker = "${gcc}";
-
string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -shared",
module.GetEntryPoint(true).c_str (),
module.baseaddress.c_str () );
GenerateLinkerCommand ( dependencies,
- linker,
linkerParameters,
- objectsMacro,
- libsMacro,
"" );
}
else
{
string targetMacro ( GetTargetMacro (module) );
string workingDirectory = GetWorkingDirectory ( );
- string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
- string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
string dependencies = linkDepsMacro + " " + objectsMacro;
- string linker;
- if ( module.cplusplus )
- linker = "${gpp}";
- else
- linker = "${gcc}";
-
string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -shared",
module.GetEntryPoint(true).c_str (),
module.baseaddress.c_str () );
GenerateLinkerCommand ( dependencies,
- linker,
linkerParameters,
- objectsMacro,
- libsMacro,
"" );
}
else
{
string targetMacro ( GetTargetMacro (module) );
string workingDirectory = GetWorkingDirectory ( );
- string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
- string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
string dependencies = linkDepsMacro + " " + objectsMacro;
- string linker;
- if ( module.cplusplus )
- linker = "${gpp}";
- else
- linker = "${gcc}";
-
string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",
module.GetEntryPoint(true).c_str (),
module.baseaddress.c_str () );
GenerateLinkerCommand ( dependencies,
- linker,
linkerParameters,
- objectsMacro,
- libsMacro,
"" );
}
else
{
string targetMacro ( GetTargetMacro (module) );
string workingDirectory = GetWorkingDirectory ( );
- string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
- string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
string dependencies = linkDepsMacro + " " + objectsMacro;
- string linker;
- if ( module.cplusplus )
- linker = "${gpp}";
- else
- linker = "${gcc}";
-
string linkerParameters = ssprintf ( "-Wl,--subsystem,windows -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",
module.GetEntryPoint(true).c_str (),
module.baseaddress.c_str () );
GenerateLinkerCommand ( dependencies,
- linker,
linkerParameters,
- objectsMacro,
- libsMacro,
"" );
}
else
FileLocation junk_tmp ( TemporaryDirectory,
"",
module.name + ".junk.tmp" );
- CLEAN_FILE ( &junk_tmp );
+ CLEAN_FILE ( junk_tmp );
string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
string libsMacro = GetLibsMacro ();
GenerateRules ();
+ const FileLocation *target_file = GetTargetFilename ( module, NULL );
fprintf ( fMakefile, "%s: %s %s | %s\n",
targetMacro.c_str (),
objectsMacro.c_str (),
linkDepsMacro.c_str (),
- strDirectory(GetTargetFilename(module,NULL)).c_str () );
+ backend->GetFullPath ( *target_file ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_LD)\n" );
- fprintf ( fMakefile,
- "\t${ld} %s -N -Ttext=0x8000 -o %s %s %s\n",
- GetLinkerMacro ().c_str (),
- strFile ( &junk_tmp ).c_str (),
- objectsMacro.c_str (),
- linkDepsMacro.c_str () );
+ if (Environment::GetArch() == "arm")
+ {
+ fprintf ( fMakefile,
+ "\t${gcc} -Wl,--subsystem,native -Wl,--section-start,startup=0x8000 -o %s %s %s %s\n",
+ backend->GetFullName ( junk_tmp ).c_str (),
+ objectsMacro.c_str (),
+ linkDepsMacro.c_str (),
+ GetLinkerMacro ().c_str ());
+ }
+ else
+ {
+ fprintf ( fMakefile,
+ "\t${gcc} -Wl,--subsystem,native -Wl,-Ttext,0x8000 -o %s %s %s %s\n",
+ backend->GetFullName ( junk_tmp ).c_str (),
+ objectsMacro.c_str (),
+ linkDepsMacro.c_str (),
+ GetLinkerMacro ().c_str ());
+ }
fprintf ( fMakefile,
"\t${objcopy} -O binary %s $@\n",
- strFile ( &junk_tmp ).c_str () );
+ backend->GetFullName ( junk_tmp ).c_str () );
GenerateBuildMapCode ( &junk_tmp );
fprintf ( fMakefile,
"\t-@${rm} %s 2>$(NUL)\n",
- strFile ( &junk_tmp ).c_str () );
+ backend->GetFullName ( junk_tmp ).c_str () );
+
+ delete target_file;
}
FileLocation junk_cpy ( TemporaryDirectory,
"",
module.name + ".junk.elf" );
- CLEAN_FILE ( &junk_tmp );
- CLEAN_FILE ( &junk_elf );
- CLEAN_FILE ( &junk_cpy );
+ CLEAN_FILE ( junk_tmp );
+ CLEAN_FILE ( junk_elf );
+ CLEAN_FILE ( junk_cpy );
string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
string libsMacro = GetLibsMacro ();
GenerateRules ();
+ const FileLocation *target_file = GetTargetFilename ( module, NULL );
fprintf ( fMakefile, "%s: %s %s %s | %s\n",
targetMacro.c_str (),
objectsMacro.c_str (),
linkDepsMacro.c_str (),
payload->name.c_str (),
- strDirectory(GetTargetFilename(module,NULL)).c_str () );
+ backend->GetFullPath ( *target_file ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_BOOTPROG)\n" );
fprintf ( fMakefile, "\t$(%s_PREPARE) $(OUTPUT)$(SEP)%s %s\n",
- module.buildtype.c_str (),
- NormalizeFilename( strFile ( payload->output ) ).c_str (),
- strFile ( &junk_cpy ).c_str () );
+ module.buildtype.c_str (),
+ NormalizeFilename( backend->GetFullName ( *payload->output ) ).c_str (),
+ backend->GetFullName ( junk_cpy ).c_str () );
fprintf ( fMakefile, "\t${objcopy} $(%s_FLATFORMAT) %s %s\n",
module.buildtype.c_str (),
- strFile ( &junk_cpy ).c_str (),
- strFile ( &junk_tmp ).c_str () );
+ backend->GetFullName ( junk_cpy ).c_str (),
+ backend->GetFullName ( junk_tmp ).c_str () );
fprintf ( fMakefile, "\t${ld} $(%s_LINKFORMAT) %s %s -g -o %s\n",
module.buildtype.c_str (),
linkDepsMacro.c_str (),
- strFile ( &junk_tmp ).c_str (),
- strFile ( &junk_elf ).c_str () );
+ backend->GetFullName ( junk_tmp ).c_str (),
+ backend->GetFullName ( junk_elf ).c_str () );
fprintf ( fMakefile, "\t${objcopy} $(%s_COPYFORMAT) %s $(INTERMEDIATE)$(SEP)%s\n",
module.buildtype.c_str (),
- strFile ( &junk_elf ).c_str (),
- strFile ( module.output ) .c_str () );
+ backend->GetFullName ( junk_elf ).c_str (),
+ backend->GetFullName ( *module.output ) .c_str () );
fprintf ( fMakefile,
"\t-@${rm} %s %s %s 2>$(NUL)\n",
- strFile ( &junk_tmp ).c_str (), strFile ( &junk_elf ).c_str (), strFile ( &junk_cpy ).c_str () );
+ backend->GetFullName ( junk_tmp ).c_str (),
+ backend->GetFullName ( junk_elf ).c_str (),
+ backend->GetFullName ( junk_cpy ).c_str () );
+
+ delete target_file;
}
if ( m.bootstrap != NULL )
{
FileLocation targetFile ( OutputDirectory,
- bootcdDirectory + sSep + m.bootstrap->base,
+ m.bootstrap->base.length () > 0
+ ? bootcdDirectory + sSep + m.bootstrap->base
+ : bootcdDirectory,
m.bootstrap->nameoncd );
OutputCopyCommand ( *m.output, targetFile );
}
if ( m.bootstrap != NULL )
{
FileLocation targetDirectory ( OutputDirectory,
- bootcdDirectory + sSep + m.bootstrap->base,
+ m.bootstrap->base.length () > 0
+ ? bootcdDirectory + sSep + m.bootstrap->base
+ : bootcdDirectory,
"" );
out.push_back ( targetDirectory );
}
vSourceFiles.push_back ( srcunattend );
// bootsector
- FileLocation isoboot ( OutputDirectory,
- "boot" + sSep + "freeldr" + sSep + "bootsect",
- module.type == IsoRegTest
- ? "isobtrt.o"
- : "isoboot.o" );
- vSourceFiles.push_back ( isoboot );
+ const Module* bootModule;
+ bootModule = module.project.LocateModule ( module.type == IsoRegTest
+ ? "isobtrt"
+ : "isoboot" );
+ const FileLocation *isoboot = bootModule->output;
+ vSourceFiles.push_back ( *isoboot );
// prepare reactos.dff and reactos.inf
FileLocation reactosDff ( SourceDirectory,
FileLocation reactosInf ( bootcdReactos.directory,
bootcdReactos.relative_path,
"reactos.inf" );
+
vSourceFiles.push_back ( reactosDff );
string IsoName;
IsoName = "ReactOS.iso";
- string sourceFiles = v2s ( vSourceFiles, 5 );
+ string sourceFiles = v2s ( backend, vSourceFiles, 5 );
// fill cdrom
GetCdDirectories ( vCdDirectories, bootcdDirectory );
GetCdFiles ( vCdFiles );
string cdDirectories = "";//v2s ( vCdDirectories, 5 );
- string cdFiles = v2s ( vCdFiles, 5 );
+ string cdFiles = v2s ( backend, vCdFiles, 5 );
fprintf ( fMakefile, ".PHONY: %s\n\n",
module.name.c_str ());
fprintf ( fMakefile,
"%s: all %s %s %s $(CABMAN_TARGET) $(CDMAKE_TARGET) %s\n",
module.name.c_str (),
- strFile ( &isoboot ).c_str (),
+ backend->GetFullName ( *isoboot ).c_str (),
sourceFiles.c_str (),
cdFiles.c_str (),
cdDirectories.c_str () );
- fprintf ( fMakefile, "\t$(ECHO_CABMAN)\n" );
fprintf ( fMakefile,
"\t$(Q)$(CABMAN_TARGET) -C %s -L %s -I -P $(OUTPUT)\n",
- strFile ( &reactosDff ).c_str (),
- strDirectory ( &bootcdReactos ).c_str () );
+ backend->GetFullName ( reactosDff ).c_str (),
+ backend->GetFullPath ( bootcdReactos ).c_str () );
fprintf ( fMakefile,
"\t$(Q)$(CABMAN_TARGET) -C %s -RC %s -L %s -N -P $(OUTPUT)\n",
- strFile ( &reactosDff ).c_str (),
- strFile ( &reactosInf ).c_str (),
- strDirectory ( &bootcdReactos ).c_str ());
+ backend->GetFullName ( reactosDff ).c_str (),
+ backend->GetFullName ( reactosInf ).c_str (),
+ backend->GetFullPath ( bootcdReactos ).c_str ());
fprintf ( fMakefile,
"\t-@${rm} %s 2>$(NUL)\n",
- strFile ( &reactosInf ).c_str () );
+ backend->GetFullName ( reactosInf ).c_str () );
OutputBootstrapfileCopyCommands ( bootcdDirectory );
OutputCdfileCopyCommands ( bootcdDirectory );
fprintf ( fMakefile, "\t$(ECHO_CDMAKE)\n" );
fprintf ( fMakefile,
"\t$(Q)$(CDMAKE_TARGET) -v -j -m -b %s %s REACTOS %s\n",
- strFile ( &isoboot ).c_str (),
- strDirectory ( &bootcd ).c_str (),
+ backend->GetFullName ( *isoboot ).c_str (),
+ backend->GetFullPath ( bootcd ).c_str (),
IsoName.c_str() );
fprintf ( fMakefile,
"\n" );
"\t$(ECHO_MKHIVE)\n" );
fprintf ( fMakefile,
"\t$(MKHIVE_TARGET) boot%cbootdata %s boot%cbootdata%clivecd.inf boot%cbootdata%chiveinst.inf\n",
- cSep, strDirectory ( &reactosSystem32ConfigDirectory ).c_str (),
+ cSep, backend->GetFullPath ( reactosSystem32ConfigDirectory ).c_str (),
cSep, cSep, cSep, cSep );
}
string livecdDirectory = module.name;
FileLocation livecd ( OutputDirectory, livecdDirectory, "" );
- string bootloader;
string IsoName;
+ const Module* bootModule;
+ bootModule = module.project.LocateModule ( module.name == "livecdregtest"
+ ? "isobtrt"
+ : "isoboot" );
+ const FileLocation *isoboot = bootModule->output;
if (module.name == "livecdregtest")
- {
- bootloader = "isobtrt.o";
IsoName = "ReactOS-LiveCD-RegTest.iso";
- }
else
- {
- bootloader = "isoboot.o";
IsoName = "ReactOS-LiveCD.iso";
- }
-
- FileLocation isoboot ( OutputDirectory, "boot" + sSep + "freeldr" + sSep + "bootsect", bootloader );
string reactosDirectory = "reactos";
string livecdReactosNoFixup = livecdDirectory + sSep + reactosDirectory;
FileLocation livecdReactos ( OutputDirectory,
livecdReactosNoFixup,
"" );
- CLEAN_FILE ( &livecdReactos );
+ CLEAN_FILE ( livecdReactos );
fprintf ( fMakefile, ".PHONY: %s\n\n",
module.name.c_str ());
fprintf ( fMakefile,
"%s: all %s %s $(MKHIVE_TARGET) $(CDMAKE_TARGET)\n",
module.name.c_str (),
- strFile ( &isoboot) .c_str (),
- strDirectory ( &livecdReactos ).c_str () );
+ backend->GetFullName ( *isoboot) .c_str (),
+ backend->GetFullPath ( livecdReactos ).c_str () );
OutputModuleCopyCommands ( livecdDirectory,
reactosDirectory );
OutputNonModuleCopyCommands ( livecdDirectory,
fprintf ( fMakefile, "\t$(ECHO_CDMAKE)\n" );
fprintf ( fMakefile,
"\t$(Q)$(CDMAKE_TARGET) -v -m -j -b %s %s REACTOS %s\n",
- strFile( &isoboot ).c_str (),
- strDirectory ( &livecd ).c_str (),
+ backend->GetFullName( *isoboot ).c_str (),
+ backend->GetFullPath ( livecd ).c_str (),
IsoName.c_str() );
fprintf ( fMakefile,
"\n" );
GenerateTestModuleTarget ();
}
+/* caller needs to delete the returned object */
void
MingwTestModuleHandler::GetModuleSpecificCompilationUnits ( vector<CompilationUnit*>& compilationUnits )
{
- string basePath = "$(INTERMEDIATE)" + sSep + module.output->relative_path;
- compilationUnits.push_back ( new CompilationUnit ( new File ( basePath + sSep + "_hooks.c", false, "", false ) ) );
- compilationUnits.push_back ( new CompilationUnit ( new File ( basePath + sSep + "_stubs.S", false, "", false ) ) );
- compilationUnits.push_back ( new CompilationUnit ( new File ( basePath + sSep + "_startup.c", false, "", false ) ) );
+ compilationUnits.push_back ( new CompilationUnit ( new File ( IntermediateDirectory, module.output->relative_path + sSep + "..", module.name + "_hooks.c", false, "", false ) ) );
+ compilationUnits.push_back ( new CompilationUnit ( new File ( IntermediateDirectory, module.output->relative_path + sSep + "..", module.name + "_stubs.S", false, "", false ) ) );
+ compilationUnits.push_back ( new CompilationUnit ( new File ( IntermediateDirectory, module.output->relative_path + sSep + "..", module.name + "_startup.c", false, "", false ) ) );
}
void
{
string targetMacro ( GetTargetMacro ( module ) );
string workingDirectory = GetWorkingDirectory ( );
- string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
- string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
string dependencies = linkDepsMacro + " " + objectsMacro;
- string linker;
- if ( module.cplusplus )
- linker = "${gpp}";
- else
- linker = "${gcc}";
-
string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",
module.GetEntryPoint(true).c_str (),
module.baseaddress.c_str () );
GenerateLinkerCommand ( dependencies,
- linker,
linkerParameters,
- objectsMacro,
- libsMacro,
"" );
}
else
}
+MingwRpcProxyModuleHandler::MingwRpcProxyModuleHandler (
+ const Module& module_ )
+
+ : MingwModuleHandler ( module_ )
+{
+}
+
+void
+MingwRpcProxyModuleHandler::Process ()
+{
+ GenerateRules ();
+}
+
+
MingwAliasModuleHandler::MingwAliasModuleHandler (
const Module& module_ )
GenerateRules ();
}
+MingwCabinetModuleHandler::MingwCabinetModuleHandler (
+ const Module& module_ )
+
+ : MingwModuleHandler ( module_ )
+{
+}
+
+void
+MingwCabinetModuleHandler::Process ()
+{
+ string targetMacro ( GetTargetMacro (module) );
+
+ GenerateRules ();
+
+ const FileLocation *target_file = GetTargetFilename ( module, NULL );
+ fprintf ( fMakefile, "%s: | %s\n",
+ targetMacro.c_str (),
+ backend->GetFullPath ( *target_file ).c_str () );
+
+ fprintf ( fMakefile, "\t$(ECHO_CABMAN)\n" );
+ fprintf ( fMakefile,
+ "\t$(Q)$(CABMAN_TARGET) -M raw -S %s $(%s_SOURCES)\n", // Escape the asterisk for Make
+ targetMacro.c_str (),
+ module.name.c_str());
+}
+
MingwElfExecutableModuleHandler::MingwElfExecutableModuleHandler (
const Module& module_ )
GenerateRules ();
+ const FileLocation *target_file = GetTargetFilename ( module, NULL );
fprintf ( fMakefile, "%s: %s %s | %s\n",
targetMacro.c_str (),
objectsMacro.c_str (),
linkDepsMacro.c_str (),
- strDirectory(GetTargetFilename(module,NULL)).c_str () );
+ backend->GetFullPath ( *target_file ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_BOOTPROG)\n" );
- fprintf ( fMakefile, "\t${ld} $(%s_LINKFORMAT) %s %s -g -o %s\n",
+ fprintf ( fMakefile, "\t${gcc} $(%s_LINKFORMAT) %s %s -g -o %s\n",
module.buildtype.c_str(),
objectsMacro.c_str(),
libsMacro.c_str(),
targetMacro.c_str () );
+
+ delete target_file;
}