Generate proxy makefiles in output tree.
authorCasper Hornstrup <chorns@users.sourceforge.net>
Sun, 5 Jun 2005 15:59:18 +0000 (15:59 +0000)
committerCasper Hornstrup <chorns@users.sourceforge.net>
Sun, 5 Jun 2005 15:59:18 +0000 (15:59 +0000)
svn path=/trunk/; revision=15808

reactos/Makefile
reactos/tools/rbuild/XML.h
reactos/tools/rbuild/backend/mingw/mingw.cpp
reactos/tools/rbuild/backend/mingw/mingw.h
reactos/tools/rbuild/backend/mingw/proxymakefile.cpp
reactos/tools/rbuild/configuration.cpp
reactos/tools/rbuild/module.cpp
reactos/tools/rbuild/rbuild.cpp
reactos/tools/rbuild/rbuild.h

index 5999202..f19a598 100644 (file)
@@ -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
index 8b1730a..997c49b 100644 (file)
@@ -5,6 +5,8 @@
 
 class XMLElement;
 
+extern std::string working_directory;
+
 void
 InitWorkingDirectory();
 
index e6913ba..9b8a970 100644 (file)
@@ -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 );
                }
        }
 }
index 0de4197..85da110 100644 (file)
@@ -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;
 };
 
index 3c2b240..42b9bdc 100644 (file)
@@ -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 );
index ec06521..dd70744 100644 (file)
@@ -9,6 +9,7 @@ Configuration::Configuration ()
        CleanAsYouGo = false;
        AutomaticDependencies = true;
        MakeHandlesInstallDirectories = false;
+       GenerateProxyMakefilesInSourceTree = false;
 }
 
 Configuration::~Configuration ()
index 014a270..b7bdbc2 100644 (file)
@@ -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
 {
index 4862559..2f44fdb 100644 (file)
@@ -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" );
index 69ba065..7eb1a4f 100644 (file)
@@ -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;