* Correct dependencies for ROS_INTERMEDIATE <> . in generated makefile
* GNU make don't support depending on a directory, so simulate the dependency using a file
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.h

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-03-13 21:34:15 UTC (rev 14033)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-03-13 21:34:47 UTC (rev 14034)
@@ -6,7 +6,10 @@
 
 using std::string;
 using std::vector;
+using std::set;
 
+typedef set<string> set_string;
+
 static class MingwFactory : public Backend::Factory
 {
 public:
@@ -24,6 +27,19 @@
 }
 
 void
+MingwBackend::CreateDirectoryTargetIfNotYetCreated ( const string& directory )
+{
+	directories.insert ( directory );
+}
+
+const string
+MingwBackend::GetDirectoryDependency ( const string& directory )
+{
+	return directory + SSEP "$(CREATED)";
+}
+
+
+void
 MingwBackend::Process ()
 {
 	DetectPCHSupport();
@@ -39,6 +55,7 @@
 		Module& module = *ProjectNode.modules[i];
 		ProcessModule ( module );
 	}
+	GenerateDirectoryTargets ();
 	CheckAutomaticDependencies ();
 	CloseMakefile ();
 }
@@ -160,8 +177,7 @@
 void
 MingwBackend::GenerateGlobalVariables () const
 {
-#define TOOL_PREFIX "$(Q)." SSEP "tools" SSEP
-	fprintf ( fMakefile, "mkdir = " TOOL_PREFIX "rmkdir" EXEPOSTFIX "\n" );
+#define TOOL_PREFIX "$(Q)$(INTERMEDIATE)tools" SSEP
 	fprintf ( fMakefile, "winebuild = " TOOL_PREFIX "winebuild" SSEP "winebuild" EXEPOSTFIX "\n" );
 	fprintf ( fMakefile, "bin2res = " TOOL_PREFIX "bin2res" SSEP "bin2res" EXEPOSTFIX "\n" );
 	fprintf ( fMakefile, "cabman = " TOOL_PREFIX "cabman" SSEP "cabman" EXEPOSTFIX "\n" );
@@ -230,24 +246,10 @@
 void
 MingwBackend::GenerateInitTarget () const
 {
-	string tools = "$(ROS_INTERMEDIATE)." SSEP "tools";
 	fprintf ( fMakefile,
-	          "INIT = %s %s\n",
-	          tools.c_str (),
+	          "INIT = %s\n",
 	          GetBuildToolDependencies ().c_str () );
-
 	fprintf ( fMakefile,
-	          "%s:\n",
-	          tools.c_str () );
-	fprintf ( fMakefile,
-	          "ifneq ($(ROS_INTERMEDIATE),)\n" );
-	fprintf ( fMakefile,
-	          "\t${nmkdir} $(ROS_INTERMEDIATE)\n" );
-	fprintf ( fMakefile,
-	          "endif\n" );
-	fprintf ( fMakefile,
-	          "\t${nmkdir} $(ROS_INTERMEDIATE)." SSEP "tools\n" );
-	fprintf ( fMakefile,
 	          "\n" );
 }
 
@@ -301,11 +303,12 @@
 }
 
 void
-MingwBackend::ProcessModule ( Module& module ) const
+MingwBackend::ProcessModule ( Module& module )
 {
-	MingwModuleHandler* h = MingwModuleHandler::LookupHandler (
+	MingwModuleHandler* h = MingwModuleHandler::InstanciateHandler (
 		module.node.location,
-		module.type );
+		module.type,
+	    this );
 	MingwModuleHandler::string_list clean_files;
 	if ( module.host == HostDefault )
 	{
@@ -314,13 +317,46 @@
 	}
 	h->Process ( module, clean_files );
 	h->GenerateCleanTarget ( module, clean_files );
-	h->GenerateDirectoryTargets ();
 }
 
+bool
+MingwBackend::IncludeDirectoryTarget ( const string& directory ) const
+{
+	if ( directory == "$(INTERMEDIATE)tools")
+		return false;
+	else
+		return true;
+}
+
+void
+MingwBackend::GenerateDirectoryTargets ()
+{
+	if ( directories.size () == 0 )
+		return;
+	
+	set_string::iterator i;
+	for ( i = directories.begin ();
+	      i != directories.end ();
+	      i++ )
+	{
+		if ( IncludeDirectoryTarget ( *i ) )
+		{
+			fprintf ( fMakefile,
+			          "%s:\n",
+			          GetDirectoryDependency ( *i ).c_str () );
+			fprintf ( fMakefile, 
+			          "\t${mkdir} %s\n\n",
+			          i->c_str () );
+		}
+	}
+
+	directories.clear ();
+}
+
 string
 FixupTargetFilename ( const string& targetFilename )
 {
-	return string("$(ROS_INTERMEDIATE)") + NormalizeFilename ( targetFilename );
+	return string("$(INTERMEDIATE)") + NormalizeFilename ( targetFilename );
 }
 
 void

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h	2005-03-13 21:34:15 UTC (rev 14033)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h	2005-03-13 21:34:47 UTC (rev 14034)
@@ -10,8 +10,10 @@
 	MingwBackend ( Project& project );
 	virtual ~MingwBackend () { };
 	virtual void Process ();
+	void CreateDirectoryTargetIfNotYetCreated ( const std::string& directory );
+	const std::string GetDirectoryDependency ( const std::string& directory );
 private:
-	void ProcessModule ( Module& module ) const;
+	void ProcessModule ( Module& module );
 	void CreateMakefile ();
 	void CloseMakefile () const;
 	void GenerateHeader () const;
@@ -20,7 +22,7 @@
 	void GenerateGlobalCFlagsAndProperties ( const char* op,
 	                                         IfableData& data ) const;
 	std::string GenerateProjectLFLAGS () const;
-	void GenerateDirectoryTargets () const;
+	void GenerateDirectoryTargets ();
 	void GenerateGlobalVariables () const;
 	bool IncludeInAllTarget ( const Module& module ) const;
 	void GenerateAllTarget () const;
@@ -28,8 +30,9 @@
 	void GenerateInitTarget () const;
 	void GenerateXmlBuildFilesMacro() const;
 	void CheckAutomaticDependencies ();
+	bool IncludeDirectoryTarget ( const std::string& directory ) const;
 	void DetectPCHSupport();
-
+	std::set<std::string> directories;
 	FILE* fMakefile;
 	bool use_pch;
 };

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-03-13 21:34:15 UTC (rev 14033)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-03-13 21:34:47 UTC (rev 14034)
@@ -7,20 +7,9 @@
 
 using std::string;
 using std::vector;
-using std::map;
-using std::set;
 
-typedef set<string> set_string;
-
 #define CLEAN_FILE(f) clean_files.push_back ( f ); /*if ( module.name == "crt" ) printf ( "%s(%i): clean: %s\n", __FILE__, __LINE__, f.c_str() )*/
 
-map<ModuleType,MingwModuleHandler*>*
-MingwModuleHandler::handler_map = NULL;
-set_string
-MingwModuleHandler::directory_set;
-int
-MingwModuleHandler::ref = 0;
-
 FILE*
 MingwModuleHandler::fMakefile = NULL;
 bool
@@ -84,29 +73,29 @@
 	return s;
 }
 
-MingwModuleHandler::MingwModuleHandler ( ModuleType moduletype )
+MingwModuleHandler::MingwModuleHandler ( ModuleType moduletype,
+                                         MingwBackend* backend_ )
+	: backend ( backend_ )
 {
-	if ( !ref++ )
-		handler_map = new map<ModuleType,MingwModuleHandler*>;
-	(*handler_map)[moduletype] = this;
 }
 
 MingwModuleHandler::~MingwModuleHandler()
 {
-	if ( !--ref )
-	{
-		delete handler_map;
-		handler_map = NULL;
-	}
 }
 
 const string &
-MingwModuleHandler::PassThruCacheDirectory ( const string &file ) const 
+MingwModuleHandler::PassThruCacheDirectory ( const string &file )
 {
-	directory_set.insert ( GetDirectory ( file ) );
+	backend->CreateDirectoryTargetIfNotYetCreated ( GetDirectory ( file ) );
 	return file;
 }
 
+const string
+MingwModuleHandler::GetDirectoryDependency ( const string& file )
+{
+	return backend->GetDirectoryDependency ( GetDirectory ( file ) );
+}
+
 void
 MingwModuleHandler::SetMakefile ( FILE* f )
 {
@@ -120,18 +109,57 @@
 }
 
 MingwModuleHandler*
-MingwModuleHandler::LookupHandler ( const string& location,
-                                    ModuleType moduletype )
+MingwModuleHandler::InstanciateHandler ( const string& location,
+                                         ModuleType moduletype,
+                                         MingwBackend* backend )
 {
-	if ( !handler_map )
-		throw Exception ( "internal tool error: no registered module handlers" );
-	MingwModuleHandler* h = (*handler_map)[moduletype];
-	if ( !h )
+	MingwModuleHandler* handler;
+	switch ( moduletype )
 	{
-		throw UnknownModuleTypeException ( location, moduletype );
-		return NULL;
+		case BuildTool:
+			handler = new MingwBuildToolModuleHandler ( backend );
+			break;
+		case StaticLibrary:
+			handler = new MingwStaticLibraryModuleHandler ( backend );
+			break;
+		case ObjectLibrary:
+			handler = new MingwObjectLibraryModuleHandler ( backend );
+			break;
+		case Kernel:
+			handler = new MingwKernelModuleHandler ( backend );
+			break;
+		case NativeCUI:
+			handler = new MingwNativeCUIModuleHandler ( backend );
+			break;
+		case Win32CUI:
+			handler = new MingwWin32CUIModuleHandler ( backend );
+			break;
+		case Win32GUI:
+			handler = new MingwWin32GUIModuleHandler ( backend );
+			break;
+		case KernelModeDLL:
+			handler = new MingwKernelModeDLLModuleHandler ( backend );
+			break;
+		case NativeDLL:
+			handler = new MingwNativeDLLModuleHandler ( backend );
+			break;
+		case Win32DLL:
+			handler = new MingwWin32DLLModuleHandler ( backend );
+			break;
+		case KernelModeDriver:
+			handler = new MingwKernelModeDriverModuleHandler ( backend );
+			break;
+		case BootLoader:
+			handler = new MingwBootLoaderModuleHandler ( backend );
+			break;
+		case BootSector:
+			handler = new MingwBootSectorModuleHandler ( backend );
+			break;
+		case Iso:
+			handler = new MingwIsoModuleHandler ( backend );
+			break;
 	}
-	return h;
+	return handler;
 }
 
 string
@@ -180,7 +208,7 @@
 }
 
 string
-MingwModuleHandler::GetImportLibraryDependency ( const Module& importedModule ) const
+MingwModuleHandler::GetImportLibraryDependency ( const Module& importedModule )
 {
 	if ( importedModule.type == ObjectLibrary )
 		return GetObjectsMacro ( importedModule );
@@ -189,7 +217,7 @@
 }
 
 string
-MingwModuleHandler::GetModuleDependencies ( const Module& module ) const
+MingwModuleHandler::GetModuleDependencies ( const Module& module )
 {
 	if ( module.dependencies.size () == 0 )
 		return "";
@@ -297,7 +325,7 @@
 }
 
 string
-MingwModuleHandler::GetObjectFilenames ( const Module& module ) const
+MingwModuleHandler::GetObjectFilenames ( const Module& module )
 {
 	const vector<File*>& files = module.non_if_data.files;
 	if ( files.size () == 0 )
@@ -314,65 +342,6 @@
 	return objectFilenames;
 }
 
-bool
-MingwModuleHandler::IncludeDirectoryTarget ( const string& directory ) const
-{
-	if ( directory == "$(ROS_INTERMEDIATE)." SSEP "tools")
-		return false;
-	else
-		return true;
-}
-
-void
-MingwModuleHandler::GenerateDirectoryTargets () const
-{
-	if ( directory_set.size () == 0 )
-		return;
-	
-	set_string::iterator it;
-	size_t wrap_count = 0;
-
-	fprintf ( fMakefile, "ifneq ($(ROS_INTERMEDIATE),)\n" );
-	fprintf ( fMakefile, "directories::" );
-
-	for ( it = directory_set.begin ();
-	      it != directory_set.end ();
-	      it++ )
-	{
-		if ( IncludeDirectoryTarget ( *it ) )
-		{
-			if ( wrap_count++ == 5 )
-				fprintf ( fMakefile, " \\\n\t\t" ), wrap_count = 0;
-			fprintf ( fMakefile,
-			          " %s",
-			          it->c_str () );
-		}
-	}
-
-	fprintf ( fMakefile, "\n\n" );
-	wrap_count = 0;
-
-	for ( it = directory_set.begin ();
-	      it != directory_set.end ();
-	      it++ )
-	{
-		if ( IncludeDirectoryTarget ( *it ) )
-		{
-			if ( wrap_count++ == 5 )
-				fprintf ( fMakefile, " \\\n\t\t" ), wrap_count = 0;
-			fprintf ( fMakefile,
-			          "%s ",
-			          it->c_str () );
-		}
-	}
-
-	fprintf ( fMakefile, 
-	          "::\n\t${mkdir} $@\n" );
-	fprintf ( fMakefile, "endif\n\n" );
-
-	directory_set.clear ();
-}
-
 string
 MingwModuleHandler::GenerateGccDefineParametersFromVector ( const vector<Define*>& defines ) const
 {
@@ -476,7 +445,7 @@
 
 string
 MingwModuleHandler::GenerateImportLibraryDependenciesFromVector (
-	const vector<Library*>& libraries ) const
+	const vector<Library*>& libraries )
 {
 	string dependencies ( "" );
 	int wrap_count = 0;
@@ -502,7 +471,7 @@
 	const char* assignmentOperation,
 	const string& macro,
 	const IfableData& data,
-	const vector<CompilerFlag*>* compilerFlags ) const
+	const vector<CompilerFlag*>* compilerFlags )
 {
 	size_t i;
 
@@ -560,7 +529,7 @@
 	const string& linkerflags_macro,
 	const string& objs_macro,
 	const string& libs_macro,
-	const string& linkdeps_macro ) const
+	const string& linkdeps_macro )
 {
 	size_t i;
 
@@ -685,7 +654,7 @@
 	const string& linkerflags_macro,
 	const string& objs_macro,
 	const string& libs_macro,
-	const string& linkdeps_macro ) const
+	const string& linkdeps_macro )
 {
 	GenerateMacros (
 		module,
@@ -754,7 +723,7 @@
 MingwModuleHandler::GenerateGccCommand ( const Module& module,
                                          const string& sourceFilename,
                                          const string& cc,
-                                         const string& cflagsMacro ) const
+                                         const string& cflagsMacro )
 {
 	string deps = sourceFilename;
 	if ( module.pch && use_pch )
@@ -762,8 +731,9 @@
 	string objectFilename = PassThruCacheDirectory (
 		GetObjectFilename ( module, sourceFilename ) );
 	fprintf ( fMakefile,
-	          "%s: %s\n",
+	          "%s: %s %s\n",
 	          objectFilename.c_str (),
+	          GetDirectoryDependency ( objectFilename ).c_str (),
 	          deps.c_str () );
 	fprintf ( fMakefile, "\t$(ECHO_CC)\n" );
 	fprintf ( fMakefile,
@@ -778,13 +748,14 @@
 MingwModuleHandler::GenerateGccAssemblerCommand ( const Module& module,
                                                   const string& sourceFilename,
                                                   const string& cc,
-                                                  const string& cflagsMacro ) const
+                                                  const string& cflagsMacro )
 {
 	string objectFilename = PassThruCacheDirectory (
 		GetObjectFilename ( module, sourceFilename ) );
 	fprintf ( fMakefile,
-	          "%s: %s\n",
+	          "%s: %s %s\n",
 	          objectFilename.c_str (),
+	          GetDirectoryDependency ( objectFilename ).c_str (),
 	          sourceFilename.c_str () );
 	fprintf ( fMakefile, "\t$(ECHO_GAS)\n" );
 	fprintf ( fMakefile,
@@ -798,13 +769,14 @@
 void
 MingwModuleHandler::GenerateNasmCommand ( const Module& module,
                                           const string& sourceFilename,
-                                          const string& nasmflagsMacro ) const
+                                          const string& nasmflagsMacro )
 {
 	string objectFilename = PassThruCacheDirectory (
 		GetObjectFilename ( module, sourceFilename ) );
 	fprintf ( fMakefile,
-	          "%s: %s\n",
+	          "%s: %s %s\n",
 	          objectFilename.c_str (),
+	          GetDirectoryDependency ( objectFilename ).c_str (),
 	          sourceFilename.c_str () );
 	fprintf ( fMakefile, "\t$(ECHO_NASM)\n" );
 	fprintf ( fMakefile,
@@ -818,7 +790,7 @@
 void
 MingwModuleHandler::GenerateWindresCommand ( const Module& module,
                                              const string& sourceFilename,
-                                             const string& windresflagsMacro ) const
+                                             const string& windresflagsMacro )
 {
 	string objectFilename = PassThruCacheDirectory ( 
 		GetObjectFilename ( module, sourceFilename ) );
@@ -827,8 +799,9 @@
 	string resFilename = ReplaceExtension ( sourceFilename,
 	                                        ".res" );
 	fprintf ( fMakefile,
-	          "%s: %s $(WRC_TARGET)\n",
+	          "%s: %s %s $(WRC_TARGET)\n",
 	          objectFilename.c_str (),
+	          GetDirectoryDependency ( objectFilename ).c_str (),
 	          sourceFilename.c_str () );
 	fprintf ( fMakefile, "\t$(ECHO_WRC)\n" );
 	fprintf ( fMakefile,
@@ -899,7 +872,7 @@
 	const string& cflagsMacro,
 	const string& nasmflagsMacro,
 	const string& windresflagsMacro,
-	string_list& clean_files ) const
+	string_list& clean_files )
 {
 	CLEAN_FILE ( GetObjectFilename(module,sourceFilename) );
 	string extension = GetExtension ( sourceFilename );
@@ -1059,7 +1032,7 @@
 	const string& cflagsMacro,
 	const string& nasmflagsMacro,
 	const string& windresflagsMacro,
-	string_list& clean_files ) const
+	string_list& clean_files )
 {
 	size_t i;
 
@@ -1101,7 +1074,7 @@
 	const string& cflagsMacro,
 	const string& nasmflagsMacro,
 	const string& windresflagsMacro,
-	string_list& clean_files ) const
+	string_list& clean_files )
 {
 	if ( module.pch )
 	{
@@ -1198,7 +1171,7 @@
 	const Module& module,
 	const string* cflags,
 	const string* nasmflags,
-	string_list& clean_files ) const
+	string_list& clean_files )
 {
 	string cc = ( module.host == HostTrue ? "${host_gcc}" : "${gcc}" );
 	string cppc = ( module.host == HostTrue ? "${host_gpp}" : "${gpp}" );
@@ -1213,13 +1186,13 @@
 	string linkDepsMacro = ssprintf ("%s_LINKDEPS", module.name.c_str ());
 
 	GenerateMacros ( module,
-	                cflagsMacro,
-	                nasmflagsMacro,
-	                windresflagsMacro,
-	                linkerFlagsMacro,
-	                objectsMacro,
-	                libsMacro,
-	                linkDepsMacro );
+	                 cflagsMacro,
+	                 nasmflagsMacro,
+	                 windresflagsMacro,
+	                 linkerFlagsMacro,
+	                 objectsMacro,
+	                 libsMacro,
+	                 linkDepsMacro );
 
 	if ( cflags != NULL )
 	{
@@ -1267,7 +1240,7 @@
 }
 
 string
-MingwModuleHandler::GetInvocationDependencies ( const Module& module ) const
+MingwModuleHandler::GetInvocationDependencies ( const Module& module )
 {
 	string dependencies;
 	for ( size_t i = 0; i < module.invocations.size (); i++ )
@@ -1332,13 +1305,13 @@
 	if ( module.type == BuildTool
 		|| module.name == "zlib"
 		|| module.name == "hostzlib" )
-		return "$(ROS_INTERMEDIATE)." SSEP "tools $(ROS_INTERMEDIATE)." SSEP "lib" SSEP "zlib";
+		return "";
 	else
 		return "$(INIT)";
 }
 
 void
-MingwModuleHandler::GeneratePreconditionDependencies ( const Module& module ) const
+MingwModuleHandler::GeneratePreconditionDependencies ( const Module& module )
 {
 	string preconditionDependenciesName = GetPreconditionDependenciesName ( module );
 	string sourceFilenames = GetSourceFilenamesWithoutGeneratedFiles ( module );
@@ -1392,16 +1365,17 @@
 void
 MingwModuleHandler::GenerateImportLibraryTargetIfNeeded (
 	const Module& module,
-	string_list& clean_files ) const
+	string_list& clean_files )
 {
 	if ( module.importLibrary != NULL )
 	{
-		string library_target = FixupTargetFilename( module.GetDependencyPath () ).c_str ();
+		string library_target = PassThruCacheDirectory ( FixupTargetFilename ( module.GetDependencyPath () ) ).c_str ();
 		CLEAN_FILE ( library_target );
 
 		string definitionDependencies = GetDefinitionDependencies ( module );
-		fprintf ( fMakefile, "%s: %s\n",
+		fprintf ( fMakefile, "%s: %s %s\n",
 		          library_target.c_str (),
+		          GetDirectoryDependency ( library_target ).c_str (),
 		          definitionDependencies.c_str () );
 
 		fprintf ( fMakefile, "\t$(ECHO_DLLTOOL)\n" );
@@ -1424,7 +1398,7 @@
 }
 
 string
-MingwModuleHandler::GetDefinitionDependencies ( const Module& module ) const
+MingwModuleHandler::GetDefinitionDependencies ( const Module& module )
 {
 	string dependencies;
 	string dkNkmLibNoFixup = "dk/nkm/lib";
@@ -1446,16 +1420,15 @@
 }
 
 bool
-MingwModuleHandler::IsCPlusPlusModule ( const Module& module ) const
+MingwModuleHandler::IsCPlusPlusModule ( const Module& module )
 {
 	return module.cplusplus;
 }
 
 
-static MingwBuildToolModuleHandler buildtool_handler;
-
-MingwBuildToolModuleHandler::MingwBuildToolModuleHandler()
-	: MingwModuleHandler ( BuildTool )
+MingwBuildToolModuleHandler::MingwBuildToolModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( BuildTool,
+	                       backend )
 {
 }
 
@@ -1502,10 +1475,9 @@
 }
 
 
-static MingwKernelModuleHandler kernelmodule_handler;
-
-MingwKernelModuleHandler::MingwKernelModuleHandler ()
-	: MingwModuleHandler ( Kernel )
+MingwKernelModuleHandler::MingwKernelModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( Kernel,
+	                       backend )
 {
 }
 
@@ -1587,10 +1559,9 @@
 }
 
 
-static MingwStaticLibraryModuleHandler staticlibrary_handler;
-
-MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ()
-	: MingwModuleHandler ( StaticLibrary )
+MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( StaticLibrary,
+	                       backend )
 {
 }
 
@@ -1609,10 +1580,9 @@
 }
 
 
-static MingwObjectLibraryModuleHandler objectlibrary_handler;
-
-MingwObjectLibraryModuleHandler::MingwObjectLibraryModuleHandler ()
-	: MingwModuleHandler ( ObjectLibrary )
+MingwObjectLibraryModuleHandler::MingwObjectLibraryModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( ObjectLibrary,
+	                       backend )
 {
 }
 
@@ -1631,10 +1601,9 @@
 }
 
 
-static MingwKernelModeDLLModuleHandler kernelmodedll_handler;
-
-MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler ()
-	: MingwModuleHandler ( KernelModeDLL )
+MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( KernelModeDLL,
+	                       backend )
 {
 }
 
@@ -1689,10 +1658,9 @@
 }
 
 
-static MingwKernelModeDriverModuleHandler kernelmodedriver_handler;
-
-MingwKernelModeDriverModuleHandler::MingwKernelModeDriverModuleHandler ()
-	: MingwModuleHandler ( KernelModeDriver )
+MingwKernelModeDriverModuleHandler::MingwKernelModeDriverModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( KernelModeDriver,
+	                       backend )
 {
 }
 
@@ -1752,10 +1720,9 @@
 }
 
 
-static MingwNativeDLLModuleHandler nativedll_handler;
-
-MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler ()
-	: MingwModuleHandler ( NativeDLL )
+MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( NativeDLL,
+	                       backend )
 {
 }
 
@@ -1808,10 +1775,9 @@
 }
 
 
-static MingwNativeCUIModuleHandler nativecui_handler;
-
-MingwNativeCUIModuleHandler::MingwNativeCUIModuleHandler ()
-	: MingwModuleHandler ( NativeCUI )
+MingwNativeCUIModuleHandler::MingwNativeCUIModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( NativeCUI,
+	                       backend )
 {
 }
 
@@ -1868,10 +1834,9 @@
 }
 
 
-static MingwWin32DLLModuleHandler win32dll_handler;
-
-MingwWin32DLLModuleHandler::MingwWin32DLLModuleHandler ()
-	: MingwModuleHandler ( Win32DLL )
+MingwWin32DLLModuleHandler::MingwWin32DLLModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( Win32DLL,
+	                       backend )
 {
 }
 
@@ -1954,10 +1919,9 @@
 }
 
 
-static MingwWin32CUIModuleHandler win32cui_handler;
-
-MingwWin32CUIModuleHandler::MingwWin32CUIModuleHandler ()
-	: MingwModuleHandler ( Win32CUI )
+MingwWin32CUIModuleHandler::MingwWin32CUIModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( Win32CUI,
+	                       backend )
 {
 }
 
@@ -2016,10 +1980,9 @@
 }
 
 
-static MingwWin32GUIModuleHandler win32gui_handler;
-
-MingwWin32GUIModuleHandler::MingwWin32GUIModuleHandler ()
-	: MingwModuleHandler ( Win32GUI )
+MingwWin32GUIModuleHandler::MingwWin32GUIModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( Win32GUI,
+	                       backend )
 {
 }
 
@@ -2078,10 +2041,9 @@
 }
 
 
-static MingwBootLoaderModuleHandler bootloadermodule_handler;
-
-MingwBootLoaderModuleHandler::MingwBootLoaderModuleHandler ()
-	: MingwModuleHandler ( BootLoader )
+MingwBootLoaderModuleHandler::MingwBootLoaderModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( BootLoader,
+	                       backend )
 {
 }
 
@@ -2133,10 +2095,9 @@
 }
 
 
-static MingwBootSectorModuleHandler bootsectormodule_handler;
-
-MingwBootSectorModuleHandler::MingwBootSectorModuleHandler ()
-	: MingwModuleHandler ( BootSector )
+MingwBootSectorModuleHandler::MingwBootSectorModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( BootSector,
+	                       backend )
 {
 }
 
@@ -2168,10 +2129,9 @@
 }
 
 
-static MingwIsoModuleHandler isomodule_handler;
-
-MingwIsoModuleHandler::MingwIsoModuleHandler ()
-	: MingwModuleHandler ( Iso )
+MingwIsoModuleHandler::MingwIsoModuleHandler ( MingwBackend* backend )
+	: MingwModuleHandler ( Iso,
+	                       backend )
 {
 }
 
@@ -2185,7 +2145,7 @@
 
 void
 MingwIsoModuleHandler::OutputBootstrapfileCopyCommands ( const string& bootcdDirectory,
-                                                         const Module& module ) const
+                                                         const Module& module )
 {
 	for ( size_t i = 0; i < module.project.modules.size (); i++ )
 	{
@@ -2204,7 +2164,7 @@
 
 void
 MingwIsoModuleHandler::OutputCdfileCopyCommands ( const string& bootcdDirectory,
-                                                  const Module& module ) const
+                                                  const Module& module )
 {
 	for ( size_t i = 0; i < module.project.cdfiles.size (); i++ )
 	{
@@ -2220,7 +2180,7 @@
 
 string
 MingwIsoModuleHandler::GetBootstrapCdDirectories ( const string& bootcdDirectory,
-                                                   const Module& module ) const
+                                                   const Module& module )
 {
 	string directories;
 	for ( size_t i = 0; i < module.project.modules.size (); i++ )
@@ -2231,7 +2191,7 @@
 			string targetDirecctory = bootcdDirectory + SSEP + m.bootstrap->base;
 			if ( directories.size () > 0 )
 				directories += " ";
-			directories += FixupTargetFilename ( targetDirecctory );
+			directories += GetDirectoryDependency ( PassThruCacheDirectory ( FixupTargetFilename ( targetDirecctory ) ) );
 		}
 	}
 	return directories;
@@ -2239,7 +2199,7 @@
 
 string
 MingwIsoModuleHandler::GetNonModuleCdDirectories ( const string& bootcdDirectory,
-                                                   const Module& module ) const
+                                                   const Module& module )
 {
 	string directories;
 	for ( size_t i = 0; i < module.project.cdfiles.size (); i++ )
@@ -2248,14 +2208,14 @@
 		string targetDirecctory = bootcdDirectory + SSEP + cdfile.base;
 		if ( directories.size () > 0 )
 			directories += " ";
-		directories += FixupTargetFilename ( targetDirecctory );
+		directories += GetDirectoryDependency ( PassThruCacheDirectory ( FixupTargetFilename ( targetDirecctory ) ) );
 	}
 	return directories;
 }
 
 string
 MingwIsoModuleHandler::GetCdDirectories ( const string& bootcdDirectory,
-                                          const Module& module ) const
+                                          const Module& module )
 {
 	string directories = GetBootstrapCdDirectories ( bootcdDirectory,
 	                                                 module );
@@ -2308,7 +2268,7 @@
 	PassThruCacheDirectory ( bootcdReactos + SSEP );
 	string reactosInf = FixupTargetFilename ( bootcdReactosNoFixup + "/reactos.inf" );
 	string reactosDff = NormalizeFilename ( "bootdata/packages/reactos.dff" );
-	string cdDirectories = bootcdReactos + " " + GetCdDirectories ( bootcdDirectory,
+	string cdDirectories = GetCdDirectories ( bootcdDirectory,
 	                                                                module );
 	vector<string> vCdFiles;
 	GetCdFiles ( vCdFiles, module );
@@ -2317,9 +2277,10 @@
 	fprintf ( fMakefile, ".PHONY: %s\n\n",
 	          module.name.c_str ());
 	fprintf ( fMakefile,
-	          "%s: all %s %s %s ${CABMAN_TARGET} ${CDMAKE_TARGET}\n",
+	          "%s: all %s %s %s %s ${CABMAN_TARGET} ${CDMAKE_TARGET}\n",
 	          module.name.c_str (),
 	          isoboot.c_str (),
+	          GetDirectoryDependency ( PassThruCacheDirectory ( bootcdReactos ) ).c_str (),
 	          cdDirectories.c_str (),
 	          cdFiles.c_str () );
 	fprintf ( fMakefile, "\t$(ECHO_CABMAN)\n" );
@@ -2328,10 +2289,10 @@
 	          reactosDff.c_str (),
 	          bootcdReactos.c_str () );
 	fprintf ( fMakefile,
-	          "\t${cabman} -C %s -RC %s -L %s -N\n",
+	          "\t${cabman} -C %s -RC %s -L %s -N -P $(OUTPUT)\n",
 	          reactosDff.c_str (),
 	          reactosInf.c_str (),
-	          bootcdReactos.c_str () );
+	          bootcdReactos.c_str ());
 	fprintf ( fMakefile,
 	          "\t-@${rm} %s\n",
 	          reactosInf.c_str () );

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.h	2005-03-13 21:34:15 UTC (rev 14033)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.h	2005-03-13 21:34:47 UTC (rev 14034)
@@ -2,7 +2,10 @@
 #define MINGW_MODULEHANDLER_H
 
 #include "../backend.h"
+#include "mingw.h"
 
+class MingwBackend;
+	
 extern std::string
 ReplaceExtension ( const std::string& filename,
                    const std::string& newExtension );
@@ -16,44 +19,42 @@
 {
 public:
 	typedef std::vector<std::string> string_list;
-
-	static std::map<ModuleType,MingwModuleHandler*>* handler_map;
-	static int ref;
-
-	MingwModuleHandler ( ModuleType moduletype );
+	MingwModuleHandler ( ModuleType moduletype,
+	                     MingwBackend* backend_ );
 	virtual ~MingwModuleHandler();
 
 	static void SetMakefile ( FILE* f );
+	static MingwModuleHandler* InstanciateHandler ( const std::string& location,
+	                                                ModuleType moduletype_,
+	                                                MingwBackend* backend_ );
 	static void SetUsePch ( bool use_pch );
 	static MingwModuleHandler* LookupHandler ( const std::string& location,
 	                                           ModuleType moduletype_ );
 	virtual HostType DefaultHost() = 0;
 	virtual void Process ( const Module& module, string_list& clean_files ) = 0;
-	bool IncludeDirectoryTarget ( const std::string& directory ) const;
-	void GenerateDirectoryTargets () const;
 	void GenerateCleanTarget ( const Module& module,
 	                           const string_list& clean_files ) const;
 protected:
-	const std::string &PassThruCacheDirectory ( const std::string &f ) const;
+	const std::string &PassThruCacheDirectory ( const std::string &f );
+	const std::string GetDirectoryDependency ( const std::string& file );
 	std::string GetWorkingDirectory () const;
 	std::string GetBasename ( const std::string& filename ) const;
 	std::string GetActualSourceFilename ( const std::string& filename ) const;
 	std::string GetModuleArchiveFilename ( const Module& module ) const;
 	bool IsGeneratedFile ( const File& file ) const;
-	std::string GetImportLibraryDependency ( const Module& importedModule ) const;
-	std::string GetModuleDependencies ( const Module& module ) const;
+	std::string GetImportLibraryDependency ( const Module& importedModule );
+	std::string GetModuleDependencies ( const Module& module );
 	std::string GetAllDependencies ( const Module& module ) const;
 	std::string GetSourceFilenames ( const Module& module,
 	                                 bool includeGeneratedFiles ) const;
 	std::string GetSourceFilenames ( const Module& module ) const;
 	std::string GetSourceFilenamesWithoutGeneratedFiles ( const Module& module ) const;
 
-	std::string GetObjectFilenames ( const Module& module ) const;
-	std::string GetInvocationDependencies ( const Module& module ) const;
+	std::string GetObjectFilenames ( const Module& module );
 	void GenerateInvocations ( const Module& module ) const;
 	
 	std::string GetPreconditionDependenciesName ( const Module& module ) const;
-	void GeneratePreconditionDependencies ( const Module& module ) const;
+	void GeneratePreconditionDependencies ( const Module& module );
 	std::string GetCFlagsMacro ( const Module& module ) const;
 	std::string GetObjectsMacro ( const Module& module ) const;
 	std::string GetLinkingDependenciesMacro ( const Module& module ) const;
@@ -70,14 +71,13 @@
 	void GenerateMacrosAndTargets ( const Module& module,
[truncated at 1000 lines; 255 more skipped]