modulehandler.cpp
来自「一个类似windows」· C++ 代码 · 共 2,308 行 · 第 1/5 页
CPP
2,308 行
"%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 () );
}
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)" );
}
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_target (
GetImportLibraryFilename ( module, &clean_files ) );
string defFilename = GetDefinitionFilename ();
string_list deps;
GetDefinitionDependencies ( deps );
fprintf ( fMakefile, "# IMPORT LIBRARY RULE:\n" );
fprintf ( fMakefile, "%s: %s",
library_target.c_str (),
defFilename.c_str () );
size_t i, iend = deps.size();
for ( i = 0; i < iend; i++ )
fprintf ( fMakefile, " %s",
deps[i].c_str () );
fprintf ( fMakefile, " | %s\n",
GetDirectory ( GetImportLibraryFilename ( module, NULL ) ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_DLLTOOL)\n" );
string killAt = module.mangledSymbols ? "" : "--kill-at";
fprintf ( fMakefile,
"\t${dlltool} --dllname %s --def %s --output-lib %s %s\n\n",
module.GetTargetName ().c_str (),
defFilename.c_str (),
library_target.c_str (),
killAt.c_str () );
}
}
void
MingwModuleHandler::GetSpecObjectDependencies (
string_list& dependencies,
const string& filename ) const
{
string basename = GetBasename ( filename );
string defDependency = PassThruCacheDirectory (
NormalizeFilename ( basename + ".spec.def" ),
backend->intermediateDirectory );
dependencies.push_back ( defDependency );
string stubsDependency = PassThruCacheDirectory (
NormalizeFilename ( basename + ".stubs.c" ),
backend->intermediateDirectory );
dependencies.push_back ( stubsDependency );
}
void
MingwModuleHandler::GetWidlObjectDependencies (
string_list& dependencies,
const string& filename ) const
{
string basename = GetBasename ( filename );
string serverSourceDependency = PassThruCacheDirectory (
NormalizeFilename ( basename + "_s.c" ),
backend->intermediateDirectory );
dependencies.push_back ( serverSourceDependency );
dependencies.push_back ( GetRpcServerHeaderFilename ( basename ) );
}
void
MingwModuleHandler::GetDefinitionDependencies (
string_list& dependencies ) const
{
string dkNkmLibNoFixup = "dk/nkm/lib";
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 ( dependencies, sourceFileLocation->filename );
if ( extension == ".idl" || extension == ".IDL" )
GetWidlObjectDependencies ( dependencies, sourceFileLocation->filename );
}
}
MingwBuildToolModuleHandler::MingwBuildToolModuleHandler ( const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwBuildToolModuleHandler::Process ()
{
GenerateBuildToolModuleTarget ();
}
void
MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ()
{
string targetMacro ( GetTargetMacro (module) );
string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
string libsMacro = GetLibsMacro ();
GenerateRules ();
string linker;
if ( module.cplusplus )
linker = "${host_gpp}";
else
linker = "${host_gcc}";
fprintf ( fMakefile, "%s: %s %s | %s\n",
targetMacro.c_str (),
objectsMacro.c_str (),
linkDepsMacro.c_str (),
GetDirectory(GetTargetFilename(module,NULL)).c_str () );
fprintf ( fMakefile, "\t$(ECHO_LD)\n" );
fprintf ( fMakefile,
"\t%s %s -o $@ %s %s\n\n",
linker.c_str (),
GetLinkerMacro ().c_str (),
objectsMacro.c_str (),
libsMacro.c_str () );
}
MingwKernelModuleHandler::MingwKernelModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwKernelModuleHandler::Process ()
{
GenerateKernelModuleTarget ();
}
void
MingwKernelModuleHandler::GenerateKernelModuleTarget ()
{
string targetMacro ( GetTargetMacro ( module ) );
string workingDirectory = GetWorkingDirectory ( );
string objectsMacro = GetObjectsMacro ( module );
string linkDepsMacro = GetLinkingDependenciesMacro ();
string libsMacro = GetLibsMacro ();
GenerateImportLibraryTargetIfNeeded ();
if ( module.non_if_data.compilationUnits.size () > 0 )
{
GenerateRules ();
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.GetBasePath ().c_str (),
cSep,
module.entrypoint.c_str (),
module.baseaddress.c_str () );
GenerateLinkerCommand ( dependencies,
"${gcc}",
linkerParameters,
objectsMacro,
libsMacro,
"-sections" );
}
else
{
GeneratePhonyTarget();
}
}
MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwStaticLibraryModuleHandler::Process ()
{
GenerateStaticLibraryModuleTarget ();
}
void
MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ()
{
GenerateRules ();
}
MingwObjectLibraryModuleHandler::MingwObjectLibraryModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwObjectLibraryModuleHandler::Process ()
{
GenerateObjectLibraryModuleTarget ();
}
void
MingwObjectLibraryModuleHandler::GenerateObjectLibraryModuleTarget ()
{
GenerateRules ();
}
MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwKernelModeDLLModuleHandler::Process ()
{
GenerateKernelModeDLLModuleTarget ();
}
void
MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ()
{
string targetMacro ( GetTargetMacro ( module ) );
string workingDirectory = GetWorkingDirectory ( );
stri
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?