📄 modulehandler.cpp
字号:
objs_macro.c_str (),
GetDirectory(archiveFilename).c_str() );
if ( module.type == StaticLibrary && module.importLibrary )
{
string archiveFilename ( GetModuleArchiveFilename () );
string definitionFilename ( GetDefinitionFilename () );
fprintf ( fMakefile,
"\t${dlltool} --dllname %s --def %s --output-lib $@ %s %s\n",
module.importLibrary->dllname.c_str (),
definitionFilename.c_str (),
module.mangledSymbols ? "" : "--kill-at",
module.underscoreSymbols ? "--add-underscore" : "" );
}
fprintf ( fMakefile, "\t$(ECHO_AR)\n" );
fprintf ( fMakefile,
"\t%s -rc $@ %s\n",
ar.c_str (),
objs_macro.c_str ());
GenerateCleanObjectsAsYouGoCode ();
fprintf ( fMakefile, "\n" );
return archiveFilename;
}
string
MingwModuleHandler::GetCFlagsMacro () const
{
return ssprintf ( "$(%s_CFLAGS)",
module.name.c_str () );
}
/*static*/ string
MingwModuleHandler::GetObjectsMacro ( const Module& module )
{
return ssprintf ( "$(%s_OBJS)",
module.name.c_str () );
}
string
MingwModuleHandler::GetLinkingDependenciesMacro () const
{
return ssprintf ( "$(%s_LINKDEPS)", module.name.c_str () );
}
string
MingwModuleHandler::GetLibsMacro () const
{
return ssprintf ( "$(%s_LIBS)", module.name.c_str () );
}
string
MingwModuleHandler::GetLinkerMacro () const
{
return ssprintf ( "$(%s_LFLAGS)",
module.name.c_str () );
}
string
MingwModuleHandler::GetModuleTargets ( const Module& module )
{
if ( ReferenceObjects ( module ) )
return GetObjectsMacro ( module );
else
return GetTargetFilename ( module, NULL );
}
void
MingwModuleHandler::GenerateObjectMacro ()
{
objectsMacro = ssprintf ("%s_OBJS", module.name.c_str ());
GenerateObjectMacros (
"=",
module.non_if_data,
&module.linkerFlags );
// future references to the macro will be to get its values
objectsMacro = ssprintf ("$(%s)", objectsMacro.c_str ());
}
void
MingwModuleHandler::GenerateTargetMacro ()
{
fprintf ( fMakefile,
"%s := %s\n",
GetTargetMacro ( module, false ).c_str (),
GetModuleTargets ( module ).c_str () );
}
void
MingwModuleHandler::GetRpcHeaderDependencies (
vector<string>& dependencies ) const
{
for ( size_t i = 0; i < module.non_if_data.libraries.size (); i++ )
{
Library& library = *module.non_if_data.libraries[i];
if ( library.importedModule->type == RpcServer ||
library.importedModule->type == RpcClient ||
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];
FileLocation* sourceFileLocation = compilationUnit.GetFilename ( backend->intermediateDirectory );
string extension = GetExtension ( sourceFileLocation->filename );
if ( extension == ".idl" || extension == ".IDL" )
{
string basename = GetBasename ( sourceFileLocation->filename );
if ( library.importedModule->type == RpcServer )
dependencies.push_back ( GetRpcServerHeaderFilename ( basename ) );
if ( library.importedModule->type == RpcClient )
dependencies.push_back ( GetRpcClientHeaderFilename ( basename ) );
if ( library.importedModule->type == IdlHeader )
dependencies.push_back ( GetIdlHeaderFilename ( basename ) );
}
}
}
}
}
void
MingwModuleHandler::GenerateOtherMacros ()
{
cflagsMacro = ssprintf ("%s_CFLAGS", module.name.c_str ());
nasmflagsMacro = ssprintf ("%s_NASMFLAGS", module.name.c_str ());
windresflagsMacro = ssprintf ("%s_RCFLAGS", module.name.c_str ());
widlflagsMacro = ssprintf ("%s_WIDLFLAGS", module.name.c_str ());
linkerflagsMacro = ssprintf ("%s_LFLAGS", module.name.c_str ());
libsMacro = ssprintf("%s_LIBS", module.name.c_str ());
linkDepsMacro = ssprintf ("%s_LINKDEPS", module.name.c_str ());
GenerateMacros (
"=",
module.non_if_data,
&module.linkerFlags );
vector<string> s;
if ( module.importLibrary )
{
const vector<CompilationUnit*>& compilationUnits = module.non_if_data.compilationUnits;
for ( size_t i = 0; i < compilationUnits.size (); i++ )
{
CompilationUnit& compilationUnit = *compilationUnits[i];
FileLocation* sourceFileLocation = compilationUnit.GetFilename ( backend->intermediateDirectory );
string extension = GetExtension ( sourceFileLocation->filename );
if ( extension == ".spec" || extension == ".SPEC" )
GetSpecObjectDependencies ( s, sourceFileLocation->filename );
}
}
if ( s.size () > 0 )
{
fprintf (
fMakefile,
"%s +=",
linkDepsMacro.c_str() );
for ( size_t i = 0; i < s.size(); i++ )
fprintf ( fMakefile,
" %s",
s[i].c_str () );
fprintf ( fMakefile, "\n" );
}
string globalCflags = "-g";
if ( backend->usePipe )
globalCflags += " -pipe";
if ( !module.allowWarnings )
globalCflags += " -Werror";
// Always force disabling of sibling calls optimisation for GCC
// (TODO: Move to version-specific once this bug is fixed in GCC)
globalCflags += " -fno-optimize-sibling-calls";
fprintf (
fMakefile,
"%s += $(PROJECT_CFLAGS) %s\n",
cflagsMacro.c_str (),
globalCflags.c_str () );
fprintf (
fMakefile,
"%s += $(PROJECT_RCFLAGS)\n",
windresflagsMacro.c_str () );
fprintf (
fMakefile,
"%s += $(PROJECT_WIDLFLAGS) -I%s\n",
widlflagsMacro.c_str (),
module.GetBasePath ().c_str () );
fprintf (
fMakefile,
"%s_LFLAGS += $(PROJECT_LFLAGS) -g\n",
module.name.c_str () );
fprintf (
fMakefile,
"%s += $(%s)\n",
linkDepsMacro.c_str (),
libsMacro.c_str () );
string cflags = TypeSpecificCFlags();
if ( cflags.size() > 0 )
{
fprintf ( fMakefile,
"%s += %s\n\n",
cflagsMacro.c_str (),
cflags.c_str () );
}
string nasmflags = TypeSpecificNasmFlags();
if ( nasmflags.size () > 0 )
{
fprintf ( fMakefile,
"%s += %s\n\n",
nasmflagsMacro.c_str (),
nasmflags.c_str () );
}
string linkerflags = TypeSpecificLinkerFlags();
if ( linkerflags.size() > 0 )
{
fprintf ( fMakefile,
"%s += %s\n\n",
linkerflagsMacro.c_str (),
linkerflags.c_str () );
}
if ( module.type == StaticLibrary && module.isStartupLib )
{
fprintf ( fMakefile,
"%s += -Wno-main\n\n",
cflagsMacro.c_str () );
}
fprintf ( fMakefile, "\n\n" );
// future references to the macros will be to get their values
cflagsMacro = ssprintf ("$(%s)", cflagsMacro.c_str ());
nasmflagsMacro = ssprintf ("$(%s)", nasmflagsMacro.c_str ());
widlflagsMacro = ssprintf ("$(%s)", widlflagsMacro.c_str ());
}
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 */
{
string proxyMakefile = PassThruCacheDirectory (
NormalizeFilename ( module.GetBasePath () + sSep + "makefile" ),
backend->outputDirectory );
CLEAN_FILE ( proxyMakefile );
}
string targetMacro = GetTargetMacro ( module );
CLEAN_FILE ( targetMacro );
// generate phony target for module name
fprintf ( fMakefile, ".PHONY: %s\n",
module.name.c_str () );
string dependencies = GetTargetMacro ( module );
if ( module.type == Test )
dependencies += " $(REGTESTS_RUN_TARGET)";
fprintf ( fMakefile, "%s: %s\n\n",
module.name.c_str (),
dependencies.c_str () );
if ( module.type == Test )
{
fprintf ( fMakefile,
"\t@%s\n",
targetMacro.c_str ());
}
if ( !ReferenceObjects ( module ) )
{
string ar_target ( GenerateArchiveTarget ( ar, objectsMacro ) );
if ( targetMacro != ar_target )
CLEAN_FILE ( ar_target );
}
GenerateObjectFileTargets ( cc,
cppc,
cflagsMacro,
nasmflagsMacro,
windresflagsMacro,
widlflagsMacro );
}
void
MingwModuleHandler::GetInvocationDependencies (
const Module& module,
string_list& dependencies )
{
for ( size_t i = 0; i < module.invocations.size (); i++ )
{
Invoke& invoke = *module.invocations[i];
if ( invoke.invokeModule == &module )
/* Protect against circular dependencies */
continue;
invoke.GetTargets ( dependencies );
}
}
void
MingwModuleHandler::GenerateInvocations () const
{
if ( module.invocations.size () == 0 )
return;
size_t iend = module.invocations.size ();
for ( size_t i = 0; i < iend; i++ )
{
const Invoke& invoke = *module.invocations[i];
if ( invoke.invokeModule->type != BuildTool )
{
throw XMLInvalidBuildFileException (
module.node.location,
"Only modules of type buildtool can be invoked." );
}
string invokeTarget = module.GetInvocationTarget ( i );
string_list invoke_targets;
assert ( invoke_targets.size() );
invoke.GetTargets ( invoke_targets );
fprintf ( fMakefile,
".PHONY: %s\n\n",
invokeTarget.c_str () );
fprintf ( fMakefile,
"%s:",
invokeTarget.c_str () );
size_t j, jend = invoke_targets.size();
for ( j = 0; j < jend; j++ )
{
fprintf ( fMakefile,
" %s",
invoke_targets[i].c_str () );
}
fprintf ( fMakefile, "\n\n%s", invoke_targets[0].c_str () );
for ( j = 1; j < jend; j++ )
fprintf ( fMakefile,
" %s",
invoke_targets[i].c_str () );
fprintf ( fMakefile,
": %s\n",
NormalizeFilename ( invoke.invokeModule->GetPath () ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_INVOKE)\n" );
fprintf ( fMakefile,
"\t%s %s\n\n",
NormalizeFilename ( invoke.invokeModule->GetPath () ).c_str (),
invoke.GetParameters ().c_str () );
}
}
string
MingwModuleHandler::GetPreconditionDependenciesName () const
{
return module.name + "_precondition";
}
void
MingwModuleHandler::GetDefaultDependencies (
string_list& dependencies ) const
{
/* Avoid circular dependency */
if ( module.type != BuildTool
&& module.name != "zlib"
&& module.name != "hostzlib" )
dependencies.push_back ( "$(INIT)" );
if ( module.type != BuildTool
&& module.name != "psdk" )
dependencies.push_back ( "$(PSDK_TARGET)" );
}
void
MingwModuleHandler::GeneratePreconditionDependencies ()
{
string preconditionDependenciesName = GetPreconditionDependenciesName ();
string_list sourceFilenames;
GetSourceFilenamesWithoutGeneratedFiles ( sourceFilenames );
string_list dependencies;
GetDefaultDependencies ( dependencies );
GetModuleDependencies ( dependencies );
GetInvocationDependencies ( module, dependencies );
if ( dependencies.size() )
{
fprintf ( fMakefile,
"%s =",
preconditionDependenciesName.c_str () );
for ( size_t i = 0; i < dependencies.size(); i++ )
fprintf ( fMakefile,
" %s",
dependencies[i].c_str () );
fprintf ( fMakefile, "\n\n" );
}
for ( size_t i = 0; i < sourceFilenames.size(); i++ )
{
fprintf ( fMakefile,
"%s: ${%s}\n",
sourceFilenames[i].c_str(),
preconditionDependenciesName.c_str ());
}
fprintf ( fMakefile, "\n" );
}
bool
MingwModuleHandler::IsWineModule () const
{
if ( module.importLibrary == NULL)
return false;
size_t index = module.importLibrary->definition.rfind ( ".spec.def" );
return ( index != string::npos );
}
string
MingwModuleHandler::GetDefinitionFilename () const
{
if ( module.importLibrary != NULL )
{
string defFilename = module.GetBasePath () + sSep + module.importLibrary->definition;
if ( IsWineModule () )
return PassThruCacheDirectory ( NormalizeFilename ( defFilename ),
backend->intermediateDirectory );
else
return defFilename;
}
else
return "tools" + sSep + "rbuild" + sSep + "empty.def";
}
void
MingwModuleHandler::GenerateImportLibraryTargetIfNeeded ()
{
if ( module.importLibrary != NULL )
{
string library_tar
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -