Option to disable compilation units
Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp
Modified: trunk/reactos/tools/rbuild/compilationunitsupportcode.cpp
Modified: trunk/reactos/tools/rbuild/configuration.cpp
Modified: trunk/reactos/tools/rbuild/module.cpp
Modified: trunk/reactos/tools/rbuild/project.cpp
Modified: trunk/reactos/tools/rbuild/rbuild.cpp
Modified: trunk/reactos/tools/rbuild/rbuild.h

Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp
--- trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-11-23 01:40:19 UTC (rev 19476)
+++ trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-11-23 03:12:52 UTC (rev 19477)
@@ -527,10 +527,13 @@
 void
 MingwBackend::GenerateCompilationUnitSupportCode ()
 {
-	printf ( "Generating compilation unit support code..." );
-	CompilationUnitSupportCode compilationUnitSupportCode ( ProjectNode );
-	compilationUnitSupportCode.Generate ( configuration.Verbose );
-	printf ( "done\n" );
+	if ( configuration.CompilationUnitsEnabled )
+	{
+		printf ( "Generating compilation unit support code..." );
+		CompilationUnitSupportCode compilationUnitSupportCode ( ProjectNode );
+		compilationUnitSupportCode.Generate ( configuration.Verbose );
+		printf ( "done\n" );
+	}
 }
 
 string

Modified: trunk/reactos/tools/rbuild/compilationunitsupportcode.cpp
--- trunk/reactos/tools/rbuild/compilationunitsupportcode.cpp	2005-11-23 01:40:19 UTC (rev 19476)
+++ trunk/reactos/tools/rbuild/compilationunitsupportcode.cpp	2005-11-23 03:12:52 UTC (rev 19477)
@@ -83,12 +83,12 @@
 	s = s + sprintf ( s, "/* This file is automatically generated. */\n" );
 	s = s + sprintf ( s, "#define ONE_COMPILATION_UNIT\n" );
 	if ( module.pch )
-		s = s + sprintf ( s, "#include <%s>\n", NormalizeFilename ( module.pch->file.name ).c_str () );
+		s = s + sprintf ( s, "#include <%s>\n", ChangeSeparator ( module.pch->file.name, '\\', '/' ).c_str () );
 
 	for ( size_t i = 0; i < compilationUnit.files.size () ; i++ )
 	{
 		File& file = *compilationUnit.files[i];
-		s = s + sprintf ( s, "#include \"%s\"\n", file.name.c_str () );
+		s = s + sprintf ( s, "#include <%s>\n", ChangeSeparator ( file.name, '\\', '/' ).c_str () );
 	}
 
 	s = s + sprintf ( s, "\n" );

Modified: trunk/reactos/tools/rbuild/configuration.cpp
--- trunk/reactos/tools/rbuild/configuration.cpp	2005-11-23 01:40:19 UTC (rev 19476)
+++ trunk/reactos/tools/rbuild/configuration.cpp	2005-11-23 03:12:52 UTC (rev 19477)
@@ -26,6 +26,7 @@
 	CleanAsYouGo = false;
 	AutomaticDependencies = true;
 	CheckDependenciesForModuleOnly = false;
+	CompilationUnitsEnabled = true;
 	MakeHandlesInstallDirectories = false;
 	GenerateProxyMakefilesInSourceTree = false;
 }

Modified: trunk/reactos/tools/rbuild/module.cpp
--- trunk/reactos/tools/rbuild/module.cpp	2005-11-23 01:40:19 UTC (rev 19476)
+++ trunk/reactos/tools/rbuild/module.cpp	2005-11-23 03:12:52 UTC (rev 19477)
@@ -52,19 +52,27 @@
 }
 
 string
-FixSeparator ( const string& s )
+ChangeSeparator ( const string& s,
+                  const char fromSeparator,
+                  const char toSeparator )
 {
 	string s2(s);
-	char* p = strchr ( &s2[0], cBadSep );
+	char* p = strchr ( &s2[0], fromSeparator );
 	while ( p )
 	{
-		*p++ = cSep;
-		p = strchr ( p, cBadSep );
+		*p++ = toSeparator;
+		p = strchr ( p, fromSeparator );
 	}
 	return s2;
 }
 
 string
+FixSeparator ( const string& s )
+{
+	return ChangeSeparator ( s, cBadSep, cSep );
+}
+
+string
 FixSeparatorForSystemCommand ( const string& s )
 {
 	string s2(s);
@@ -627,12 +635,15 @@
 	}
 	else if ( e.name == "compilationunit" )
 	{
-		CompilationUnit* pCompilationUnit = new CompilationUnit ( &project, this, &e );
-		if ( parseContext.ifData )
-			parseContext.ifData->data.compilationUnits.push_back ( pCompilationUnit );
-		else
-			non_if_data.compilationUnits.push_back ( pCompilationUnit );
-		parseContext.compilationUnit = pCompilationUnit;
+		if ( project.configuration.CompilationUnitsEnabled )
+		{
+			CompilationUnit* pCompilationUnit = new CompilationUnit ( &project, this, &e );
+			if ( parseContext.ifData )
+				parseContext.ifData->data.compilationUnits.push_back ( pCompilationUnit );
+			else
+				non_if_data.compilationUnits.push_back ( pCompilationUnit );
+			parseContext.compilationUnit = pCompilationUnit;
+		}
 		subs_invalid = false;
 	}
 	if ( subs_invalid && e.subElements.size() > 0 )

Modified: trunk/reactos/tools/rbuild/project.cpp
--- trunk/reactos/tools/rbuild/project.cpp	2005-11-23 01:40:19 UTC (rev 19476)
+++ trunk/reactos/tools/rbuild/project.cpp	2005-11-23 03:12:52 UTC (rev 19477)
@@ -81,11 +81,13 @@
 }
 
 
-Project::Project ( const string& filename )
+Project::Project ( const Configuration& configuration,
+                   const string& filename )
 	: xmlfile (filename),
 	  node (NULL),
-	  head (NULL)
-{
+	  head (NULL),
+	  configuration (configuration)
+{  
 	ReadXml();
 }
 

Modified: trunk/reactos/tools/rbuild/rbuild.cpp
--- trunk/reactos/tools/rbuild/rbuild.cpp	2005-11-23 01:40:19 UTC (rev 19476)
+++ trunk/reactos/tools/rbuild/rbuild.cpp	2005-11-23 03:12:52 UTC (rev 19477)
@@ -61,6 +61,22 @@
 	return true;
 }
 
+bool
+ParseCompilationUnitSwitch ( char switchChar2,
+	                     char* switchStart )
+{
+	switch ( switchChar2 )
+	{
+		case 'd':
+			configuration.CompilationUnitsEnabled = false;
+			break;
+		default:
+			printf ( "Unknown switch -u%c\n",
+			         switchChar2 );
+			return false;
+	}
+	return true;
+}
 
 bool
 ParseVCProjectSwitch ( char switchChar2,
@@ -148,6 +164,9 @@
 		case 'd':
 			return ParseAutomaticDependencySwitch ( switchChar2,
 			                                        argv[index] );
+		case 'u':
+			return ParseCompilationUnitSwitch ( switchChar2,
+			                                    argv[index] );
 		case 'r':
 			RootXmlFile = string(&argv[index][2]);
 			break;
@@ -196,9 +215,10 @@
 		printf ( "  -v            Be verbose.\n" );
 		printf ( "  -c            Clean as you go. Delete generated files as soon as they are not\n" );
 		printf ( "                needed anymore.\n" );
+		printf ( "  -r{file.xml}  Name of the root xml file. Default is ReactOS.xml.\n" );
 		printf ( "  -dd           Disable automatic dependencies.\n" );
 		printf ( "  -dm{module}   Check only automatic dependencies for this module.\n" );
-		printf ( "  -r{file.xml}  Name of the root xml file. Default is ReactOS.xml.\n" );
+		printf ( "  -ud           Disable multiple source files per compilation unit.\n" );
 		printf ( "  -mi           Let make handle creation of install directories. Rbuild will\n" );
 		printf ( "                not generate the directories.\n" );
 		printf ( "  -ps           Generate proxy makefiles in source tree instead of the output.\n" );
@@ -215,7 +235,7 @@
 	{
 		string projectFilename ( RootXmlFile );
 		printf ( "Reading build files..." );
-		Project project ( projectFilename );
+		Project project ( configuration, projectFilename );
 		printf ( "done\n" );
 		project.WriteConfigurationFile ();
 		project.ExecuteInvocations ();

Modified: trunk/reactos/tools/rbuild/rbuild.h
--- trunk/reactos/tools/rbuild/rbuild.h	2005-11-23 01:40:19 UTC (rev 19476)
+++ trunk/reactos/tools/rbuild/rbuild.h	2005-11-23 03:12:52 UTC (rev 19477)
@@ -133,6 +133,7 @@
 	bool CleanAsYouGo;
 	bool AutomaticDependencies;
 	bool CheckDependenciesForModuleOnly;
+	bool CompilationUnitsEnabled;
 	std::string CheckDependenciesForModuleOnlyModule;
 	std::string VSProjectVersion;
 	bool MakeHandlesInstallDirectories;
@@ -189,6 +190,7 @@
 	std::string xmlfile;
 	XMLElement *node, *head;
 public:
+	const Configuration& configuration;
 	std::string name;
 	std::string makefile;
 	XMLIncludes xmlbuildfiles;
@@ -198,7 +200,8 @@
 	std::vector<InstallFile*> installfiles;
 	IfableData non_if_data;
 
-	Project ( const std::string& filename );
+	Project ( const Configuration& configuration,
+	          const std::string& filename );
 	~Project ();
 	void WriteConfigurationFile ();
 	void ExecuteInvocations ();
@@ -873,6 +876,11 @@
 Replace ( const std::string& s, const std::string& find, const std::string& with );
 
 extern std::string
+ChangeSeparator ( const std::string& s,
+                  const char fromSeparator,
+                  const char toSeparator );
+
+extern std::string
 FixSeparator ( const std::string& s );
 
 extern std::string