diff --git a/reactos/Makefile b/reactos/Makefile index 5999202494f..f19a598a7ee 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -54,6 +54,7 @@ # -c Clean as you go. Delete generated files as soon as they are not needed anymore. # -d Disable automatic dependencies. # -mi Let make handle creation of install directories. Rbuild will not generate the directories. +# -ps Generate proxy makefiles in source tree instead of the output tree. .PHONY: all .PHONY: clean diff --git a/reactos/tools/rbuild/XML.h b/reactos/tools/rbuild/XML.h index 8b1730a6616..997c49bb632 100644 --- a/reactos/tools/rbuild/XML.h +++ b/reactos/tools/rbuild/XML.h @@ -5,6 +5,8 @@ class XMLElement; +extern std::string working_directory; + void InitWorkingDirectory(); diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp index e6913baa22e..9b8a970c5b9 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.cpp +++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp @@ -645,12 +645,22 @@ MingwBackend::GenerateTestSupportCode () printf ( "done\n" ); } +string +MingwBackend::GetProxyMakefileTree () const +{ + if ( configuration.GenerateProxyMakefilesInSourceTree ) + return ""; + else + return Environment::GetOutputPath (); +} + void MingwBackend::GenerateProxyMakefiles () { printf ( "Generating proxy makefiles..." ); ProxyMakefile proxyMakefile ( ProjectNode ); - proxyMakefile.GenerateProxyMakefiles ( configuration.Verbose ); + proxyMakefile.GenerateProxyMakefiles ( configuration.Verbose, + GetProxyMakefileTree () ); printf ( "done\n" ); } @@ -929,8 +939,8 @@ MingwBackend::OutputModuleInstallTargets () NormalizeFilename ( module.GetPath () ), outputDirectory ); OutputInstallTarget ( sourceFilename, - module.installName, - module.installBase ); + module.installName, + module.installBase ); } } } diff --git a/reactos/tools/rbuild/backend/mingw/mingw.h b/reactos/tools/rbuild/backend/mingw/mingw.h index 0de4197ee5e..85da110a600 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.h +++ b/reactos/tools/rbuild/backend/mingw/mingw.h @@ -83,6 +83,7 @@ private: std::string GetBin2ResExecutable (); void UnpackWineResources (); void GenerateTestSupportCode (); + std::string GetProxyMakefileTree () const; void GenerateProxyMakefiles (); void CheckAutomaticDependencies (); bool IncludeDirectoryTarget ( const std::string& directory ) const; @@ -122,12 +123,15 @@ class ProxyMakefile public: ProxyMakefile ( const Project& project ); ~ProxyMakefile (); - void GenerateProxyMakefiles ( bool verbose ); + void GenerateProxyMakefiles ( bool verbose, + std::string outputTree ); private: std::string GeneratePathToParentDirectory ( int numberOfParentDirectories ); std::string GetPathToTopDirectory ( Module& module ); + bool GenerateProxyMakefile ( Module& module ); void GenerateProxyMakefileForModule ( Module& module, - bool verbose ); + bool verbose, + std::string outputTree ); const Project& project; }; diff --git a/reactos/tools/rbuild/backend/mingw/proxymakefile.cpp b/reactos/tools/rbuild/backend/mingw/proxymakefile.cpp index 3c2b240c95c..42b9bdc8d8f 100644 --- a/reactos/tools/rbuild/backend/mingw/proxymakefile.cpp +++ b/reactos/tools/rbuild/backend/mingw/proxymakefile.cpp @@ -15,13 +15,26 @@ ProxyMakefile::~ProxyMakefile () { } +bool +ProxyMakefile::GenerateProxyMakefile ( Module& module ) +{ + return module.GenerateInOutputTree (); +} + void -ProxyMakefile::GenerateProxyMakefiles ( bool verbose ) +ProxyMakefile::GenerateProxyMakefiles ( bool verbose, + string outputTree ) { for ( size_t i = 0; i < project.modules.size (); i++ ) { - GenerateProxyMakefileForModule ( *project.modules[i], - verbose ); + Module& module = *project.modules[i]; + if ( !module.enabled ) + continue; + if ( !GenerateProxyMakefile ( module ) ) + continue; + GenerateProxyMakefileForModule ( module, + verbose, + outputTree ); } } @@ -53,7 +66,8 @@ ProxyMakefile::GetPathToTopDirectory ( Module& module ) void ProxyMakefile::GenerateProxyMakefileForModule ( Module& module, - bool verbose ) + bool verbose, + string outputTree ) { char* buf; char* s; @@ -64,8 +78,20 @@ ProxyMakefile::GenerateProxyMakefileForModule ( Module& module, module.name.c_str () ); } - string proxyMakefile = NormalizeFilename ( module.GetBasePath () + SSEP "makefile" ); - string pathToTopDirectory = GetPathToTopDirectory ( module ); + string base; + string pathToTopDirectory; + if ( outputTree.length () > 0 ) + { + base = outputTree + SSEP + module.GetBasePath (); + Path path; + pathToTopDirectory = working_directory; + } + else + { + base = module.GetBasePath (); + pathToTopDirectory = GetPathToTopDirectory ( module ); + } + string proxyMakefile = NormalizeFilename ( base + SSEP "makefile" ); string defaultTarget = module.name; buf = (char*) malloc ( 10*1024 ); diff --git a/reactos/tools/rbuild/configuration.cpp b/reactos/tools/rbuild/configuration.cpp index ec06521d066..dd70744fce5 100644 --- a/reactos/tools/rbuild/configuration.cpp +++ b/reactos/tools/rbuild/configuration.cpp @@ -9,6 +9,7 @@ Configuration::Configuration () CleanAsYouGo = false; AutomaticDependencies = true; MakeHandlesInstallDirectories = false; + GenerateProxyMakefilesInSourceTree = false; } Configuration::~Configuration () diff --git a/reactos/tools/rbuild/module.cpp b/reactos/tools/rbuild/module.cpp index 014a27077bb..b7bdbc281fb 100644 --- a/reactos/tools/rbuild/module.cpp +++ b/reactos/tools/rbuild/module.cpp @@ -667,6 +667,36 @@ Module::IsDLL () const __LINE__ ); } +bool +Module::GenerateInOutputTree () const +{ + switch ( type ) + { + case Kernel: + case KernelModeDLL: + case NativeDLL: + case Win32DLL: + case KernelModeDriver: + case NativeCUI: + case Win32CUI: + case Test: + case Win32GUI: + case BuildTool: + case BootLoader: + case BootSector: + case Iso: + case LiveIso: + return true; + case StaticLibrary: + case ObjectLibrary: + case RpcServer: + case RpcClient: + return false; + } + throw InvalidOperationException ( __FILE__, + __LINE__ ); +} + string Module::GetTargetName () const { diff --git a/reactos/tools/rbuild/rbuild.cpp b/reactos/tools/rbuild/rbuild.cpp index 48625592bde..2f44fdb9cec 100644 --- a/reactos/tools/rbuild/rbuild.cpp +++ b/reactos/tools/rbuild/rbuild.cpp @@ -36,6 +36,22 @@ ParseMakeSwitch ( char switchChar2 ) return true; } +bool +ParseProxyMakefileSwitch ( char switchChar2 ) +{ + switch ( switchChar2 ) + { + case 's': + configuration.GenerateProxyMakefilesInSourceTree = true; + break; + default: + printf ( "Unknown switch -p%c", + switchChar2 ); + return false; + } + return true; +} + bool ParseSwitch ( int argc, char** argv, int index ) { @@ -57,6 +73,8 @@ ParseSwitch ( int argc, char** argv, int index ) break; case 'm': return ParseMakeSwitch ( switchChar2 ); + case 'p': + return ParseProxyMakefileSwitch ( switchChar2 ); default: printf ( "Unknown switch -%c", switchChar ); @@ -98,6 +116,7 @@ main ( int argc, char** argv ) printf ( " -d Disable automatic dependencies.\n" ); printf ( " -rfile.xml Name of the root xml file. Default is ReactOS.xml.\n" ); printf ( " -mi Let make handle creation of install directories. Rbuild will not generate the directories.\n" ); + printf ( " -ps Generate proxy makefiles in source tree instead of the output tree.\n" ); printf ( "\n" ); printf ( " buildsystem Target build system. Can be one of:\n" ); printf ( " mingw MinGW\n" ); diff --git a/reactos/tools/rbuild/rbuild.h b/reactos/tools/rbuild/rbuild.h index 69ba0657910..7eb1a4f567b 100644 --- a/reactos/tools/rbuild/rbuild.h +++ b/reactos/tools/rbuild/rbuild.h @@ -77,6 +77,7 @@ public: bool CleanAsYouGo; bool AutomaticDependencies; bool MakeHandlesInstallDirectories; + bool GenerateProxyMakefilesInSourceTree; }; class Environment @@ -222,6 +223,7 @@ public: const XMLAttribute& attribute ); bool HasImportLibrary () const; bool IsDLL () const; + bool GenerateInOutputTree () const; std::string GetTargetName () const; std::string GetDependencyPath () const; std::string GetBasePath () const;