⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msvcmaker.cpp

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{
				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 + -