enhance generated msvc projects - patch by Brezenbak Modified: trunk/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp _____
Modified: trunk/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp --- trunk/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp 2005-11-29 02:40:18 UTC (rev 19742) +++ trunk/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp 2005-11-29 06:24:56 UTC (rev 19743) @@ -56,6 +56,7 @@
bool lib = (module.type == ObjectLibrary) || (module_type == ".lib") || (module_type == ".a"); bool dll = (module_type == ".dll") || (module_type == ".cpl"); bool exe = (module_type == ".exe"); + bool sys = (module_type == ".sys"); // TODO FIXME - need more checks here for 'sys' and possibly 'drv'?
bool console = exe && (module.type == Win32CUI); @@ -172,6 +173,7 @@ }
string default_cfg = cfgs.back(); + string include_string;
fprintf ( OUT, "<?xml version=\"1.0\" encoding = \"Windows-1252\"?>\r\n" ); fprintf ( OUT, "<VisualStudioProject\r\n" ); @@ -232,7 +234,9 @@ { if ( multiple_includes ) fprintf ( OUT, ";" ); + fprintf ( OUT, "%s", include.c_str() ); + include_string += " /I " + include; multiple_includes = true; } } @@ -293,7 +297,7 @@ { fprintf ( OUT, "\t\t\t<Tool\r\n" ); fprintf ( OUT, "\t\t\t\tName="VCLibrarianTool"\r\n" ); - fprintf ( OUT, "\t\t\t\tOutputFile="$(OutDir)/%s%s"/>\r\n", module.name.c_str(), module_type.c_str() ); + fprintf ( OUT, "\t\t\t\tOutputFile="$(OutDir)/%s.lib"/>\r\n", module.name.c_str() ); } else { @@ -316,7 +320,32 @@ if ( debug ) fprintf ( OUT, "\t\t\t\tProgramDatabaseFile="$(OutDir)/%s.pdb"\r\n", module.name.c_str() );
- fprintf ( OUT, "\t\t\t\tSubSystem="%d"\r\n", console ? 1 : 2 ); + if ( sys ) + { + fprintf ( OUT, "\t\t\t\tAdditionalOptions=" /DRIVER /ALIGN:0x20 /subsystem:NATIVE /SECTION:INIT,D /FORCE:MULTIPLE /IGNORE:4001,4037,4039,4065,4070,4078,4087,4089,4096"\r\n" ); + fprintf ( OUT, "\t\t\t\tIgnoreAllDefaultLibraries="TRUE"\r\n" ); + fprintf ( OUT, "\t\t\t\tEntryPointSymbol="%s"\r\n", module.entrypoint == "" ? "DriverEntry" : module.entrypoint.c_str ()); + fprintf ( OUT, "\t\t\t\tBaseAddress="%s"\r\n", module.baseaddress == "" ? "0x10000" : module.baseaddress.c_str ()); + } + else if ( exe ) + { + if( module.non_if_data.compilationUnits.size () > 0 ) /* native apps */ + { + fprintf ( OUT, "\t\t\t\tAdditionalOptions=" /SUBSYSTEM:NATIVE /SECTION:INIT,D /ALIGN:4096 /FORCE:MULTIPLE"\r\n" ); + fprintf ( OUT, "\t\t\t\tIgnoreAllDefaultLibraries="TRUE"\r\n" ); + } + else /* non native apps */ + { + fprintf ( OUT, "\t\t\t\tSubSystem="%d"\r\n", console ? 1 : 2 ); + } + fprintf ( OUT, "\t\t\t\tEntryPointSymbol="%s"\r\n", module.entrypoint.c_str ()); + fprintf ( OUT, "\t\t\t\tBaseAddress="%s"\r\n", module.baseaddress.c_str ()); + } + else if ( dll) + { + fprintf ( OUT, "\t\t\t\tEntryPointSymbol="%s"\r\n", module.entrypoint == "" ? "DllMain" : module.entrypoint.c_str ()); + fprintf ( OUT, "\t\t\t\tBaseAddress="%s"\r\n", module.baseaddress == "" ? "0x40000" : module.baseaddress.c_str ()); + } fprintf ( OUT, "\t\t\t\tTargetMachine="%d"/>\r\n", 1 ); } @@ -364,26 +393,33 @@ fprintf ( OUT, "\t\t\tFilter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;S">\r\n" ); for ( size_t isrcfile = 0; isrcfile < source_files.size(); isrcfile++ ) { - const string& source_file = DosSeparator(source_files[isrcfile]); + string source_file = DosSeparator(source_files[isrcfile]); fprintf ( OUT, "\t\t\t<File\r\n" ); fprintf ( OUT, "\t\t\t\tRelativePath="%s">\r\n", source_file.c_str() );
- if (configuration.VSProjectVersion < "8.00") { - if (source_file.at(source_file.size() - 1) == 'S') { - for ( size_t iconfig = 0; iconfig < cfgs.size(); iconfig++ ) - { - std::string& config = cfgs[iconfig]; - fprintf ( OUT, "\t\t\t\t<FileConfiguration\r\n" ); - fprintf ( OUT, "\t\t\t\t\tName="" ); - fprintf ( OUT, config.c_str()); - fprintf ( OUT, "|Win32">\r\n" ); - fprintf ( OUT, "\t\t\t\t\t<Tool\r\n" ); - fprintf ( OUT, "\t\t\t\t\t\tName="VCCustomBuildTool"\r\n" ); - fprintf ( OUT, "\t\t\t\t\t\tCommandLine="cl /E "$(InputPath)" | as -o "$(OutDir)\$(InputName).obj""\r\n" ); - fprintf ( OUT, "\t\t\t\t\t\tOutputs="$(OutDir)\$(InputName).obj"/>\r\n" ); - fprintf ( OUT, "\t\t\t\t</FileConfiguration>\r\n" ); - } + source_file.erase(0,2); + source_file = _replace_str(source_file, "\", "-"); + string src_string = source_file.substr(0, source_file.find(".")); + for ( size_t iconfig = 0; iconfig < cfgs.size(); iconfig++ ) + { + std::string& config = cfgs[iconfig]; + fprintf ( OUT, "\t\t\t\t<FileConfiguration\r\n" ); + fprintf ( OUT, "\t\t\t\t\tName="" ); + fprintf ( OUT, config.c_str() ); + fprintf ( OUT, "|Win32">\r\n" ); + fprintf ( OUT, "\t\t\t\t\t<Tool\r\n" ); + if (source_file.at(source_file.size() - 1) == 'c' || source_file.find(".cpp") != string::npos) + { + fprintf ( OUT, "\t\t\t\t\t\tName="VCCLCompilerTool"\r\n" ); + fprintf ( OUT, "\t\t\t\t\t\tObjectFile="$(OutDir)\%s.obj"/>\r\n", src_string.c_str()); } + else if (configuration.VSProjectVersion < "8.00" && (source_file.find(".asm") != string::npos || tolower(source_file.at(source_file.size() - 1)) == 's')) + { + fprintf ( OUT, "\t\t\t\t\t\tName="VCCustomBuildTool"\r\n" ); + fprintf ( OUT, "\t\t\t\t\t\tCommandLine="cl /E "$(InputPath)" %s /D__ASM__ | as -o "$(OutDir)\%s.obj""\r\n",include_string.c_str(), src_string.c_str() ); + fprintf ( OUT, "\t\t\t\t\t\tOutputs="$(OutDir)\%s.obj"/>\r\n",src_string.c_str() ); + } + fprintf ( OUT, "\t\t\t\t</FileConfiguration>\r\n" ); } fprintf ( OUT, "\t\t\t</File>\r\n" ); }