From eb194612c3c8814de98d4e3ab4bca314e7b69802 Mon Sep 17 00:00:00 2001 From: Casper Hornstrup Date: Sun, 13 Mar 2005 21:34:47 +0000 Subject: [PATCH] * Correct dependencies for ROS_INTERMEDIATE <> . in generated makefile * GNU make don't support depending on a directory, so simulate the dependency using a file svn path=/branches/xmlbuildsystem/; revision=14034 --- reactos/tools/rbuild/backend/mingw/mingw.cpp | 80 ++-- reactos/tools/rbuild/backend/mingw/mingw.h | 9 +- .../rbuild/backend/mingw/modulehandler.cpp | 349 ++++++++---------- .../rbuild/backend/mingw/modulehandler.h | 100 ++--- 4 files changed, 270 insertions(+), 268 deletions(-) diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp index ad97d4f5f35..610439ba55c 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.cpp +++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp @@ -6,6 +6,9 @@ using std::string; using std::vector; +using std::set; + +typedef set set_string; static class MingwFactory : public Backend::Factory { @@ -23,6 +26,19 @@ MingwBackend::MingwBackend ( Project& project ) { } +void +MingwBackend::CreateDirectoryTargetIfNotYetCreated ( const string& directory ) +{ + directories.insert ( directory ); +} + +const string +MingwBackend::GetDirectoryDependency ( const string& directory ) +{ + return directory + SSEP "$(CREATED)"; +} + + void MingwBackend::Process () { @@ -39,6 +55,7 @@ MingwBackend::Process () Module& module = *ProjectNode.modules[i]; ProcessModule ( module ); } + GenerateDirectoryTargets (); CheckAutomaticDependencies (); CloseMakefile (); } @@ -160,8 +177,7 @@ MingwBackend::GenerateProjectLFLAGS () const 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,23 +246,9 @@ MingwBackend::GetBuildToolDependencies () const 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 @@ MingwBackend::CheckAutomaticDependencies () } 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 @@ MingwBackend::ProcessModule ( Module& module ) const } 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 diff --git a/reactos/tools/rbuild/backend/mingw/mingw.h b/reactos/tools/rbuild/backend/mingw/mingw.h index e14ba776011..d7cabbb3e8e 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.h +++ b/reactos/tools/rbuild/backend/mingw/mingw.h @@ -10,8 +10,10 @@ public: 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 @@ private: 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 @@ private: void GenerateInitTarget () const; void GenerateXmlBuildFilesMacro() const; void CheckAutomaticDependencies (); + bool IncludeDirectoryTarget ( const std::string& directory ) const; void DetectPCHSupport(); - + std::set directories; FILE* fMakefile; bool use_pch; }; diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp index 37596466bb1..8757cc4a416 100644 --- a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp +++ b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp @@ -7,20 +7,9 @@ using std::string; using std::vector; -using std::map; -using std::set; - -typedef set 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* -MingwModuleHandler::handler_map = NULL; -set_string -MingwModuleHandler::directory_set; -int -MingwModuleHandler::ref = 0; - FILE* MingwModuleHandler::fMakefile = NULL; bool @@ -84,29 +73,29 @@ string v2s ( const vector& v, int wrap_at ) return s; } -MingwModuleHandler::MingwModuleHandler ( ModuleType moduletype ) +MingwModuleHandler::MingwModuleHandler ( ModuleType moduletype, + MingwBackend* backend_ ) + : backend ( backend_ ) { - if ( !ref++ ) - handler_map = new map; - (*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::SetUsePch ( bool b ) } MingwModuleHandler* -MingwModuleHandler::LookupHandler ( const string& location, - ModuleType moduletype ) -{ - if ( !handler_map ) - throw Exception ( "internal tool error: no registered module handlers" ); - MingwModuleHandler* h = (*handler_map)[moduletype]; - if ( !h ) - { - throw UnknownModuleTypeException ( location, moduletype ); - return NULL; - } - return h; +MingwModuleHandler::InstanciateHandler ( const string& location, + ModuleType moduletype, + MingwBackend* backend ) +{ + MingwModuleHandler* handler; + switch ( moduletype ) + { + 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 handler; } string @@ -180,7 +208,7 @@ MingwModuleHandler::IsGeneratedFile ( const File& file ) const } string -MingwModuleHandler::GetImportLibraryDependency ( const Module& importedModule ) const +MingwModuleHandler::GetImportLibraryDependency ( const Module& importedModule ) { if ( importedModule.type == ObjectLibrary ) return GetObjectsMacro ( importedModule ); @@ -189,7 +217,7 @@ MingwModuleHandler::GetImportLibraryDependency ( const Module& importedModule ) } string -MingwModuleHandler::GetModuleDependencies ( const Module& module ) const +MingwModuleHandler::GetModuleDependencies ( const Module& module ) { if ( module.dependencies.size () == 0 ) return ""; @@ -297,7 +325,7 @@ MingwModuleHandler::GenerateCleanTarget ( } string -MingwModuleHandler::GetObjectFilenames ( const Module& module ) const +MingwModuleHandler::GetObjectFilenames ( const Module& module ) { const vector& files = module.non_if_data.files; if ( files.size () == 0 ) @@ -314,65 +342,6 @@ MingwModuleHandler::GetObjectFilenames ( const Module& module ) const 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& defines ) const { @@ -476,7 +445,7 @@ MingwModuleHandler::GenerateLinkerParametersFromVector ( const vector& libraries ) const + const vector& libraries ) { string dependencies ( "" ); int wrap_count = 0; @@ -502,7 +471,7 @@ MingwModuleHandler::GenerateMacro ( const char* assignmentOperation, const string& macro, const IfableData& data, - const vector* compilerFlags ) const + const vector* compilerFlags ) { size_t i; @@ -560,7 +529,7 @@ MingwModuleHandler::GenerateMacros ( 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 @@ MingwModuleHandler::GenerateMacros ( 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 @@ void 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 @@ MingwModuleHandler::GenerateGccCommand ( const Module& module, 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 @@ void 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 @@ MingwModuleHandler::GenerateGccAssemblerCommand ( const Module& module, 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 @@ MingwModuleHandler::GenerateNasmCommand ( const Module& module, 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 @@ MingwModuleHandler::GenerateWindresCommand ( const Module& module, 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 @@ MingwModuleHandler::GenerateCommands ( 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 @@ MingwModuleHandler::GenerateObjectFileTargets ( 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 @@ MingwModuleHandler::GenerateObjectFileTargets ( 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 @@ MingwModuleHandler::GenerateMacrosAndTargets ( 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 @@ MingwModuleHandler::GenerateMacrosAndTargets ( 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 @@ MingwModuleHandler::GenerateMacrosAndTargets ( } 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 @@ MingwModuleHandler::GetDefaultDependencies ( const Module& module ) const 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 @@ MingwModuleHandler::GeneratePreconditionDependencies ( const Module& module ) co 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 @@ MingwModuleHandler::GetSpecObjectDependencies ( const string& filename ) const } string -MingwModuleHandler::GetDefinitionDependencies ( const Module& module ) const +MingwModuleHandler::GetDefinitionDependencies ( const Module& module ) { string dependencies; string dkNkmLibNoFixup = "dk/nkm/lib"; @@ -1446,16 +1420,15 @@ MingwModuleHandler::GetDefinitionDependencies ( const Module& module ) const } 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 @@ MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ( const Module& modul } -static MingwKernelModuleHandler kernelmodule_handler; - -MingwKernelModuleHandler::MingwKernelModuleHandler () - : MingwModuleHandler ( Kernel ) +MingwKernelModuleHandler::MingwKernelModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( Kernel, + backend ) { } @@ -1587,10 +1559,9 @@ MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module& module, str } -static MingwStaticLibraryModuleHandler staticlibrary_handler; - -MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler () - : MingwModuleHandler ( StaticLibrary ) +MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( StaticLibrary, + backend ) { } @@ -1609,10 +1580,9 @@ MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Modul } -static MingwObjectLibraryModuleHandler objectlibrary_handler; - -MingwObjectLibraryModuleHandler::MingwObjectLibraryModuleHandler () - : MingwModuleHandler ( ObjectLibrary ) +MingwObjectLibraryModuleHandler::MingwObjectLibraryModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( ObjectLibrary, + backend ) { } @@ -1631,10 +1601,9 @@ MingwObjectLibraryModuleHandler::GenerateObjectLibraryModuleTarget ( const Modul } -static MingwKernelModeDLLModuleHandler kernelmodedll_handler; - -MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler () - : MingwModuleHandler ( KernelModeDLL ) +MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( KernelModeDLL, + backend ) { } @@ -1689,10 +1658,9 @@ MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ( } -static MingwKernelModeDriverModuleHandler kernelmodedriver_handler; - -MingwKernelModeDriverModuleHandler::MingwKernelModeDriverModuleHandler () - : MingwModuleHandler ( KernelModeDriver ) +MingwKernelModeDriverModuleHandler::MingwKernelModeDriverModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( KernelModeDriver, + backend ) { } @@ -1752,10 +1720,9 @@ MingwKernelModeDriverModuleHandler::GenerateKernelModeDriverModuleTarget ( } -static MingwNativeDLLModuleHandler nativedll_handler; - -MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler () - : MingwModuleHandler ( NativeDLL ) +MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( NativeDLL, + backend ) { } @@ -1808,10 +1775,9 @@ MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ( const Module& modul } -static MingwNativeCUIModuleHandler nativecui_handler; - -MingwNativeCUIModuleHandler::MingwNativeCUIModuleHandler () - : MingwModuleHandler ( NativeCUI ) +MingwNativeCUIModuleHandler::MingwNativeCUIModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( NativeCUI, + backend ) { } @@ -1868,10 +1834,9 @@ MingwNativeCUIModuleHandler::GenerateNativeCUIModuleTarget ( const Module& modul } -static MingwWin32DLLModuleHandler win32dll_handler; - -MingwWin32DLLModuleHandler::MingwWin32DLLModuleHandler () - : MingwModuleHandler ( Win32DLL ) +MingwWin32DLLModuleHandler::MingwWin32DLLModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( Win32DLL, + backend ) { } @@ -1954,10 +1919,9 @@ MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module& module, } -static MingwWin32CUIModuleHandler win32cui_handler; - -MingwWin32CUIModuleHandler::MingwWin32CUIModuleHandler () - : MingwModuleHandler ( Win32CUI ) +MingwWin32CUIModuleHandler::MingwWin32CUIModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( Win32CUI, + backend ) { } @@ -2016,10 +1980,9 @@ MingwWin32CUIModuleHandler::GenerateWin32CUIModuleTarget ( const Module& module, } -static MingwWin32GUIModuleHandler win32gui_handler; - -MingwWin32GUIModuleHandler::MingwWin32GUIModuleHandler () - : MingwModuleHandler ( Win32GUI ) +MingwWin32GUIModuleHandler::MingwWin32GUIModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( Win32GUI, + backend ) { } @@ -2078,10 +2041,9 @@ MingwWin32GUIModuleHandler::GenerateWin32GUIModuleTarget ( const Module& module, } -static MingwBootLoaderModuleHandler bootloadermodule_handler; - -MingwBootLoaderModuleHandler::MingwBootLoaderModuleHandler () - : MingwModuleHandler ( BootLoader ) +MingwBootLoaderModuleHandler::MingwBootLoaderModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( BootLoader, + backend ) { } @@ -2133,10 +2095,9 @@ MingwBootLoaderModuleHandler::GenerateBootLoaderModuleTarget ( } -static MingwBootSectorModuleHandler bootsectormodule_handler; - -MingwBootSectorModuleHandler::MingwBootSectorModuleHandler () - : MingwModuleHandler ( BootSector ) +MingwBootSectorModuleHandler::MingwBootSectorModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( BootSector, + backend ) { } @@ -2168,10 +2129,9 @@ MingwBootSectorModuleHandler::GenerateBootSectorModuleTarget ( const Module& mod } -static MingwIsoModuleHandler isomodule_handler; - -MingwIsoModuleHandler::MingwIsoModuleHandler () - : MingwModuleHandler ( Iso ) +MingwIsoModuleHandler::MingwIsoModuleHandler ( MingwBackend* backend ) + : MingwModuleHandler ( Iso, + backend ) { } @@ -2185,7 +2145,7 @@ MingwIsoModuleHandler::Process ( const Module& module, string_list& clean_files 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 @@ MingwIsoModuleHandler::OutputBootstrapfileCopyCommands ( const string& bootcdDir 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 @@ MingwIsoModuleHandler::OutputCdfileCopyCommands ( const string& bootcdDirectory, 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 @@ MingwIsoModuleHandler::GetBootstrapCdDirectories ( const string& bootcdDirectory 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 @@ MingwIsoModuleHandler::GetBootstrapCdDirectories ( const string& bootcdDirectory 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 @@ MingwIsoModuleHandler::GetNonModuleCdDirectories ( const string& bootcdDirectory 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 @@ MingwIsoModuleHandler::GenerateIsoModuleTarget ( const Module& module, string_li 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 vCdFiles; GetCdFiles ( vCdFiles, module ); @@ -2317,9 +2277,10 @@ MingwIsoModuleHandler::GenerateIsoModuleTarget ( const Module& module, string_li 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 @@ MingwIsoModuleHandler::GenerateIsoModuleTarget ( const Module& module, string_li 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 () ); diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.h b/reactos/tools/rbuild/backend/mingw/modulehandler.h index 469b9664e46..b94c3d039f6 100644 --- a/reactos/tools/rbuild/backend/mingw/modulehandler.h +++ b/reactos/tools/rbuild/backend/mingw/modulehandler.h @@ -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 @@ class MingwModuleHandler { public: typedef std::vector string_list; - - static std::map* 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 @@ protected: void GenerateMacrosAndTargets ( const Module& module, const std::string* clags, const std::string* nasmflags, - string_list& clean_files ) const; - void GenerateImportLibraryTargetIfNeeded ( const Module& module, string_list& clean_files ) const; - std::string GetDefinitionDependencies ( const Module& module ) const; + string_list& clean_files ); + void GenerateImportLibraryTargetIfNeeded ( const Module& module, string_list& clean_files ); + std::string GetDefinitionDependencies ( const Module& module ); std::string GetLinkingDependencies ( const Module& module ) const; - bool IsCPlusPlusModule ( const Module& module ) const; - static FILE* fMakefile; + bool IsCPlusPlusModule ( const Module& module ); + static FILE* fMakefile; static bool use_pch; - static std::set directory_set; private: std::string ConcatenatePaths ( const std::string& path1, const std::string& path2 ) const; @@ -86,12 +86,12 @@ private: std::string GenerateGccIncludeParametersFromVector ( const std::vector& includes ) const; std::string GenerateCompilerParametersFromVector ( const std::vector& compilerFlags ) const; std::string GenerateLinkerParametersFromVector ( const std::vector& linkerFlags ) const; - std::string GenerateImportLibraryDependenciesFromVector ( const std::vector& libraries ) const; + std::string GenerateImportLibraryDependenciesFromVector ( const std::vector& libraries ); std::string GenerateLinkerParameters ( const Module& module ) const; void GenerateMacro ( const char* assignmentOperation, const std::string& macro, const IfableData& data, - const std::vector* compilerFlags ) const; + const std::vector* compilerFlags ); void GenerateMacros ( const Module& module, const char* op, @@ -104,7 +104,7 @@ private: const std::string& linkerflags_macro, const std::string& objs_macro, const std::string& libs_macro, - const std::string& linkdeps_macro ) const; + const std::string& linkdeps_macro ); void GenerateMacros ( const Module& module, const std::string& cflags_macro, const std::string& nasmflags_macro, @@ -112,24 +112,24 @@ private: const std::string& linkerflags_macro, const std::string& objs_macro, const std::string& libs_macro, - const std::string& linkDepsMacro ) const; + const std::string& linkDepsMacro ); std::string GenerateGccIncludeParameters ( const Module& module ) const; std::string GenerateGccParameters ( const Module& module ) const; std::string GenerateNasmParameters ( const Module& module ) const; void GenerateGccCommand ( const Module& module, const std::string& sourceFilename, const std::string& cc, - const std::string& cflagsMacro ) const; + const std::string& cflagsMacro ); void GenerateGccAssemblerCommand ( const Module& module, const std::string& sourceFilename, const std::string& cc, - const std::string& cflagsMacro ) const; + const std::string& cflagsMacro ); void GenerateNasmCommand ( const Module& module, const std::string& sourceFilename, - const std::string& nasmflagsMacro ) const; + const std::string& nasmflagsMacro ); void GenerateWindresCommand ( const Module& module, const std::string& sourceFilename, - const std::string& windresflagsMacro ) const; + const std::string& windresflagsMacro ); void GenerateWinebuildCommands ( const Module& module, const std::string& sourceFilename, string_list& clean_files ) const; @@ -140,7 +140,7 @@ private: const std::string& cflagsMacro, const std::string& nasmflagsMacro, const std::string& windresflagsMacro, - string_list& clean_files ) const; + string_list& clean_files ); void GenerateObjectFileTargets ( const Module& module, const IfableData& data, const std::string& cc, @@ -148,26 +148,28 @@ private: const std::string& cflagsMacro, const std::string& nasmflagsMacro, const std::string& windresflagsMacro, - string_list& clean_files ) const; + string_list& clean_files ); void GenerateObjectFileTargets ( const Module& module, const std::string& cc, const std::string& cppc, const std::string& cflagsMacro, const std::string& nasmflagsMacro, const std::string& windresflagsMacro, - string_list& clean_files ) const; + string_list& clean_files ); std::string GenerateArchiveTarget ( const Module& module, const std::string& ar, const std::string& objs_macro ) const; std::string GetSpecObjectDependencies ( const std::string& filename ) const; std::string GetDefaultDependencies ( const Module& module ) const; + std::string GetInvocationDependencies ( const Module& module ); + MingwBackend* backend; }; class MingwBuildToolModuleHandler : public MingwModuleHandler { public: - MingwBuildToolModuleHandler (); + MingwBuildToolModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostTrue; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -178,7 +180,7 @@ private: class MingwKernelModuleHandler : public MingwModuleHandler { public: - MingwKernelModuleHandler (); + MingwKernelModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -189,7 +191,7 @@ private: class MingwStaticLibraryModuleHandler : public MingwModuleHandler { public: - MingwStaticLibraryModuleHandler (); + MingwStaticLibraryModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -200,7 +202,7 @@ private: class MingwObjectLibraryModuleHandler : public MingwModuleHandler { public: - MingwObjectLibraryModuleHandler (); + MingwObjectLibraryModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -211,7 +213,7 @@ private: class MingwKernelModeDLLModuleHandler : public MingwModuleHandler { public: - MingwKernelModeDLLModuleHandler (); + MingwKernelModeDLLModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -222,7 +224,7 @@ private: class MingwKernelModeDriverModuleHandler : public MingwModuleHandler { public: - MingwKernelModeDriverModuleHandler (); + MingwKernelModeDriverModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -233,7 +235,7 @@ private: class MingwNativeDLLModuleHandler : public MingwModuleHandler { public: - MingwNativeDLLModuleHandler (); + MingwNativeDLLModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -244,7 +246,7 @@ private: class MingwNativeCUIModuleHandler : public MingwModuleHandler { public: - MingwNativeCUIModuleHandler (); + MingwNativeCUIModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -255,7 +257,7 @@ private: class MingwWin32DLLModuleHandler : public MingwModuleHandler { public: - MingwWin32DLLModuleHandler (); + MingwWin32DLLModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -267,7 +269,7 @@ private: class MingwWin32CUIModuleHandler : public MingwModuleHandler { public: - MingwWin32CUIModuleHandler (); + MingwWin32CUIModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -278,7 +280,7 @@ private: class MingwWin32GUIModuleHandler : public MingwModuleHandler { public: - MingwWin32GUIModuleHandler (); + MingwWin32GUIModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -289,7 +291,7 @@ private: class MingwBootLoaderModuleHandler : public MingwModuleHandler { public: - MingwBootLoaderModuleHandler (); + MingwBootLoaderModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -300,7 +302,7 @@ private: class MingwBootSectorModuleHandler : public MingwModuleHandler { public: - MingwBootSectorModuleHandler (); + MingwBootSectorModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: @@ -311,17 +313,17 @@ private: class MingwIsoModuleHandler : public MingwModuleHandler { public: - MingwIsoModuleHandler (); + MingwIsoModuleHandler ( MingwBackend* backend ); virtual HostType DefaultHost() { return HostFalse; } virtual void Process ( const Module& module, string_list& clean_files ); private: void GenerateIsoModuleTarget ( const Module& module, string_list& clean_files ); std::string GetBootstrapCdDirectories ( const std::string& bootcdDirectory, - const Module& module ) const; + const Module& module ); std::string GetNonModuleCdDirectories ( const std::string& bootcdDirectory, - const Module& module ) const; + const Module& module ); std::string GetCdDirectories ( const std::string& bootcdDirectory, - const Module& module ) const; + const Module& module ); void GetBootstrapCdFiles ( std::vector& out, const Module& module ) const; void GetNonModuleCdFiles ( std::vector& out, @@ -329,9 +331,9 @@ private: void GetCdFiles ( std::vector& out, const Module& module ) const; void OutputBootstrapfileCopyCommands ( const std::string& bootcdDirectory, - const Module& module ) const; + const Module& module ); void OutputCdfileCopyCommands ( const std::string& bootcdDirectory, - const Module& module ) const; + const Module& module ); }; #endif /* MINGW_MODULEHANDLER_H */ -- 2.17.1