From b9e2cd6419d38fbcbbd4106465410eabc6e008c9 Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Thu, 3 Dec 2009 16:09:09 +0000 Subject: [PATCH] - Initial re-architecture of the msvc backend. - Split the MSVCBackend class into it's respective worker objects : - * Use an abstract ProjMaker base class which we can now use to better implement support for future VS releases - * Move sln creation into its own class - Don't create the .user files anymore, they're not required for our use. - Remove support for Visual Studio 6, Visual Studio 2002 and Visual Studio 2003 Although I haven't tested it, I'm 99.9% sure this breaks 'make msvc#' so DON'T RUN IT yet unless you want your vcproj files destroyed. svn path=/trunk/; revision=44377 --- reactos/tools/rbuild/backend/msvc/msvc.cpp | 164 +++++--- reactos/tools/rbuild/backend/msvc/msvc.h | 158 +++++--- .../tools/rbuild/backend/msvc/projmaker.cpp | 226 +++++++++++ .../tools/rbuild/backend/msvc/slnmaker.cpp | 172 ++++++++ .../tools/rbuild/backend/msvc/vcprojmaker.cpp | 367 ++---------------- .../rbuild/backend/msvc/vcxprojmaker.cpp | 196 +++------- reactos/tools/rbuild/rbuild.h | 2 +- reactos/tools/rbuild/rbuild.mak | 11 +- reactos/tools/rbuild/rbuild.vcproj | 26 +- 9 files changed, 705 insertions(+), 617 deletions(-) create mode 100644 reactos/tools/rbuild/backend/msvc/projmaker.cpp create mode 100644 reactos/tools/rbuild/backend/msvc/slnmaker.cpp diff --git a/reactos/tools/rbuild/backend/msvc/msvc.cpp b/reactos/tools/rbuild/backend/msvc/msvc.cpp index 08c0479f6b7..0c0b7dcd5a1 100644 --- a/reactos/tools/rbuild/backend/msvc/msvc.cpp +++ b/reactos/tools/rbuild/backend/msvc/msvc.cpp @@ -4,6 +4,7 @@ * Copyright (C) 2005 Steven Edwards * Copyright (C) 2005 Royce Mitchell * Copyright (C) 2006 Christoph von Wittich + * Copyright (C) 2009 Ged Murphy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,6 +49,31 @@ static class MSVCFactory : public Backend::Factory } factory; +MSVCConfiguration::MSVCConfiguration ( const OptimizationType optimization, const HeadersType headers, const std::string &name ) +{ + this->optimization = optimization; + this->headers = headers; + if ( name != "" ) + this->name = name; + else + { + std::string headers_name; + if ( headers == MSVCHeaders ) + headers_name = ""; + else + headers_name = " - ReactOS headers"; + if ( optimization == Debug ) + this->name = "Debug" + headers_name; + else if ( optimization == Release ) + this->name = "Release" + headers_name; + else if ( optimization == Speed ) + this->name = "Speed" + headers_name; + else if ( optimization == RosBuild ) + this->name = "RosBuild"; + else + this->name = "Unknown" + headers_name; + } +} MSVCBackend::MSVCBackend(Project &project, Configuration& configuration) : Backend(project, configuration) @@ -89,28 +115,16 @@ void MSVCBackend::Process() } string filename_sln ( ProjectNode.name ); - if ( configuration.VSProjectVersion == "6.00" ) - filename_sln += "_auto.dsw"; - else - filename_sln += "_auto.sln"; - + filename_sln += "_auto.sln"; printf ( "Creating MSVC workspace: %s\n", filename_sln.c_str() ); + // Write out the project files ProcessModules(); - m_slnFile = fopen ( filename_sln.c_str(), "wb" ); - if ( !m_slnFile ) - { - printf ( "Could not create file '%s'.\n", filename_sln.c_str() ); - return; - } + // Write the solution file + SlnMaker slnMaker( configuration, ProjectNode, m_configurations, filename_sln ); + slnMaker._generate_sln ( _get_solution_version(), _get_studio_version() ); - if ( configuration.VSProjectVersion == "6.00" ) - _generate_wine_dsw ( m_slnFile ); - else - _generate_sln ( m_slnFile ); - - fclose ( m_slnFile ); printf ( "Done.\n" ); } @@ -122,12 +136,14 @@ void MSVCBackend::ProcessModules() module.guid = _gen_guid(); - if (configuration.VSProjectVersion == "6.00") - _generate_dsp ( module ); - else if (configuration.VSProjectVersion == "10.00") - _generate_vcxproj ( module ); + ProjMaker *projMaker; + + if (configuration.VSProjectVersion == "10.00") + projMaker = new VCXProjMaker( configuration, m_configurations, "test" ); else - _generate_vcproj ( module ); + projMaker = new VCProjMaker( configuration, m_configurations, "test" ); + + projMaker->_generate_proj_file ( module ); } } @@ -224,14 +240,6 @@ void MSVCBackend::OutputFolders() #endif } -std::string -MSVCBackend::OptFileName ( const Module& module ) const -{ - return FixSeparatorForSystemCommand( - ReplaceExtension ( module.output->relative_path + "\\" + module.output->name, "_" + _get_vc_dir() + "_auto.opt" ) - ); -} - std::string MSVCBackend::SuoFileName ( const Module& module ) const { @@ -240,14 +248,6 @@ MSVCBackend::SuoFileName ( const Module& module ) const ); } -std::string -MSVCBackend::DswFileName ( const Module& module ) const -{ - return FixSeparatorForSystemCommand( - ReplaceExtension ( module.output->relative_path + "\\" + module.output->name, "_auto.dsw" ) - ); -} - std::string MSVCBackend::SlnFileName ( const Module& module ) const { @@ -264,14 +264,6 @@ MSVCBackend::NcbFileName ( const Module& module ) const ); } -std::string -MSVCBackend::DspFileName ( const Module& module ) const -{ - return FixSeparatorForSystemCommand( - ReplaceExtension ( module.output->relative_path + "\\" + module.output->name, "_auto.dsp" ) - ); -} - std::string MSVCBackend::VcprojFileName ( const Module& module ) const { @@ -282,20 +274,12 @@ MSVCBackend::VcprojFileName ( const Module& module ) const std::string MSVCBackend::_get_vc_dir ( void ) const { - if ( configuration.VSProjectVersion == "6.00" ) - return "vc6"; - else if ( configuration.VSProjectVersion == "7.00" ) - return "vc70"; - else if ( configuration.VSProjectVersion == "7.10" ) - return "vc71"; - else if ( configuration.VSProjectVersion == "8.00" ) + if ( configuration.VSProjectVersion == "8.00" ) return "vc8"; else if ( configuration.VSProjectVersion == "10.00" ) return "vc10"; else /* default to VS2008 */ return "vc9"; - - } void @@ -404,9 +388,6 @@ MSVCBackend::_clean_project_files ( void ) string basepath = module.output->relative_path; remove ( NcbFileName ( module ).c_str () ); - remove ( DspFileName ( module ).c_str () ); - remove ( DswFileName ( module ).c_str () ); - remove ( OptFileName ( module ).c_str () ); remove ( SlnFileName ( module ).c_str () ); remove ( SuoFileName ( module ).c_str () ); remove ( VcprojFileName ( module ).c_str () ); @@ -414,12 +395,12 @@ MSVCBackend::_clean_project_files ( void ) string username = getenv ( "USERNAME" ); string computername = getenv ( "COMPUTERNAME" ); string vcproj_file_user = ""; - +#if 0 if ((computername != "") && (username != "")) vcproj_file_user = VcprojFileName ( module ) + "." + computername + "." + username + ".user"; remove ( vcproj_file_user.c_str () ); - +#endif _get_object_files ( module, out ); _get_def_files ( module, out ); for ( size_t j = 0; j < out.size (); j++) @@ -430,10 +411,8 @@ MSVCBackend::_clean_project_files ( void ) } string filename_sln = ProjectNode.name + ".sln"; - string filename_dsw = ProjectNode.name + ".dsw"; remove ( filename_sln.c_str () ); - remove ( filename_dsw.c_str () ); } bool @@ -475,3 +454,64 @@ MSVCBackend::_install_files (const std::string& vcdir, const::string& config) printf ("Installed File :'%s'\n",installdir.c_str () ); } } + +std::string +MSVCBackend::_get_solution_version ( void ) +{ + string version; + + if (configuration.VSProjectVersion.empty()) + configuration.VSProjectVersion = MS_VS_DEF_VERSION; + + else if (configuration.VSProjectVersion == "8.00") + version = "9.00"; + + else if (configuration.VSProjectVersion == "9.00") + version = "10.00"; + + else if (configuration.VSProjectVersion == "10.00") + version = "11.00"; + + return version; +} + +std::string +MSVCBackend::_get_studio_version ( void ) +{ + string version; + + if (configuration.VSProjectVersion.empty()) + configuration.VSProjectVersion = MS_VS_DEF_VERSION; + + else if (configuration.VSProjectVersion == "8.00") + version = "2005"; + + else if (configuration.VSProjectVersion == "9.00") + version = "2008"; + + else if (configuration.VSProjectVersion == "10.00") + version = "2010"; + + return version; +} + +const Property* +MSVCBackend::_lookup_property ( const Module& module, const std::string& name ) const +{ + std::map::const_iterator p; + + /* Check local values */ + p = module.non_if_data.properties.find(name); + + if ( p != module.non_if_data.properties.end() ) + return p->second; + + // TODO FIXME - should we check local if-ed properties? + p = module.project.non_if_data.properties.find(name); + + if ( p != module.project.non_if_data.properties.end() ) + return p->second; + + // TODO FIXME - should we check global if-ed properties? + return NULL; +} diff --git a/reactos/tools/rbuild/backend/msvc/msvc.h b/reactos/tools/rbuild/backend/msvc/msvc.h index 8f3f3a88ec3..69050cbba03 100644 --- a/reactos/tools/rbuild/backend/msvc/msvc.h +++ b/reactos/tools/rbuild/backend/msvc/msvc.h @@ -25,6 +25,10 @@ #include "../backend.h" +#ifdef OUT +#undef OUT +#endif//OUT + class FileUnit { @@ -98,11 +102,8 @@ class MSVCBackend : public Backend void OutputFolders(); void OutputFileUnits(); - std::string DspFileName ( const Module& module ) const; std::string VcprojFileName ( const Module& module ) const; - std::string DswFileName ( const Module& module ) const; std::string SlnFileName ( const Module& module ) const; - std::string OptFileName ( const Module& module ) const; std::string SuoFileName ( const Module& module ) const; std::string NcbFileName ( const Module& module ) const; @@ -113,68 +114,12 @@ class MSVCBackend : public Backend int m_unitCount; - FILE* m_dswFile; - FILE* m_slnFile; - FILE* m_rulesFile; + std::string _gen_guid(); - // functions in msvcmaker.cpp: - - void _generate_dsp ( const Module& module ); - void _generate_dsw_header ( FILE* OUT ); - void _generate_dsw_project ( - FILE* OUT, - const Module& module, - std::string dsp_file, - const std::vector& dependencies ); - - void _generate_dsw_footer ( FILE* OUT ); - void _generate_wine_dsw ( FILE* OUT ); - - // functions in vcprojmaker.cpp: - - std::string _strip_gcc_deffile(std::string Filename, std::string sourcedir, std::string objdir); std::string _get_solution_version ( void ); std::string _get_studio_version ( void ); - std::string _gen_guid(); - std::string _replace_str( - std::string string1, - const std::string &find_str, - const std::string &replace_str); - std::string _get_vc_dir ( void ) const; - // These are used in both _generate_vcproj and _generate_standard_configuration - std::vector header_files; - std::vector includes; - std::vector includes_ros; - std::vector libraries; - std::set common_defines; - std::string baseaddr; - - void _generate_standard_configuration( - FILE* OUT, - const Module& module, - const MSVCConfiguration& cfg, - BinaryType binaryType ); - void _generate_makefile_configuration( FILE* OUT, const Module& module, const MSVCConfiguration& cfg ); - - void _generate_vcproj ( const Module& module ); - void _generate_vcxproj ( const Module& module ); - - void _generate_sln_header ( FILE* OUT ); - void _generate_sln_footer ( FILE* OUT ); - void _generate_sln ( FILE* OUT ); - //void _generate_rules_file ( FILE* OUT ); - void _generate_sln_project ( - FILE* OUT, - const Module& module, - std::string vcproj_file, - std::string sln_guid, - std::string vcproj_guid, - const std::vector& libraries ); - void _generate_sln_configurations ( - FILE* OUT, - std::string vcproj_guid ); void _clean_project_files ( void ); void _get_object_files ( const Module& module, std::vector& out ) const; void _get_def_files ( const Module& module, std::vector& out ) const; @@ -183,4 +128,97 @@ class MSVCBackend : public Backend const Property* _lookup_property ( const Module& module, const std::string& name ) const; }; + +// Abstract class +class ProjMaker +{ + public: + ProjMaker ( ); + ProjMaker ( Configuration& buildConfig, const std::vector& msvc_configs, std::string filename ); + virtual ~ProjMaker() {} + + virtual void _generate_proj_file ( const Module& module ) = 0; + virtual void _generate_user_configuration (); + + protected: + Configuration configuration; + std::vector m_configurations; + std::string vcproj_file; + FILE* OUT; + + std::vector header_files; + std::vector includes; + std::vector includes_ros; + std::vector libraries; + std::set common_defines; + std::string baseaddr; + + std::string VcprojFileName ( const Module& module ) const; + std::string _get_vc_dir ( void ) const; + + std::string _strip_gcc_deffile(std::string Filename, std::string sourcedir, std::string objdir); + std::string _get_solution_version ( void ); + std::string _get_studio_version ( void ); + std::string _replace_str( std::string string1, const std::string &find_str, const std::string &replace_str); + + void _generate_standard_configuration( const Module& module, const MSVCConfiguration& cfg, BinaryType binaryType ); + void _generate_makefile_configuration( const Module& module, const MSVCConfiguration& cfg ); +}; + +class VCProjMaker : public ProjMaker +{ + public: + VCProjMaker ( ); + VCProjMaker ( Configuration& buildConfig, const std::vector& msvc_configs, std::string filename ); + virtual ~VCProjMaker (); + + void _generate_proj_file ( const Module& module ); + void _generate_user_configuration (); + + private: + void _generate_standard_configuration( const Module& module, const MSVCConfiguration& cfg, BinaryType binaryType ); + void _generate_makefile_configuration( const Module& module, const MSVCConfiguration& cfg ); +}; + +class VCXProjMaker : public ProjMaker +{ + public: + VCXProjMaker ( ); + VCXProjMaker ( Configuration& buildConfig, const std::vector& msvc_configs, std::string filename ); + virtual ~VCXProjMaker (); + + void _generate_proj_file ( const Module& module ); + void _generate_user_configuration (); + + private: + void _generate_standard_configuration( const Module& module, const MSVCConfiguration& cfg, BinaryType binaryType ); + void _generate_makefile_configuration( const Module& module, const MSVCConfiguration& cfg ); +}; + +class SlnMaker +{ + public: + SlnMaker ( Configuration& buildConfig, Project& ProjectNode, const std::vector& configurations, std::string filename_sln ); + ~SlnMaker (); + + void _generate_sln ( std::string solution_version, std::string studio_version ); + + private: + Configuration m_configuration; + Project* m_ProjectNode; + std::vector m_configurations; + FILE* OUT; + + void _generate_sln_header ( std::string solution_version, std::string studio_version ); + void _generate_sln_footer ( ); + //void _generate_rules_file ( FILE* OUT ); + void _generate_sln_project ( + const Module& module, + std::string vcproj_file, + std::string sln_guid, + std::string vcproj_guid, + const std::vector& libraries ); + void _generate_sln_configurations ( std::string vcproj_guid ); +}; + #endif // __MSVC_H__ diff --git a/reactos/tools/rbuild/backend/msvc/projmaker.cpp b/reactos/tools/rbuild/backend/msvc/projmaker.cpp new file mode 100644 index 00000000000..efcfd2fb1f5 --- /dev/null +++ b/reactos/tools/rbuild/backend/msvc/projmaker.cpp @@ -0,0 +1,226 @@ +/* + * Copyright (C) 2002 Patrik Stridvall + * Copyright (C) 2005 Royce Mitchell III + * Copyright (C) 2006 Hervé Poussineau + * Copyright (C) 2006 Christoph von Wittich + * Copyright (C) 2009 Ged Murphy + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef _MSC_VER +#pragma warning ( disable : 4786 ) +#endif//_MSC_VER + +#include +#include +#include +#include +#include +#include + +#include + +#include "msvc.h" + +using std::string; +using std::vector; +using std::set; + +typedef set StringSet; + +#ifdef OUT +#undef OUT +#endif//OUT + +ProjMaker::ProjMaker ( ) +{ + vcproj_file = ""; +} + +ProjMaker::ProjMaker ( Configuration& buildConfig, + const std::vector& msvc_configs, + std::string filename ) +{ + configuration = buildConfig; + m_configurations = msvc_configs; + vcproj_file = filename; +} + +void +ProjMaker::_generate_proj_file ( const Module& module ) +{ + printf("_generate_proj_file not implemented for the base class\n"); +} + +void +ProjMaker::_generate_user_configuration() +{ +#if 0 + /* User configuration file */ + if (vcproj_file_user != "") + { + OUT = fopen ( vcproj_file_user.c_str(), "wb" ); + fprintf ( OUT, "\r\n" ); + fprintf ( OUT, "\r\n" ); + + fprintf ( OUT, "\t\r\n" ); + for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ ) + { + const MSVCConfiguration& cfg = *m_configurations[icfg]; + fprintf ( OUT, "\t\t\r\n" ); + fprintf ( OUT, "\t\t\t\r\n" ); + fprintf ( OUT, "\t\t\r\n" ); + } + fprintf ( OUT, "\t\r\n" ); + fprintf ( OUT, "\r\n" ); + fclose ( OUT ); + } +#endif +} + + +void +ProjMaker::_generate_standard_configuration( const Module& module, const MSVCConfiguration& cfg, BinaryType binaryType ) +{ + printf("_generate_standard_configuration not implemented for the base class\n"); +} + +void +ProjMaker::_generate_makefile_configuration( const Module& module, const MSVCConfiguration& cfg ) +{ + printf("_generate_makefile_configuration not implemented for the base class\n"); +} + +std::string +ProjMaker::_get_vc_dir ( void ) const +{ + if ( configuration.VSProjectVersion == "8.00" ) + return "vc8"; + else if ( configuration.VSProjectVersion == "10.00" ) + return "vc10"; + else /* default to VS2008 */ + return "vc9"; +} + +std::string +ProjMaker::VcprojFileName ( const Module& module ) const +{ + return FixSeparatorForSystemCommand( + ReplaceExtension ( module.output->relative_path + "\\" + module.name, "_" + _get_vc_dir() + "_auto.vcproj" ) + ); +} + +std::string +ProjMaker::_strip_gcc_deffile(std::string Filename, std::string sourcedir, std::string objdir) +{ + std::string NewFilename = Environment::GetIntermediatePath () + "\\" + objdir + "\\" + Filename; + // we don't like infinite loops - so replace it in two steps + NewFilename = _replace_str(NewFilename, ".def", "_msvc.de"); + NewFilename = _replace_str(NewFilename, "_msvc.de", "_msvc.def"); + Filename = sourcedir + "\\" + Filename; + + Directory dir(objdir); + dir.GenerateTree(IntermediateDirectory, false); + + std::fstream in_file(Filename.c_str(), std::ios::in); + std::fstream out_file(NewFilename.c_str(), std::ios::out); + std::string::size_type pos; + DWORD i = 0; + + std::string line; + while (std::getline(in_file, line)) + { + pos = line.find("@", 0); + while (std::string::npos != pos) + { + if (pos > 1) + { + // make sure it is stdcall and no ordinal + if (line[pos -1] != ' ') + { + i = 0; + while (true) + { + i++; + if ((line[pos + i] < '0') || (line[pos + i] > '9')) + break; + } + line.replace(pos, i, ""); + } + } + pos = line.find("@", pos + 1); + } + + line += "\n"; + out_file << line; + } + in_file.close(); + out_file.close(); + + return NewFilename; +} + +std::string +ProjMaker::_replace_str(std::string string1, const std::string &find_str, const std::string &replace_str) +{ + std::string::size_type pos = string1.find(find_str, 0); + int intLen = find_str.length(); + + while(std::string::npos != pos) + { + string1.replace(pos, intLen, replace_str); + pos = string1.find(find_str, intLen + pos); + } + + return string1; +} diff --git a/reactos/tools/rbuild/backend/msvc/slnmaker.cpp b/reactos/tools/rbuild/backend/msvc/slnmaker.cpp new file mode 100644 index 00000000000..c17c510c300 --- /dev/null +++ b/reactos/tools/rbuild/backend/msvc/slnmaker.cpp @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2002 Patrik Stridvall + * Copyright (C) 2005 Royce Mitchell III + * Copyright (C) 2006 Hervé Poussineau + * Copyright (C) 2006 Christoph von Wittich + * Copyright (C) 2009 Ged Murphy + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef _MSC_VER +#pragma warning ( disable : 4786 ) +#endif//_MSC_VER + +#include +#include +#include +#include +#include +#include + +#include + +#include "msvc.h" + +using std::string; +using std::vector; +using std::set; + + + +SlnMaker::SlnMaker ( Configuration& buildConfig, + Project& ProjectNode, + const std::vector& configurations, + std::string filename_sln ) +{ + m_configuration = buildConfig; + m_ProjectNode = &ProjectNode; + m_configurations = configurations; + + OUT = fopen ( filename_sln.c_str(), "wb" ); + + if ( !OUT ) + { + printf ( "Could not create file '%s'.\n", filename_sln.c_str() ); + } +} + +SlnMaker::~SlnMaker() +{ + fclose ( OUT ); +} + +void +SlnMaker::_generate_sln_header ( std::string solution_version, std::string studio_version ) +{ + //fprintf ( OUT, "Microsoft Visual Studio Solution File, Format Version %s\r\n", _get_solution_version().c_str() ); + //fprintf ( OUT, "# Visual Studio %s\r\n", _get_studio_version().c_str() ); + fprintf ( OUT, "Microsoft Visual Studio Solution File, Format Version %s\r\n", solution_version.c_str() ); + fprintf ( OUT, "# Visual Studio %s\r\n", studio_version.c_str() ); + fprintf ( OUT, "\r\n" ); +} + + +void +SlnMaker::_generate_sln_project ( + const Module& module, + std::string vcproj_file, + std::string sln_guid, + std::string vcproj_guid, + const std::vector& libraries ) +{ + vcproj_file = DosSeparator ( std::string(".\\") + vcproj_file ); + + fprintf ( OUT, "Project(\"%s\") = \"%s\", \"%s\", \"%s\"\r\n", sln_guid.c_str() , module.name.c_str(), vcproj_file.c_str(), vcproj_guid.c_str() ); +/* + //FIXME: only omit ProjectDependencies in VS 2005 when there are no dependencies + //NOTE: VS 2002 do not use ProjectSection; it uses GlobalSection instead + if ((configuration.VSProjectVersion == "7.10") || (libraries.size() > 0)) { + fprintf ( OUT, "\tProjectSection(ProjectDependencies) = postProject\r\n" ); + for ( size_t i = 0; i < libraries.size(); i++ ) + { + const Module& module = *libraries[i]->importedModule; + fprintf ( OUT, "\t\t%s = %s\r\n", module.guid.c_str(), module.guid.c_str() ); + } + fprintf ( OUT, "\tEndProjectSection\r\n" ); + } +*/ + fprintf ( OUT, "EndProject\r\n" ); +} + + +void +SlnMaker::_generate_sln_footer ( ) +{ + fprintf ( OUT, "Global\r\n" ); + fprintf ( OUT, "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n" ); + for ( size_t i = 0; i < m_configurations.size(); i++ ) + fprintf ( OUT, "\t\t%s = %s\r\n", m_configurations[i]->name.c_str(), m_configurations[i]->name.c_str() ); + fprintf ( OUT, "\tEndGlobalSection\r\n" ); + + fprintf ( OUT, "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n" ); + for( std::map::const_iterator p = m_ProjectNode->modules.begin(); p != m_ProjectNode->modules.end(); ++ p ) + { + Module& module = *p->second; + std::string guid = module.guid; + _generate_sln_configurations ( guid.c_str() ); + } + fprintf ( OUT, "\tEndGlobalSection\r\n" ); +/* + fprintf ( OUT, "\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n" ); + fprintf ( OUT, "\tEndGlobalSection\r\n" ); + fprintf ( OUT, "\tGlobalSection(ExtensibilityAddIns) = postSolution\r\n" ); + fprintf ( OUT, "\tEndGlobalSection\r\n" ); +*/ + + if (m_configuration.VSProjectVersion == "7.00") { + fprintf ( OUT, "\tGlobalSection(ProjectDependencies) = postSolution\r\n" ); + //FIXME: Add dependencies for VS 2002 + fprintf ( OUT, "\tEndGlobalSection\r\n" ); + } + else { + fprintf ( OUT, "\tGlobalSection(SolutionProperties) = preSolution\r\n" ); + fprintf ( OUT, "\t\tHideSolutionNode = FALSE\r\n" ); + fprintf ( OUT, "\tEndGlobalSection\r\n" ); + } + + fprintf ( OUT, "EndGlobal\r\n" ); + fprintf ( OUT, "\r\n" ); +} + + +void +SlnMaker::_generate_sln_configurations ( std::string vcproj_guid ) +{ + for ( size_t i = 0; i < m_configurations.size (); i++) + { + const MSVCConfiguration& cfg = *m_configurations[i]; + fprintf ( OUT, "\t\t%s.%s|Win32.ActiveCfg = %s|Win32\r\n", vcproj_guid.c_str(), cfg.name.c_str(), cfg.name.c_str() ); + fprintf ( OUT, "\t\t%s.%s|Win32.Build.0 = %s|Win32\r\n", vcproj_guid.c_str(), cfg.name.c_str(), cfg.name.c_str() ); + } +} + +void +SlnMaker::_generate_sln ( std::string solution_version, std::string studio_version ) +{ + string sln_guid = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"; + vector guids; + + _generate_sln_header( solution_version, studio_version); + // TODO FIXME - is it necessary to sort them? + for( std::map::const_iterator p = m_ProjectNode->modules.begin(); p != m_ProjectNode->modules.end(); ++ p ) + { + Module& module = *p->second; + + //std::string vcproj_file = + _generate_sln_project ( module, module.name, sln_guid, module.guid, module.non_if_data.libraries ); + } + _generate_sln_footer ( ); +} diff --git a/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp b/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp index 2d143af44a7..f43f745ec40 100644 --- a/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp +++ b/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp @@ -53,38 +53,38 @@ struct SortFilesAscending } }; -MSVCConfiguration::MSVCConfiguration ( const OptimizationType optimization, const HeadersType headers, const std::string &name ) + +VCProjMaker::VCProjMaker ( ) { - this->optimization = optimization; - this->headers = headers; - if ( name != "" ) - this->name = name; - else + vcproj_file = ""; +} + +VCProjMaker::VCProjMaker ( Configuration& buildConfig, + const std::vector& msvc_configs, + std::string filename ) +{ + configuration = buildConfig; + m_configurations = msvc_configs; + vcproj_file = filename; + + OUT = fopen ( vcproj_file.c_str(), "wb" ); + + if ( !OUT ) { - std::string headers_name; - if ( headers == MSVCHeaders ) - headers_name = ""; - else - headers_name = " - ReactOS headers"; - if ( optimization == Debug ) - this->name = "Debug" + headers_name; - else if ( optimization == Release ) - this->name = "Release" + headers_name; - else if ( optimization == Speed ) - this->name = "Speed" + headers_name; - else if ( optimization == RosBuild ) - this->name = "RosBuild"; - else - this->name = "Unknown" + headers_name; + printf ( "Could not create file '%s'.\n", vcproj_file.c_str() ); } } +VCProjMaker::~VCProjMaker() +{ + fclose ( OUT ); +} + void -MSVCBackend::_generate_vcproj ( const Module& module ) +VCProjMaker::_generate_proj_file ( const Module& module ) { size_t i; - string vcproj_file = VcprojFileName(module); string computername; string username; @@ -108,7 +108,6 @@ MSVCBackend::_generate_vcproj ( const Module& module ) vcproj_file_user = vcproj_file + "." + computername + "." + username + ".user"; printf ( "Creating MSVC.NET project: '%s'\n", vcproj_file.c_str() ); - FILE* OUT = fopen ( vcproj_file.c_str(), "wb" ); string path_basedir = module.GetPathToBaseDir (); string intenv = Environment::GetIntermediatePath (); @@ -263,11 +262,11 @@ MSVCBackend::_generate_vcproj ( const Module& module ) if ( cfg.optimization == RosBuild ) { - _generate_makefile_configuration( OUT, module, cfg ); + _generate_makefile_configuration( module, cfg ); } else { - _generate_standard_configuration( OUT, module, cfg, binaryType ); + _generate_standard_configuration( module, cfg, binaryType ); } } fprintf ( OUT, "\t\r\n" ); @@ -440,70 +439,15 @@ MSVCBackend::_generate_vcproj ( const Module& module ) fprintf ( OUT, "\t\r\n" ); fprintf ( OUT, "\t\r\n" ); fprintf ( OUT, "\r\n" ); - fclose ( OUT ); - -#if 0 - /* User configuration file */ - if (vcproj_file_user != "") - { - OUT = fopen ( vcproj_file_user.c_str(), "wb" ); - fprintf ( OUT, "\r\n" ); - fprintf ( OUT, "\r\n" ); - - fprintf ( OUT, "\t\r\n" ); - for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ ) - { - const MSVCConfiguration& cfg = *m_configurations[icfg]; - fprintf ( OUT, "\t\t\r\n" ); - fprintf ( OUT, "\t\t\t\r\n" ); - fprintf ( OUT, "\t\t\r\n" ); - } - fprintf ( OUT, "\t\r\n" ); - fprintf ( OUT, "\r\n" ); - fclose ( OUT ); - } -#endif } -void MSVCBackend::_generate_standard_configuration( FILE* OUT, - const Module& module, +void VCProjMaker::_generate_user_configuration () +{ + // Call base implementation + ProjMaker::_generate_user_configuration (); +} + +void VCProjMaker::_generate_standard_configuration( const Module& module, const MSVCConfiguration& cfg, BinaryType binaryType ) { @@ -942,7 +886,7 @@ void MSVCBackend::_generate_standard_configuration( FILE* OUT, void -MSVCBackend::_generate_makefile_configuration( FILE* OUT, const Module& module, const MSVCConfiguration& cfg ) +VCProjMaker::_generate_makefile_configuration( const Module& module, const MSVCConfiguration& cfg ) { string path_basedir = module.GetPathToBaseDir (); string intenv = Environment::GetIntermediatePath (); @@ -1002,248 +946,3 @@ MSVCBackend::_generate_makefile_configuration( FILE* OUT, const Module& module, fprintf ( OUT, "\t\t\t/>\r\n" ); fprintf ( OUT, "\t\t\r\n" ); } - - -std::string -MSVCBackend::_strip_gcc_deffile(std::string Filename, std::string sourcedir, std::string objdir) -{ - std::string NewFilename = Environment::GetIntermediatePath () + "\\" + objdir + "\\" + Filename; - // we don't like infinite loops - so replace it in two steps - NewFilename = _replace_str(NewFilename, ".def", "_msvc.de"); - NewFilename = _replace_str(NewFilename, "_msvc.de", "_msvc.def"); - Filename = sourcedir + "\\" + Filename; - - Directory dir(objdir); - dir.GenerateTree(IntermediateDirectory, false); - - std::fstream in_file(Filename.c_str(), std::ios::in); - std::fstream out_file(NewFilename.c_str(), std::ios::out); - std::string::size_type pos; - DWORD i = 0; - - std::string line; - while (std::getline(in_file, line)) - { - pos = line.find("@", 0); - while (std::string::npos != pos) - { - if (pos > 1) - { - // make sure it is stdcall and no ordinal - if (line[pos -1] != ' ') - { - i = 0; - while (true) - { - i++; - if ((line[pos + i] < '0') || (line[pos + i] > '9')) - break; - } - line.replace(pos, i, ""); - } - } - pos = line.find("@", pos + 1); - } - - line += "\n"; - out_file << line; - } - in_file.close(); - out_file.close(); - - return NewFilename; -} - -std::string -MSVCBackend::_replace_str(std::string string1, const std::string &find_str, const std::string &replace_str) -{ - std::string::size_type pos = string1.find(find_str, 0); - int intLen = find_str.length(); - - while(std::string::npos != pos) - { - string1.replace(pos, intLen, replace_str); - pos = string1.find(find_str, intLen + pos); - } - - return string1; -} - -std::string -MSVCBackend::_get_solution_version ( void ) -{ - string version; - - if (configuration.VSProjectVersion.empty()) - configuration.VSProjectVersion = MS_VS_DEF_VERSION; - - else if (configuration.VSProjectVersion == "7.00") - version = "7.00"; - - else if (configuration.VSProjectVersion == "7.10") - version = "8.00"; - - else if (configuration.VSProjectVersion == "8.00") - version = "9.00"; - - else if (configuration.VSProjectVersion == "9.00") - version = "10.00"; - - else if (configuration.VSProjectVersion == "10.00") - version = "11.00"; - - return version; -} - -std::string -MSVCBackend::_get_studio_version ( void ) -{ - string version; - - if (configuration.VSProjectVersion.empty()) - configuration.VSProjectVersion = MS_VS_DEF_VERSION; - - else if (configuration.VSProjectVersion == "7.00") - version = "2002"; - - else if (configuration.VSProjectVersion == "7.10") - version = "2003"; - - else if (configuration.VSProjectVersion == "8.00") - version = "2005"; - - else if (configuration.VSProjectVersion == "9.00") - version = "2008"; - - else if (configuration.VSProjectVersion == "10.00") - version = "2010"; - - return version; -} - -void -MSVCBackend::_generate_sln_header ( FILE* OUT ) -{ - fprintf ( OUT, "Microsoft Visual Studio Solution File, Format Version %s\r\n", _get_solution_version().c_str() ); - fprintf ( OUT, "# Visual Studio %s\r\n", _get_studio_version().c_str() ); - fprintf ( OUT, "\r\n" ); -} - - -void -MSVCBackend::_generate_sln_project ( - FILE* OUT, - const Module& module, - std::string vcproj_file, - std::string sln_guid, - std::string vcproj_guid, - const std::vector& libraries ) -{ - vcproj_file = DosSeparator ( std::string(".\\") + vcproj_file ); - - fprintf ( OUT, "Project(\"%s\") = \"%s\", \"%s\", \"%s\"\r\n", sln_guid.c_str() , module.name.c_str(), vcproj_file.c_str(), vcproj_guid.c_str() ); - - //FIXME: only omit ProjectDependencies in VS 2005 when there are no dependencies - //NOTE: VS 2002 do not use ProjectSection; it uses GlobalSection instead - if ((configuration.VSProjectVersion == "7.10") || (libraries.size() > 0)) { - fprintf ( OUT, "\tProjectSection(ProjectDependencies) = postProject\r\n" ); - for ( size_t i = 0; i < libraries.size(); i++ ) - { - const Module& module = *libraries[i]->importedModule; - fprintf ( OUT, "\t\t%s = %s\r\n", module.guid.c_str(), module.guid.c_str() ); - } - fprintf ( OUT, "\tEndProjectSection\r\n" ); - } - - fprintf ( OUT, "EndProject\r\n" ); -} - - -void -MSVCBackend::_generate_sln_footer ( FILE* OUT ) -{ - fprintf ( OUT, "Global\r\n" ); - fprintf ( OUT, "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n" ); - for ( size_t i = 0; i < m_configurations.size(); i++ ) - fprintf ( OUT, "\t\t%s = %s\r\n", m_configurations[i]->name.c_str(), m_configurations[i]->name.c_str() ); - fprintf ( OUT, "\tEndGlobalSection\r\n" ); - - fprintf ( OUT, "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n" ); - for( std::map::const_iterator p = ProjectNode.modules.begin(); p != ProjectNode.modules.end(); ++ p ) - { - Module& module = *p->second; - std::string guid = module.guid; - _generate_sln_configurations ( OUT, guid.c_str() ); - } - fprintf ( OUT, "\tEndGlobalSection\r\n" ); -/* - fprintf ( OUT, "\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n" ); - fprintf ( OUT, "\tEndGlobalSection\r\n" ); - fprintf ( OUT, "\tGlobalSection(ExtensibilityAddIns) = postSolution\r\n" ); - fprintf ( OUT, "\tEndGlobalSection\r\n" ); -*/ - if (configuration.VSProjectVersion == "7.00") { - fprintf ( OUT, "\tGlobalSection(ProjectDependencies) = postSolution\r\n" ); - //FIXME: Add dependencies for VS 2002 - fprintf ( OUT, "\tEndGlobalSection\r\n" ); - } - else { - fprintf ( OUT, "\tGlobalSection(SolutionProperties) = preSolution\r\n" ); - fprintf ( OUT, "\t\tHideSolutionNode = FALSE\r\n" ); - fprintf ( OUT, "\tEndGlobalSection\r\n" ); - } - - fprintf ( OUT, "EndGlobal\r\n" ); - fprintf ( OUT, "\r\n" ); -} - - -void -MSVCBackend::_generate_sln_configurations ( FILE* OUT, std::string vcproj_guid ) -{ - for ( size_t i = 0; i < m_configurations.size (); i++) - { - const MSVCConfiguration& cfg = *m_configurations[i]; - fprintf ( OUT, "\t\t%s.%s|Win32.ActiveCfg = %s|Win32\r\n", vcproj_guid.c_str(), cfg.name.c_str(), cfg.name.c_str() ); - fprintf ( OUT, "\t\t%s.%s|Win32.Build.0 = %s|Win32\r\n", vcproj_guid.c_str(), cfg.name.c_str(), cfg.name.c_str() ); - } -} - -void -MSVCBackend::_generate_sln ( FILE* OUT ) -{ - string sln_guid = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"; - vector guids; - - _generate_sln_header(OUT); - // TODO FIXME - is it necessary to sort them? - for( std::map::const_iterator p = ProjectNode.modules.begin(); p != ProjectNode.modules.end(); ++ p ) - { - Module& module = *p->second; - - std::string vcproj_file = VcprojFileName ( module ); - _generate_sln_project ( OUT, module, vcproj_file, sln_guid, module.guid, module.non_if_data.libraries ); - } - _generate_sln_footer ( OUT ); -} - -const Property* -MSVCBackend::_lookup_property ( const Module& module, const std::string& name ) const -{ - std::map::const_iterator p; - - /* Check local values */ - p = module.non_if_data.properties.find(name); - - if ( p != module.non_if_data.properties.end() ) - return p->second; - - // TODO FIXME - should we check local if-ed properties? - p = module.project.non_if_data.properties.find(name); - - if ( p != module.project.non_if_data.properties.end() ) - return p->second; - - // TODO FIXME - should we check global if-ed properties? - return NULL; -} diff --git a/reactos/tools/rbuild/backend/msvc/vcxprojmaker.cpp b/reactos/tools/rbuild/backend/msvc/vcxprojmaker.cpp index c8d9fc03eb1..a5cc7181583 100644 --- a/reactos/tools/rbuild/backend/msvc/vcxprojmaker.cpp +++ b/reactos/tools/rbuild/backend/msvc/vcxprojmaker.cpp @@ -1,4 +1,8 @@ /* + * Copyright (C) 2002 Patrik Stridvall + * Copyright (C) 2005 Royce Mitchell III + * Copyright (C) 2006 Hervé Poussineau + * Copyright (C) 2006 Christoph von Wittich * Copyright (C) 2009 Ged Murphy * * This program is free software; you can redistribute it and/or modify @@ -16,6 +20,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifdef _MSC_VER +#pragma warning ( disable : 4786 ) +#endif//_MSC_VER + #include #include #include @@ -37,141 +45,57 @@ typedef set StringSet; #undef OUT #endif//OUT -void -MSVCBackend::_generate_vcxproj ( const Module& module ) + +VCXProjMaker::VCXProjMaker ( ) { - size_t i; - - string vcproj_file = VcprojFileName(module); - string computername; - string username; - string intermediatedir = ""; - - if (getenv ( "USERNAME" ) != NULL) - username = getenv ( "USERNAME" ); - if (getenv ( "COMPUTERNAME" ) != NULL) - computername = getenv ( "COMPUTERNAME" ); - else if (getenv ( "HOSTNAME" ) != NULL) - computername = getenv ( "HOSTNAME" ); - - printf ( "Creating MSVC project: '%s'\n", vcproj_file.c_str() ); - FILE* OUT = fopen ( vcproj_file.c_str(), "wb" ); - - string path_basedir = module.GetPathToBaseDir (); - string intenv = Environment::GetIntermediatePath (); - string outenv = Environment::GetOutputPath (); - string outdir; - string intdir; - string vcdir; - - if ( intenv == "obj-i386" ) - intdir = path_basedir + "obj-i386"; /* append relative dir from project dir */ - else - intdir = intenv; - - if ( outenv == "output-i386" ) - outdir = path_basedir + "output-i386"; - else - outdir = outenv; - - if ( configuration.UseVSVersionInPath ) - { - vcdir = DEF_SSEP + _get_vc_dir(); - } - - - - bool include_idl = false; - - vector source_files, resource_files; - vector ifs_list; - ifs_list.push_back ( &module.project.non_if_data ); - ifs_list.push_back ( &module.non_if_data ); - - while ( ifs_list.size() ) - { - const IfableData& data = *ifs_list.back(); - ifs_list.pop_back(); - const vector& files = data.files; - for ( i = 0; i < files.size(); i++ ) - { - if (files[i]->file.directory != SourceDirectory) - continue; - - // We want the full path here for directory support later on - string path = Path::RelativeFromDirectory ( - files[i]->file.relative_path, - module.output->relative_path ); - string file = path + std::string("\\") + files[i]->file.name; - - if ( !stricmp ( Right(file,3).c_str(), ".rc" ) ) - resource_files.push_back ( file ); - else if ( !stricmp ( Right(file,2).c_str(), ".h" ) ) - header_files.push_back ( file ); - else - source_files.push_back ( file ); - } - const vector& incs = data.includes; - for ( i = 0; i < incs.size(); i++ ) - { - string path = Path::RelativeFromDirectory ( - incs[i]->directory->relative_path, - module.output->relative_path ); - if ( module.type != RpcServer && module.type != RpcClient ) - { - if ( path.find ("/include/reactos/idl") != string::npos) - { - include_idl = true; - continue; - } - } - // switch between general headers and ros headers - if ( !strncmp(incs[i]->directory->relative_path.c_str(), "include\\crt", 11 ) || - !strncmp(incs[i]->directory->relative_path.c_str(), "include\\ddk", 11 ) || - !strncmp(incs[i]->directory->relative_path.c_str(), "include\\GL", 10 ) || - !strncmp(incs[i]->directory->relative_path.c_str(), "include\\psdk", 12 ) || - !strncmp(incs[i]->directory->relative_path.c_str(), "include\\reactos\\wine", 20 ) ) - { - if (strncmp(incs[i]->directory->relative_path.c_str(), "include\\crt", 11 )) - // not crt include - includes_ros.push_back ( path ); - } - else - { - includes.push_back ( path ); - } - } - const vector& libs = data.libraries; - for ( i = 0; i < libs.size(); i++ ) - { - string libpath = outdir + "\\" + libs[i]->importedModule->output->relative_path + "\\" + _get_vc_dir() + "\\---\\" + libs[i]->name + ".lib"; - libraries.push_back ( libpath ); - } - const vector& defs = data.defines; - for ( i = 0; i < defs.size(); i++ ) - { - if ( defs[i]->backend != "" && defs[i]->backend != "msvc" ) - continue; - - if ( defs[i]->value[0] ) - common_defines.insert( defs[i]->name + "=" + defs[i]->value ); - else - common_defines.insert( defs[i]->name ); - } - for ( std::map::const_iterator p = data.properties.begin(); p != data.properties.end(); ++ p ) - { - Property& prop = *p->second; - if ( strstr ( module.baseaddress.c_str(), prop.name.c_str() ) ) - baseaddr = prop.value; - } - } - /* include intermediate path for reactos.rc */ - string version = intdir + "\\include"; - includes.push_back (version); - version += "\\reactos"; - includes.push_back (version); - - string include_string; - - fprintf ( OUT, "\r\n" ); + vcproj_file = ""; +} + +VCXProjMaker::VCXProjMaker ( Configuration& buildConfig, + const std::vector& msvc_configs, + std::string filename ) +{ + configuration = buildConfig; + m_configurations = msvc_configs; + vcproj_file = filename; + + OUT = fopen ( vcproj_file.c_str(), "wb" ); + + if ( !OUT ) + { + printf ( "Could not create file '%s'.\n", vcproj_file.c_str() ); + } +} + +VCXProjMaker::~VCXProjMaker() +{ + fclose ( OUT ); +} + +void +VCXProjMaker::_generate_proj_file ( const Module& module ) +{ + // TODO: Implement me + ProjMaker::_generate_proj_file ( module ); +} + +void +VCXProjMaker::_generate_user_configuration () +{ + // Call base implementation + ProjMaker::_generate_user_configuration (); +} + +void +VCXProjMaker::_generate_standard_configuration( const Module& module, const MSVCConfiguration& cfg, BinaryType binaryType ) +{ + // TODO: Implement me + ProjMaker::_generate_standard_configuration ( module, cfg, binaryType ); +} + +void +VCXProjMaker::_generate_makefile_configuration( const Module& module, const MSVCConfiguration& cfg ) +{ + // TODO: Implement me + ProjMaker::_generate_makefile_configuration ( module, cfg ); } diff --git a/reactos/tools/rbuild/rbuild.h b/reactos/tools/rbuild/rbuild.h index f8ae933a130..8d158a41832 100644 --- a/reactos/tools/rbuild/rbuild.h +++ b/reactos/tools/rbuild/rbuild.h @@ -68,7 +68,7 @@ extern char cBadSep; #define DEF_SBAD_SEP "\\" #endif -#define MS_VS_DEF_VERSION "7.10" +#define MS_VS_DEF_VERSION "8.00" class XmlNode; class Directory; diff --git a/reactos/tools/rbuild/rbuild.mak b/reactos/tools/rbuild/rbuild.mak index c05e9e17ffc..f56c0a0df1f 100644 --- a/reactos/tools/rbuild/rbuild.mak +++ b/reactos/tools/rbuild/rbuild.mak @@ -227,7 +227,8 @@ RBUILD_BACKEND_MSBUILD_BASE_SOURCES = $(addprefix $(RBUILD_MSBUILD_BASE_), \ RBUILD_BACKEND_MSVC_BASE_SOURCES = $(addprefix $(RBUILD_MSVC_BASE_), \ genguid.cpp \ msvc.cpp \ - msvcmaker.cpp \ + projmaker.cpp \ + slnmaker.cpp \ vcprojmaker.cpp \ vcxprojmaker.cpp \ ) @@ -522,8 +523,12 @@ $(RBUILD_MSVC_INT_)genguid.o: $(RBUILD_MSVC_BASE_)genguid.cpp $(RBUILD_HEADERS) $(RBUILD_MSVC_INT_)msvc.o: $(RBUILD_MSVC_BASE_)msvc.cpp $(RBUILD_HEADERS) | $(RBUILD_MSVC_INT) $(ECHO_HOSTCC) ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@ - -$(RBUILD_MSVC_INT_)msvcmaker.o: $(RBUILD_MSVC_BASE_)msvcmaker.cpp $(RBUILD_HEADERS) | $(RBUILD_MSVC_INT) + +$(RBUILD_MSVC_INT_)projmaker.o: $(RBUILD_MSVC_BASE_)projmaker.cpp $(RBUILD_HEADERS) | $(RBUILD_MSVC_INT) + $(ECHO_HOSTCC) + ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@ + +$(RBUILD_MSVC_INT_)slnmaker.o: $(RBUILD_MSVC_BASE_)slnmaker.cpp $(RBUILD_HEADERS) | $(RBUILD_MSVC_INT) $(ECHO_HOSTCC) ${host_gpp} $(RBUILD_HOST_CXXFLAGS) -c $< -o $@ diff --git a/reactos/tools/rbuild/rbuild.vcproj b/reactos/tools/rbuild/rbuild.vcproj index 59f90ad1a8a..39b10bc1286 100644 --- a/reactos/tools/rbuild/rbuild.vcproj +++ b/reactos/tools/rbuild/rbuild.vcproj @@ -287,28 +287,12 @@ > + + - - - - - -