mirror of
https://github.com/reactos/reactos.git
synced 2024-10-06 17:35:07 +00:00
- 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
This commit is contained in:
parent
c02b01ff32
commit
b9e2cd6419
|
@ -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<std::string, Property*>::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;
|
||||
}
|
||||
|
|
|
@ -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<Dependency*>& 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<std::string> header_files;
|
||||
std::vector<std::string> includes;
|
||||
std::vector<std::string> includes_ros;
|
||||
std::vector<std::string> libraries;
|
||||
std::set<std::string> 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<Library*>& 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<std::string>& out ) const;
|
||||
void _get_def_files ( const Module& module, std::vector<std::string>& 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<MSVCConfiguration*>& 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<MSVCConfiguration*> m_configurations;
|
||||
std::string vcproj_file;
|
||||
FILE* OUT;
|
||||
|
||||
std::vector<std::string> header_files;
|
||||
std::vector<std::string> includes;
|
||||
std::vector<std::string> includes_ros;
|
||||
std::vector<std::string> libraries;
|
||||
std::set<std::string> 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<MSVCConfiguration*>& 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<MSVCConfiguration*>& 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<MSVCConfiguration*>& 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<MSVCConfiguration*> 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<Library*>& libraries );
|
||||
void _generate_sln_configurations ( std::string vcproj_guid );
|
||||
};
|
||||
|
||||
#endif // __MSVC_H__
|
||||
|
|
226
reactos/tools/rbuild/backend/msvc/projmaker.cpp
Normal file
226
reactos/tools/rbuild/backend/msvc/projmaker.cpp
Normal file
|
@ -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 <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "msvc.h"
|
||||
|
||||
using std::string;
|
||||
using std::vector;
|
||||
using std::set;
|
||||
|
||||
typedef set<string> StringSet;
|
||||
|
||||
#ifdef OUT
|
||||
#undef OUT
|
||||
#endif//OUT
|
||||
|
||||
ProjMaker::ProjMaker ( )
|
||||
{
|
||||
vcproj_file = "";
|
||||
}
|
||||
|
||||
ProjMaker::ProjMaker ( Configuration& buildConfig,
|
||||
const std::vector<MSVCConfiguration*>& 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, "<?xml version=\"1.0\" encoding = \"Windows-1252\"?>\r\n" );
|
||||
fprintf ( OUT, "<VisualStudioUserFile\r\n" );
|
||||
fprintf ( OUT, "\tProjectType=\"Visual C++\"\r\n" );
|
||||
fprintf ( OUT, "\tVersion=\"%s\"\r\n", configuration.VSProjectVersion.c_str() );
|
||||
fprintf ( OUT, "\tShowAllFiles=\"false\"\r\n" );
|
||||
fprintf ( OUT, "\t>\r\n" );
|
||||
|
||||
fprintf ( OUT, "\t<Configurations>\r\n" );
|
||||
for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ )
|
||||
{
|
||||
const MSVCConfiguration& cfg = *m_configurations[icfg];
|
||||
fprintf ( OUT, "\t\t<Configuration\r\n" );
|
||||
fprintf ( OUT, "\t\t\tName=\"%s|Win32\"\r\n", cfg.name.c_str() );
|
||||
fprintf ( OUT, "\t\t\t>\r\n" );
|
||||
fprintf ( OUT, "\t\t\t<DebugSettings\r\n" );
|
||||
if ( module_type == ".cpl" )
|
||||
{
|
||||
fprintf ( OUT, "\t\t\t\tCommand=\"rundll32.exe\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tCommandArguments=\" shell32,Control_RunDLL "$(TargetPath)",@\"\r\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf ( OUT, "\t\t\t\tCommand=\"$(TargetPath)\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tCommandArguments=\"\"\r\n" );
|
||||
}
|
||||
fprintf ( OUT, "\t\t\t\tAttach=\"false\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tDebuggerType=\"3\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tRemote=\"1\"\r\n" );
|
||||
string remote_machine = "\t\t\t\tRemoteMachine=\"" + computername + "\"\r\n";
|
||||
fprintf ( OUT, remote_machine.c_str() );
|
||||
fprintf ( OUT, "\t\t\t\tRemoteCommand=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tHttpUrl=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tPDBPath=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tSQLDebugging=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tEnvironment=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tEnvironmentMerge=\"true\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tDebuggerFlavor=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tMPIRunCommand=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tMPIRunArguments=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tMPIRunWorkingDirectory=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tApplicationCommand=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tApplicationArguments=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tShimCommand=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tMPIAcceptMode=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tMPIAcceptFilter=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t/>\r\n" );
|
||||
fprintf ( OUT, "\t\t</Configuration>\r\n" );
|
||||
}
|
||||
fprintf ( OUT, "\t</Configurations>\r\n" );
|
||||
fprintf ( OUT, "</VisualStudioUserFile>\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;
|
||||
}
|
172
reactos/tools/rbuild/backend/msvc/slnmaker.cpp
Normal file
172
reactos/tools/rbuild/backend/msvc/slnmaker.cpp
Normal file
|
@ -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 <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "msvc.h"
|
||||
|
||||
using std::string;
|
||||
using std::vector;
|
||||
using std::set;
|
||||
|
||||
|
||||
|
||||
SlnMaker::SlnMaker ( Configuration& buildConfig,
|
||||
Project& ProjectNode,
|
||||
const std::vector<MSVCConfiguration*>& 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<Library*>& 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<std::string, Module*>::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<string> guids;
|
||||
|
||||
_generate_sln_header( solution_version, studio_version);
|
||||
// TODO FIXME - is it necessary to sort them?
|
||||
for( std::map<std::string, Module*>::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 ( );
|
||||
}
|
|
@ -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<MSVCConfiguration*>& 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</Configurations>\r\n" );
|
||||
|
@ -440,70 +439,15 @@ MSVCBackend::_generate_vcproj ( const Module& module )
|
|||
fprintf ( OUT, "\t<Globals>\r\n" );
|
||||
fprintf ( OUT, "\t</Globals>\r\n" );
|
||||
fprintf ( OUT, "</VisualStudioProject>\r\n" );
|
||||
fclose ( OUT );
|
||||
|
||||
#if 0
|
||||
/* User configuration file */
|
||||
if (vcproj_file_user != "")
|
||||
{
|
||||
OUT = fopen ( vcproj_file_user.c_str(), "wb" );
|
||||
fprintf ( OUT, "<?xml version=\"1.0\" encoding = \"Windows-1252\"?>\r\n" );
|
||||
fprintf ( OUT, "<VisualStudioUserFile\r\n" );
|
||||
fprintf ( OUT, "\tProjectType=\"Visual C++\"\r\n" );
|
||||
fprintf ( OUT, "\tVersion=\"%s\"\r\n", configuration.VSProjectVersion.c_str() );
|
||||
fprintf ( OUT, "\tShowAllFiles=\"false\"\r\n" );
|
||||
fprintf ( OUT, "\t>\r\n" );
|
||||
|
||||
fprintf ( OUT, "\t<Configurations>\r\n" );
|
||||
for ( size_t icfg = 0; icfg < m_configurations.size(); icfg++ )
|
||||
{
|
||||
const MSVCConfiguration& cfg = *m_configurations[icfg];
|
||||
fprintf ( OUT, "\t\t<Configuration\r\n" );
|
||||
fprintf ( OUT, "\t\t\tName=\"%s|Win32\"\r\n", cfg.name.c_str() );
|
||||
fprintf ( OUT, "\t\t\t>\r\n" );
|
||||
fprintf ( OUT, "\t\t\t<DebugSettings\r\n" );
|
||||
if ( module_type == ".cpl" )
|
||||
{
|
||||
fprintf ( OUT, "\t\t\t\tCommand=\"rundll32.exe\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tCommandArguments=\" shell32,Control_RunDLL "$(TargetPath)",@\"\r\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf ( OUT, "\t\t\t\tCommand=\"$(TargetPath)\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tCommandArguments=\"\"\r\n" );
|
||||
}
|
||||
fprintf ( OUT, "\t\t\t\tAttach=\"false\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tDebuggerType=\"3\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tRemote=\"1\"\r\n" );
|
||||
string remote_machine = "\t\t\t\tRemoteMachine=\"" + computername + "\"\r\n";
|
||||
fprintf ( OUT, remote_machine.c_str() );
|
||||
fprintf ( OUT, "\t\t\t\tRemoteCommand=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tHttpUrl=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tPDBPath=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tSQLDebugging=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tEnvironment=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tEnvironmentMerge=\"true\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tDebuggerFlavor=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tMPIRunCommand=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tMPIRunArguments=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tMPIRunWorkingDirectory=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tApplicationCommand=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tApplicationArguments=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tShimCommand=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tMPIAcceptMode=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t\tMPIAcceptFilter=\"\"\r\n" );
|
||||
fprintf ( OUT, "\t\t\t/>\r\n" );
|
||||
fprintf ( OUT, "\t\t</Configuration>\r\n" );
|
||||
}
|
||||
fprintf ( OUT, "\t</Configurations>\r\n" );
|
||||
fprintf ( OUT, "</VisualStudioUserFile>\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</Configuration>\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<Library*>& 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<std::string, Module*>::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<string> guids;
|
||||
|
||||
_generate_sln_header(OUT);
|
||||
// TODO FIXME - is it necessary to sort them?
|
||||
for( std::map<std::string, Module*>::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<std::string, Property*>::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;
|
||||
}
|
||||
|
|
|
@ -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 <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
|
@ -37,141 +45,57 @@ typedef set<string> 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<string> source_files, resource_files;
|
||||
vector<const IfableData*> 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<File*>& 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<Include*>& 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<Library*>& 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<Define*>& 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<std::string, Property*>::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, "<?xml version=\"1.0\" encoding = \"Windows-1252\"?>\r\n" );
|
||||
vcproj_file = "";
|
||||
}
|
||||
|
||||
VCXProjMaker::VCXProjMaker ( Configuration& buildConfig,
|
||||
const std::vector<MSVCConfiguration*>& 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 );
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 $@
|
||||
|
||||
|
|
|
@ -287,28 +287,12 @@
|
|||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="backend\msvc\msvcmaker.cpp"
|
||||
RelativePath=".\backend\msvc\projmaker.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\backend\msvc\slnmaker.cpp"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
PreprocessorDefinitions=""
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="backend\msvc\vcprojmaker.cpp"
|
||||
|
|
Loading…
Reference in a new issue