📄 msvcmaker.cpp
字号:
{
const string& include = includes[i];
if ( strpbrk ( include.c_str(), "[\\\"]" ) || !strncmp ( include.c_str(), "../", 3 ) )
{
fprintf ( OUT, " /I \"%s\"", include.c_str() );
}
else
{
fprintf ( OUT, " /I %s", include.c_str() );
}
}
}
fprintf ( OUT, " /I \".\"" );
for ( StringSet::const_iterator it2=defines.begin(); it2!=defines.end(); it2++ )
{
const string& define = *it2;
if ( strpbrk ( define.c_str(), "[\\\"]" ) )
{
fprintf ( OUT, " /D \"%s\"", define.c_str() );
}
else
{
fprintf ( OUT, " /D %s", define.c_str() );
}
}
if ( wine ) fprintf ( OUT, " /D inline=__inline" );
if ( 0 && wine ) fprintf ( OUT, " /D \"__STDC__\"" );
fprintf ( OUT, lib ? " /YX" : " /FR" );
fprintf ( OUT, " /FD" );
if ( debug ) fprintf ( OUT, " /GZ" );
if ( debug && lib ) fprintf ( OUT, " " );
fprintf ( OUT, " /c" );
if ( !no_cpp ) fprintf ( OUT, " /TP" );
fprintf ( OUT, "\r\n" );
if ( debug )
{
if ( dll )
{
fprintf ( OUT, "# SUBTRACT CPP /X /YX\r\n" );
fprintf ( OUT, "# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\r\n" );
fprintf ( OUT, "# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\r\n" );
}
fprintf ( OUT, "# ADD BASE RSC /l 0x41d /d \"_DEBUG\"\r\n" );
fprintf ( OUT, "# ADD RSC /l 0x41d" );
/*if ( wine )*/
{
for ( i = 0; i < includes.size(); i++ )
{
fprintf ( OUT, " /i \"%s\"", includes[i].c_str() );
}
}
for ( StringSet::const_iterator it3=defines.begin(); it3!=defines.end(); it3++ )
{
fprintf ( OUT, " /D \"%s\"", it3->c_str() );
}
fprintf ( OUT, " /d \"_DEBUG\"\r\n" );
}
else
{
if ( dll )
{
fprintf ( OUT, "# SUBTRACT CPP /YX\r\n" );
fprintf ( OUT, "# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\r\n" );
fprintf ( OUT, "# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\r\n" );
}
fprintf ( OUT, "# ADD BASE RSC /l 0x41d /d \"NDEBUG\"\r\n" );
fprintf ( OUT, "# ADD RSC /l 0x41d" );
if ( wine )
{
for ( i = 0; i < includes.size(); i++ )
fprintf ( OUT, " /i \"%s\"", includes[i].c_str() );
}
for ( StringSet::const_iterator it4=defines.begin(); it4!=defines.end(); it4++ )
{
fprintf ( OUT, " /D \"%s\"", it4->c_str() );
}
fprintf ( OUT, "/d \"NDEBUG\"\r\n" );
}
fprintf ( OUT, "BSC32=bscmake.exe\r\n" );
fprintf ( OUT, "# ADD BASE BSC32 /nologo\r\n" );
fprintf ( OUT, "# ADD BSC32 /nologo\r\n" );
if ( exe || dll )
{
fprintf ( OUT, "LINK32=link.exe\r\n" );
fprintf ( OUT, "# ADD BASE LINK32 " );
for ( i = 0; i < libraries.size(); i++ )
{
fprintf ( OUT, "%s ", libraries[i].c_str() );
}
fprintf ( OUT, " /nologo" );
if ( dll ) fprintf ( OUT, " /dll" );
if ( console ) fprintf ( OUT, " /subsystem:console" );
if ( debug ) fprintf ( OUT, " /debug" );
fprintf ( OUT, " /machine:I386" );
if ( debug ) fprintf ( OUT, " /pdbtype:sept" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "# ADD LINK32" );
fprintf ( OUT, " /nologo" );
// TODO FIXME - do we need their kludge?
//if ( module.name == "ntdll" ) fprintf ( OUT, " libcmt.lib" ); // FIXME: Kludge
for ( i = 0; i < imports.size(); i++ )
{
const string& import = imports[i];
if ( import != "msvcrt" )
fprintf ( OUT, " %s.lib", import.c_str() );
}
if ( dll ) fprintf ( OUT, " /dll" );
if ( console ) fprintf ( OUT, " /subsystem:console" );
if ( debug ) fprintf ( OUT, " /debug" );
fprintf ( OUT, " /machine:I386" );
// TODO FIXME - do we need their kludge?
//if ( module.name == "ntdll" ) fprintf ( OUT, " /nodefaultlib" ); // FIXME: Kludge
if ( dll ) fprintf ( OUT, " /def:\"%s.def\"", module.name.c_str() );
if (( dll ) && ( module_type == ".cpl")) fprintf ( OUT, " /out:\"Win32\\%s%s\"", module.name.c_str(), module_type.c_str() );
if ( debug ) fprintf ( OUT, " /pdbtype:sept" );
fprintf ( OUT, "\r\n" );
}
else
{
fprintf ( OUT, "LIB32=link.exe -lib\r\n" );
fprintf ( OUT, "# ADD BASE LIB32 /nologo\r\n" );
fprintf ( OUT, "# ADD LIB32 /nologo\r\n" );
}
}
if ( cfgs.size() != 0 )
{
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "!ENDIF \r\n" );
fprintf ( OUT, "\r\n" );
}
#if 0
if ( module.name == "winebuild" )
{
fprintf ( OUT, "# Begin Special Build Tool\r\n" );
fprintf ( OUT, "SOURCE=\"$(InputPath)\"\r\n" );
fprintf ( OUT, "PostBuild_Desc=Copying wine.dll and wine_unicode.dll ...\r\n" );
fprintf ( OUT, "PostBuild_Cmds=" );
fprintf ( OUT, "copy ..\\..\\library\\%s\\wine.dll $(OutDir)\t",
output_dir.c_str() );
fprintf ( OUT, "copy ..\\..\\unicode\\%s\\wine_unicode.dll $(OutDir)\r\n",
output_dir.c_str() );
fprintf ( OUT, "# End Special Build Tool\r\n" );
}
#endif
fprintf ( OUT, "# Begin Target\r\n" );
fprintf ( OUT, "\r\n" );
for ( i = 0; i < cfgs.size(); i++ )
{
fprintf ( OUT, "# Name \"%s\"\r\n", cfgs[i].c_str() );
}
fprintf ( OUT, "# Begin Group \"Source Files\"\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\r\n" );
for ( size_t isrcfile = 0; isrcfile < source_files.size(); isrcfile++ )
{
string source_file = DosSeparator(source_files[isrcfile]);
if ( strncmp ( source_file.c_str(), ".\\", 2 ) )
{
source_file = string(".\\") + source_file;
}
#if 0
if ( !strcmp ( &source_file[source_file.size()-5], ".spec" ) )
{
string basename = string ( source_file.c_str(), source_file.size() - 5 );
// TODO FIXME - not sure what this is doing? wine hack maybe?
//if ( basename !~ /\..{1,3}$/; ) basename += string(".dll");
string dbg_c_file = basename + ".dbg.c";
fprintf ( OUT, "# Begin Source File\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "SOURCE=%s\r\n", dbg_c_file.c_str() );
fprintf ( OUT, "# End Source File\r\n" );
}
#endif
fprintf ( OUT, "# Begin Source File\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "SOURCE=%s\r\n", source_file.c_str() );
if ( !strcmp ( &source_file[source_file.size()-5], ".spec" ) )
{
#if 0
string basename = string ( source_file.c_str(), source_file.size() - 5 );
string spec_file = source_file;
string def_file = basename + ".def";
// TODO FIXME - not sure what this is doing? wine hack maybe?
//if ( basename !~ /\..{1,3}$/; ) basename += ".dll";
string dbg_file = basename + ".dbg";
string dbg_c_file = basename + ".dbg.c";
string srcdir = "."; // FIXME: Is this really always correct?
fprintf ( OUT, "# Begin Custom Build\r\n" );
fprintf ( OUT, "InputPath=%s\r\n", spec_file.c_str() );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "BuildCmds= \\\r\n" );
fprintf ( OUT, "\t..\\..\\tools\\winebuild\\%s\\winebuild.exe --def %s > %s \\\r\n",
output_dir.c_str(),
spec_file.c_str(),
def_file.c_str() );
if ( module.name == "ntdll" )
{
int n = 0;
for ( i = 0; i < c_srcs.size(); i++ )
{
const string& c_src = c_srcs[i];
if(n++ > 0)
{
fprintf ( OUT, "\techo %s >> %s \\\r\n", c_src.c_str(), dbg_file.c_str() );
}
else
{
fprintf ( OUT, "\techo %s > %s \\\r\n", c_src.c_str(), dbg_file.c_str() );
}
}
fprintf ( OUT, "\t..\\..\\tools\\winebuild\\%s\\winebuild.exe",
output_dir.c_str() );
fprintf ( OUT, " -o %s --debug -C%s %s \\\r\n",
dbg_c_file.c_str(),
srcdir.c_str(),
dbg_file.c_str() );
}
else
{
string sc_srcs;
for ( i = 0; i < c_srcs.size(); i++ )
{
const string& c_src = c_srcs[i];
if ( !strcmp ( &c_src[c_src.size()-2], ".c" ) )
{
if ( sc_srcs.size() )
sc_srcs += " ";
sc_srcs += c_src;
}
}
fprintf ( OUT, "\t..\\..\\tools\\winebuild\\%s\\winebuild.exe",
output_dir.c_str() );
fprintf ( OUT, " -o %s --debug -C%s %s \\\r\n",
dbg_c_file.c_str(),
srcdir.c_str(),
sc_srcs.c_str() );
}
fprintf ( OUT, "\t\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "\"%s\" : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\r\n", def_file.c_str() );
fprintf ( OUT, " $(BuildCmds)\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "\"%s\" : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\r\n", dbg_c_file.c_str() );
fprintf ( OUT, " $(BuildCmds)\r\n" );
fprintf ( OUT, "# End Custom Build\r\n" );
#endif
}
/*else if ( source_file =~ /([^\\]*?\.h)$/ )
{
my $h_file = $1;
foreach my $cfg (@cfgs) {
if($#cfgs == 0) {
# Nothing
} elsif($n == 0) {
fprintf ( OUT, "!IF \"$(CFG)\" == \"$cfg\"\r\n" );
fprintf ( OUT, "\r\n" );
} else {
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "!ELSEIF \"$(CFG)\" == \"$cfg\"\r\n" );
fprintf ( OUT, "\r\n" );
}
$output_dir = $cfg;
$output_dir =~ s/^$project - //;
$output_dir =~ s/ /_/g;
$output_dir =~ s/C\+\+/Cxx/g;
if($output_prefix_dir) {
$output_dir = "$output_prefix_dir\\$output_dir" );
}
fprintf ( OUT, "# Begin Custom Build\r\n" );
fprintf ( OUT, "OutDir=%s\r\n", output_dir.c_str() );
fprintf ( OUT, "InputPath=%s\r\n", source_file.c_str() );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "\"$(OutDir)\\wine\\%s\" : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\r\n", h_file.c_str() );
fprintf ( OUT, "\tcopy \"$(InputPath)\" \"$(OutDir)\\wine\"\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "# End Custom Build\r\n" );
}
if ( cfgs.size() != 0)
{
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "!ENDIF \r\n" );
fprintf ( OUT, "\r\n" );
}
}*/
fprintf ( OUT, "# End Source File\r\n" );
}
fprintf ( OUT, "# End Group\r\n" );
fprintf ( OUT, "# Begin Group \"Header Files\"\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\r\n" );
for ( i = 0; i < header_files.size(); i++ )
{
const string& header_file = header_files[i];
fprintf ( OUT, "# Begin Source File\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "SOURCE=.\\%s\r\n", header_file.c_str() );
fprintf ( OUT, "# End Source File\r\n" );
}
fprintf ( OUT, "# End Group\r\n" );
fprintf ( OUT, "# Begin Group \"Resource Files\"\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\r\n" );
/* for ( i = 0; i < resource_files.size(); i++ )
{
const string& resource_file = resource_files[i];
fprintf ( OUT, "# Begin Source File\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "SOURCE=.\\%s\r\n", resource_file.c_str() );
fprintf ( OUT, "# End Source File\r\n" );
}
*/ fprintf ( OUT, "# End Group\r\n" );
fprintf ( OUT, "# End Target\r\n" );
fprintf ( OUT, "# End Project\r\n" );
fclose(OUT);
}
void
MSVCBackend::_generate_dsw_header ( FILE* OUT )
{
fprintf ( OUT, "Microsoft Developer Studio Workspace File, Format Version 6.00\r\n" );
fprintf ( OUT, "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r\n" );
fprintf ( OUT, "\r\n" );
}
void
MSVCBackend::_generate_dsw_project (
FILE* OUT,
const Module& module,
std::string dsp_file,
const std::vector<Dependency*>& dependencies )
{
dsp_file = DosSeparator ( std::string(".\\") + dsp_file );
// TODO FIXME - must they be sorted?
//@dependencies = sort(@dependencies);
fprintf ( OUT, "###############################################################################\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "Project: \"%s\"=%s - Package Owner=<4>\r\n", module.name.c_str(), dsp_file.c_str() );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "Package=<5>\r\n" );
fprintf ( OUT, "{{{\r\n" );
fprintf ( OUT, "}}}\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "Package=<4>\r\n" );
fprintf ( OUT, "{{{\r\n" );
for ( size_t i = 0; i < dependencies.size(); i++ )
{
Dependency& dependency = *dependencies[i];
fprintf ( OUT, " Begin Project Dependency\r\n" );
fprintf ( OUT, " Project_Dep_Name %s\r\n", dependency.module.name.c_str() );
fprintf ( OUT, " End Project Dependency\r\n" );
}
fprintf ( OUT, "}}}\r\n" );
fprintf ( OUT, "\r\n" );
}
void
MSVCBackend::_generate_dsw_footer ( FILE* OUT )
{
fprintf ( OUT, "###############################################################################\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "Global:\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "Package=<5>\r\n" );
fprintf ( OUT, "{{{\r\n" );
fprintf ( OUT, "}}}\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "Package=<3>\r\n" );
fprintf ( OUT, "{{{\r\n" );
fprintf ( OUT, "}}}\r\n" );
fprintf ( OUT, "\r\n" );
fprintf ( OUT, "###############################################################################\r\n" );
fprintf ( OUT, "\r\n" );
}
void
MSVCBackend::_generate_wine_dsw ( FILE* OUT )
{
_generate_dsw_header(OUT);
// TODO FIXME - is it necessary to sort them?
for ( size_t i = 0; i < ProjectNode.modules.size(); i++ )
{
Module& module = *ProjectNode.modules[i];
std::string dsp_file = DspFileName ( module );
// TODO FIXME - more wine hacks?
/*if ( module.name == "gdi32" )
{
for ( size_t idir = 0; idir < gdi32_dirs.size(); idir++ )
{
string dir2 = gdi32_dirs[idir];
$dir2 =~ s%^.*?/([^/]+)$%$1%;
dependencies.push_back ( Replace ( "gdi32_" + dir2, "/", "_" ) );
}
}*/
_generate_dsw_project ( OUT, module, dsp_file, module.dependencies );
}
_generate_dsw_footer ( OUT );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -