Generate pre-compiled headers in intermediate directory tree
Modified: trunk/reactos/hal/halx86/generic/generic.xml
Modified: trunk/reactos/hal/halx86/xbox/halxbox.xml
Modified: trunk/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
Modified: trunk/reactos/tools/rbuild/backend/mingw/modulehandler.h

Modified: trunk/reactos/hal/halx86/generic/generic.xml
--- trunk/reactos/hal/halx86/generic/generic.xml	2005-07-06 16:27:58 UTC (rev 16458)
+++ trunk/reactos/hal/halx86/generic/generic.xml	2005-07-06 16:56:28 UTC (rev 16459)
@@ -24,7 +24,7 @@
 	<file>sysinfo.c</file>
 	<file>time.c</file>
 	<file>timer.c</file>
-    <pch>../include/hal.h</pch>
+	<pch>../include/hal.h</pch>
 </module>
 <module name="hal_generic_up" type="objectlibrary">
 	<include base="hal_generic_up">../include</include>

Modified: trunk/reactos/hal/halx86/xbox/halxbox.xml
--- trunk/reactos/hal/halx86/xbox/halxbox.xml	2005-07-06 16:27:58 UTC (rev 16458)
+++ trunk/reactos/hal/halx86/xbox/halxbox.xml	2005-07-06 16:56:28 UTC (rev 16459)
@@ -15,5 +15,4 @@
 	<file>part_xbox.c</file>
 	<file>pci_xbox.c</file>
 	<file>halxbox.rc</file>
-    <pch>../include/hal.h</pch>
 </module>

Modified: trunk/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
--- trunk/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-07-06 16:27:58 UTC (rev 16458)
+++ trunk/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-07-06 16:56:28 UTC (rev 16459)
@@ -633,13 +633,24 @@
 	const IfableData& data )
 {
 	size_t i;
+	bool generateAssignment;
 
-	fprintf (
-		fMakefile,
-		"%s %s",
-		macro.c_str(),
-		assignmentOperation );
-	
+	generateAssignment = (use_pch && module.pch != NULL ) || data.includes.size () > 0 || data.defines.size () > 0 || data.compilerFlags.size () > 0;
+	if ( generateAssignment )
+	{
+		fprintf ( fMakefile,
+		          "%s %s",
+		          macro.c_str(),
+		          assignmentOperation );
+	}
+
+	if ( use_pch && module.pch != NULL )
+	{
+		fprintf ( fMakefile,
+		          " -I %s",
+		          GetDirectory ( GetPrecompiledHeaderFilename () ).c_str () );
+	}
+
 	string compilerParameters = GenerateCompilerParametersFromVector ( data.compilerFlags );
 	if ( compilerParameters.size () > 0 )
 	{
@@ -669,7 +680,10 @@
 				"=%s",
 				d.value.c_str() );
 	}
-	fprintf ( fMakefile, "\n" );
+	if ( generateAssignment )
+	{
+		fprintf ( fMakefile, "\n" );
+	}
 }
 
 void
@@ -680,15 +694,12 @@
 {
 	size_t i;
 
-	if ( data.includes.size () > 0 || data.defines.size () > 0 || data.compilerFlags.size () > 0 )
-	{
-		GenerateMacro ( assignmentOperation,
-		                cflagsMacro,
-		                data );
-		GenerateMacro ( assignmentOperation,
-		                windresflagsMacro,
-		                data );
-	}
+	GenerateMacro ( assignmentOperation,
+	                cflagsMacro,
+	                data );
+	GenerateMacro ( assignmentOperation,
+	                windresflagsMacro,
+	                data );
 	
 	if ( linkerFlags != NULL )
 	{
@@ -844,6 +855,14 @@
 	CleanupFileVector ( sourceFiles );
 }
 
+string
+MingwModuleHandler::GetPrecompiledHeaderFilename () const
+{
+	const string& basePchFilename = module.pch->file.name + ".gch";
+	return PassThruCacheDirectory ( NormalizeFilename ( basePchFilename ),
+	                                backend->intermediateDirectory );
+}
+
 void
 MingwModuleHandler::GenerateGccCommand (
 	const string& sourceFilename,
@@ -852,7 +871,7 @@
 {
 	string dependencies = sourceFilename;
 	if ( module.pch && use_pch )
-		dependencies += " " + module.pch->file.name + ".gch";
+		dependencies += " " + GetPrecompiledHeaderFilename ();
 	
 	/* WIDL generated headers may be used */
 	dependencies += " " + GetLinkingDependenciesMacro ();
@@ -1458,27 +1477,22 @@
 	const string& windresflagsMacro,
 	const string& widlflagsMacro )
 {
-	if ( module.pch )
+	if ( module.pch && use_pch )
 	{
-		const string& pch_file = module.pch->file.name;
-		string gch_file = pch_file + ".gch";
-		CLEAN_FILE(gch_file);
-		if ( use_pch )
-		{
-			fprintf (
-				fMakefile,
-				"%s: %s\n",
-				gch_file.c_str(),
-				pch_file.c_str() );
-			fprintf ( fMakefile, "\t$(ECHO_PCH)\n" );
-			fprintf (
-				fMakefile,
-				"\t%s -o %s %s -g %s\n\n",
-				( module.cplusplus ? cppc.c_str() : cc.c_str() ),
-				gch_file.c_str(),
-				cflagsMacro.c_str(),
-				pch_file.c_str() );
-		}
+		const string& baseHeaderFilename = module.pch->file.name;
+		const string& pchFilename = GetPrecompiledHeaderFilename ();
+		CLEAN_FILE(pchFilename);
+		fprintf ( fMakefile,
+		          "%s: %s\n",
+		          pchFilename.c_str(),
+		          baseHeaderFilename.c_str() );
+		fprintf ( fMakefile, "\t$(ECHO_PCH)\n" );
+		fprintf ( fMakefile,
+		          "\t%s -o %s %s -g %s\n\n",
+		          module.cplusplus ? cppc.c_str() : cc.c_str(),
+		          pchFilename.c_str(),
+		          cflagsMacro.c_str(),
+		          baseHeaderFilename.c_str() );
 	}
 
 	GenerateObjectFileTargets ( module.non_if_data,

Modified: trunk/reactos/tools/rbuild/backend/mingw/modulehandler.h
--- trunk/reactos/tools/rbuild/backend/mingw/modulehandler.h	2005-07-06 16:27:58 UTC (rev 16458)
+++ trunk/reactos/tools/rbuild/backend/mingw/modulehandler.h	2005-07-06 16:56:28 UTC (rev 16459)
@@ -124,6 +124,7 @@
 	std::string GenerateGccIncludeParameters () const;
 	std::string GenerateGccParameters () const;
 	std::string GenerateNasmParameters () const;
+	std::string MingwModuleHandler::GetPrecompiledHeaderFilename () const;
 	void GenerateGccCommand ( const std::string& sourceFilename,
 	                          const std::string& cc,
 	                          const std::string& cflagsMacro );