📄 modulehandler.cpp
字号:
rIf.value.c_str() );
GenerateMacros (
"+=",
rIf.data,
NULL );
fprintf (
fMakefile,
"endif\n\n" );
}
}
}
void
MingwModuleHandler::CleanupCompilationUnitVector ( vector<CompilationUnit*>& compilationUnits )
{
for (size_t i = 0; i < compilationUnits.size (); i++)
delete compilationUnits[i];
}
void
MingwModuleHandler::GetModuleSpecificCompilationUnits ( vector<CompilationUnit*>& compilationUnits )
{
}
void
MingwModuleHandler::GenerateObjectMacros (
const char* assignmentOperation,
const IfableData& data,
const vector<LinkerFlag*>* linkerFlags )
{
size_t i;
const vector<CompilationUnit*>& compilationUnits = data.compilationUnits;
if ( compilationUnits.size () > 0 )
{
for ( i = 0; i < compilationUnits.size (); i++ )
{
CompilationUnit& compilationUnit = *compilationUnits[i];
if ( compilationUnit.IsFirstFile () )
{
fprintf ( fMakefile,
"%s := %s $(%s)\n",
objectsMacro.c_str(),
GetObjectFilename ( compilationUnit.GetFilename ( backend->intermediateDirectory ), NULL ).c_str (),
objectsMacro.c_str() );
}
}
fprintf (
fMakefile,
"%s %s",
objectsMacro.c_str (),
assignmentOperation );
for ( i = 0; i < compilationUnits.size(); i++ )
{
CompilationUnit& compilationUnit = *compilationUnits[i];
if ( !compilationUnit.IsFirstFile () )
{
fprintf (
fMakefile,
"%s%s",
( i%10 == 9 ? " \\\n\t" : " " ),
GetObjectFilename ( compilationUnit.GetFilename ( backend->intermediateDirectory ), NULL ).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() );
GenerateObjectMacros (
"+=",
rIf.data,
NULL );
fprintf (
fMakefile,
"endif\n\n" );
}
}
vector<CompilationUnit*> sourceCompilationUnits;
GetModuleSpecificCompilationUnits ( sourceCompilationUnits );
for ( i = 0; i < sourceCompilationUnits.size (); i++ )
{
fprintf (
fMakefile,
"%s += %s\n",
objectsMacro.c_str(),
GetObjectFilename ( sourceCompilationUnits[i]->GetFilename ( backend->intermediateDirectory ), NULL ).c_str () );
}
CleanupCompilationUnitVector ( sourceCompilationUnits );
}
string
MingwModuleHandler::GetPrecompiledHeaderFilename () const
{
const string& basePchFilename = module.pch->file.name + ".gch";
return PassThruCacheDirectory ( NormalizeFilename ( basePchFilename ),
backend->intermediateDirectory );
}
void
MingwModuleHandler::GenerateGccCommand (
const FileLocation* sourceFileLocation,
const string& extraDependencies,
const string& cc,
const string& cflagsMacro )
{
string sourceFilename = PassThruCacheDirectory ( sourceFileLocation );
string dependencies = sourceFilename;
if ( extraDependencies != "" )
dependencies += " " + extraDependencies;
if ( module.pch && use_pch )
dependencies += " " + GetPrecompiledHeaderFilename ();
/* WIDL generated headers may be used */
vector<string> rpcDependencies;
GetRpcHeaderDependencies ( rpcDependencies );
dependencies += " " + v2s ( rpcDependencies, 5 );
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string objectFilename = GetObjectFilename (
sourceFileLocation, &clean_files );
fprintf ( fMakefile,
"%s: %s | %s\n",
objectFilename.c_str (),
dependencies.c_str (),
GetDirectory ( 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* sourceFileLocation,
const string& cc,
const string& cflagsMacro )
{
string sourceFilename = PassThruCacheDirectory ( sourceFileLocation );
string dependencies = sourceFilename;
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string objectFilename = GetObjectFilename (
sourceFileLocation, &clean_files );
fprintf ( fMakefile,
"%s: %s | %s\n",
objectFilename.c_str (),
dependencies.c_str (),
GetDirectory ( 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* sourceFileLocation,
const string& nasmflagsMacro )
{
string sourceFilename = PassThruCacheDirectory ( sourceFileLocation );
string dependencies = sourceFilename;
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string objectFilename = GetObjectFilename (
sourceFileLocation, &clean_files );
fprintf ( fMakefile,
"%s: %s | %s\n",
objectFilename.c_str (),
dependencies.c_str (),
GetDirectory ( 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* sourceFileLocation,
const string& windresflagsMacro )
{
string sourceFilename = PassThruCacheDirectory ( sourceFileLocation );
string dependencies = sourceFilename;
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string objectFilename = GetObjectFilename ( sourceFileLocation, &clean_files );
string sourceFilenamePart = ReplaceExtension ( GetFilename ( sourceFilename ), "" );
string rciFilename = ros_temp + module.name + "." + sourceFilenamePart + ".rci.tmp";
string resFilename = ros_temp + module.name + "." + sourceFilenamePart + ".res.tmp";
if ( module.useWRC )
{
fprintf ( fMakefile,
"%s: %s $(WRC_TARGET) | %s\n",
objectFilename.c_str (),
dependencies.c_str (),
GetDirectory ( objectFilename ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_WRC)\n" );
fprintf ( fMakefile,
"\t${gcc} -xc -E -DRC_INVOKED ${%s} %s > %s\n",
windresflagsMacro.c_str (),
sourceFilename.c_str (),
rciFilename.c_str () );
fprintf ( fMakefile,
"\t$(Q)$(WRC_TARGET) ${%s} %s %s\n",
windresflagsMacro.c_str (),
rciFilename.c_str (),
resFilename.c_str () );
fprintf ( fMakefile,
"\t-@${rm} %s 2>$(NUL)\n",
rciFilename.c_str () );
fprintf ( fMakefile,
"\t${windres} %s -o $@\n",
resFilename.c_str () );
fprintf ( fMakefile,
"\t-@${rm} %s 2>$(NUL)\n",
resFilename.c_str () );
}
else
{
fprintf ( fMakefile,
"%s: %s $(WRC_TARGET) | %s\n",
objectFilename.c_str (),
dependencies.c_str (),
GetDirectory ( objectFilename ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_WRC)\n" );
fprintf ( fMakefile,
"\t${windres} $(%s) %s -o $@\n",
windresflagsMacro.c_str (),
sourceFilename.c_str () );
}
}
void
MingwModuleHandler::GenerateWinebuildCommands (
const FileLocation* sourceFileLocation )
{
string sourceFilename = PassThruCacheDirectory ( sourceFileLocation );
string dependencies = sourceFilename;
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string basename = GetBasename ( sourceFilename );
string def_file = PassThruCacheDirectory (
basename + ".spec.def",
backend->intermediateDirectory );
CLEAN_FILE(def_file);
string stub_file = PassThruCacheDirectory (
basename + ".stubs.c",
backend->intermediateDirectory );
CLEAN_FILE(stub_file)
fprintf ( fMakefile,
"%s: %s $(WINEBUILD_TARGET) | %s\n",
def_file.c_str (),
dependencies.c_str (),
GetDirectory ( def_file ).c_str () );
fprintf ( fMakefile, "\t$(ECHO_WINEBLD)\n" );
fprintf ( fMakefile,
"\t%s -o %s --def -E %s\n",
"$(Q)$(WINEBUILD_TARGET)",
def_file.c_str (),
sourceFilename.c_str () );
fprintf ( fMakefile,
"%s: %s $(WINEBUILD_TARGET)\n",
stub_file.c_str (),
sourceFilename.c_str () );
fprintf ( fMakefile, "\t$(ECHO_WINEBLD)\n" );
fprintf ( fMakefile,
"\t%s -o %s --pedll %s\n",
"$(Q)$(WINEBUILD_TARGET)",
stub_file.c_str (),
sourceFilename.c_str () );
}
string
MingwModuleHandler::GetWidlFlags ( const CompilationUnit& compilationUnit )
{
return compilationUnit.GetSwitches ();
}
string
MingwModuleHandler::GetRpcServerHeaderFilename ( string basename ) const
{
return PassThruCacheDirectory ( basename + "_s.h",
backend->intermediateDirectory );
}
void
MingwModuleHandler::GenerateWidlCommandsServer (
const CompilationUnit& compilationUnit,
const string& widlflagsMacro )
{
FileLocation* sourceFileLocation = compilationUnit.GetFilename ( backend->intermediateDirectory );
string filename = sourceFileLocation->filename;
string dependencies = filename;
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string basename = GetBasename ( filename );
string generatedHeaderFilename = GetRpcServerHeaderFilename ( basename );
CLEAN_FILE(generatedHeaderFilename);
string generatedServerFilename = PassThruCacheDirectory (
basename + "_s.c",
backend->intermediateDirectory );
CLEAN_FILE(generatedServerFilename);
fprintf ( fMakefile,
"%s %s: %s $(WIDL_TARGET) | %s\n",
generatedServerFilename.c_str (),
generatedHeaderFilename.c_str (),
dependencies.c_str (),
GetDirectory ( 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 (),
generatedHeaderFilename.c_str (),
generatedServerFilename.c_str (),
filename.c_str () );
}
string
MingwModuleHandler::GetRpcClientHeaderFilename ( string basename ) const
{
return PassThruCacheDirectory ( basename + "_c.h",
backend->intermediateDirectory );
}
string
MingwModuleHandler::GetIdlHeaderFilename ( string basename ) const
{
return PassThruCacheDirectory ( basename + ".h",
backend->intermediateDirectory );
}
void
MingwModuleHandler::GenerateWidlCommandsEmbeddedTypeLib (
const CompilationUnit& compilationUnit,
const string& widlflagsMacro )
{
FileLocation* sourceFileLocation = compilationUnit.GetFilename ( backend->intermediateDirectory );
string filename = sourceFileLocation->filename;
string dependencies = filename;
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string basename = GetBasename ( filename );
string EmbeddedTypeLibFilename = PassThruCacheDirectory (
basename + ".tlb",
backend->intermediateDirectory );
fprintf ( fMakefile,
"%s: %s $(WIDL_TARGET) | %s\n",
GetTargetMacro ( module ).c_str (),
dependencies.c_str (),
GetDirectory ( 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 (),
EmbeddedTypeLibFilename.c_str(),
filename.c_str () );
}
void
MingwModuleHandler::GenerateWidlCommandsClient (
const CompilationUnit& compilationUnit,
const string& widlflagsMacro )
{
FileLocation* sourceFileLocation = compilationUnit.GetFilename ( backend->intermediateDirectory );
string filename = sourceFileLocation->filename;
string dependencies = filename;
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string basename = GetBasename ( filename );
string generatedHeaderFilename = GetRpcClientHeaderFilename ( basename );
CLEAN_FILE(generatedHeaderFilename);
string generatedClientFilename = PassThruCacheDirectory (
basename + "_c.c",
backend->intermediateDirectory );
CLEAN_FILE(generatedClientFilename);
fprintf ( fMakefile,
"%s %s: %s $(WIDL_TARGET) | %s\n",
generatedClientFilename.c_str (),
generatedHeaderFilename.c_str (),
dependencies.c_str (),
GetDirectory ( 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 (),
generatedHeaderFilename.c_str (),
generatedClientFilename.c_str (),
filename.c_str () );
}
void
MingwModuleHandler::GenerateWidlCommandsIdlHeader (
const CompilationUnit& compilationUnit,
const string& widlflagsMacro )
{
FileLocation* sourceFileLocation = compilationUnit.GetFilename ( backend->intermediateDirectory );
string filename = sourceFileLocation->filename;
string dependencies = filename;
dependencies += " " + NormalizeFilename ( module.xmlbuildFile );
string basename = GetBasename ( filename );
string generatedHeaderFilename = GetIdlHeaderFilename ( basename );
CLEAN_FILE(generatedHeaderFilename);
fprintf ( fMakefile,
"%s: %s $(WIDL_TARGET) | %s\n",
generatedHeaderFilename.c_str (),
dependencies.c_str (),
GetDirectory ( generatedHeaderFilename ).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 (),
generatedHeaderFilename.c_str (),
filename.c_str () );
}
void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -