-Add a new module type 'cabinet' to handle .cab files generation
[reactos.git] / reactos / tools / rbuild / bootstrap.cpp
index ff51059..f286bfd 100644 (file)
-#include "pch.h"\r
-#include <assert.h>\r
-\r
-#include "rbuild.h"\r
-\r
-using std::string;\r
-\r
-Bootstrap::Bootstrap ( const Project& project_,\r
-                          const Module* module_,\r
-                          const XMLElement& bootstrapNode )\r
-       : project(project_),\r
-         module(module_),\r
-         node(bootstrapNode)\r
-{\r
-       Initialize();\r
-}\r
-\r
-Bootstrap::~Bootstrap ()\r
-{\r
-}\r
-\r
-bool\r
-Bootstrap::IsSupportedModuleType ( ModuleType type )\r
-{\r
-       switch ( type )\r
-       {\r
-               case Kernel:\r
-               case KernelModeDLL:\r
-               case NativeDLL:\r
-               case NativeCUI:\r
-               case Win32DLL:\r
-               case Win32CUI:\r
-               case Win32GUI:\r
-               case KernelModeDriver:\r
-               case BootSector:\r
-               case BootLoader:\r
-                       return true;\r
-               case BuildTool:\r
-               case StaticLibrary:\r
-               case ObjectLibrary:\r
-               case Iso:\r
-               case LiveIso:\r
-               case Test:\r
-               case RpcServer:\r
-               case RpcClient:\r
-                       return false;\r
-       }\r
-       throw InvalidOperationException ( __FILE__,\r
-                                         __LINE__ );\r
-}\r
-\r
-void\r
-Bootstrap::Initialize ()\r
-{\r
-       if ( !IsSupportedModuleType ( module->type ) )\r
-       {\r
-               throw InvalidBuildFileException (\r
-                       node.location,\r
-                       "<bootstrap> is not applicable for this module type." );\r
-       }\r
-\r
-       const XMLAttribute* att = node.GetAttribute ( "base", false );\r
-       if ( att != NULL )\r
-               base = att->value;\r
-       else\r
-               base = "";\r
-\r
-       att = node.GetAttribute ( "nameoncd", false );\r
-       if ( att != NULL )\r
-               nameoncd = att->value;\r
-       else\r
-               nameoncd = module->GetTargetName ();\r
-}\r
-\r
-void\r
-Bootstrap::ProcessXML()\r
-{\r
-}\r
+/*
+ * Copyright (C) 2005 Casper S. Hornstrup
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include "pch.h"
+#include <assert.h>
+
+#include "rbuild.h"
+
+using std::string;
+
+Bootstrap::Bootstrap ( const Project& project_,
+                       const Module* module_,
+                       const XMLElement& bootstrapNode )
+       : project(project_),
+         module(module_),
+         node(bootstrapNode)
+{
+       Initialize();
+}
+
+Bootstrap::~Bootstrap ()
+{
+}
+
+bool
+Bootstrap::IsSupportedModuleType ( ModuleType type )
+{
+       switch ( type )
+       {
+               case Kernel:
+               case KernelModeDLL:
+               case NativeDLL:
+               case NativeCUI:
+               case Win32DLL:
+               case Win32OCX:
+               case Win32CUI:
+               case Win32SCR:
+               case Win32GUI:
+               case KernelModeDriver:
+               case BootSector:
+               case BootLoader:
+               case BootProgram:
+               case Cabinet:
+                       return true;
+               case BuildTool:
+               case StaticLibrary:
+               case HostStaticLibrary:
+               case ObjectLibrary:
+               case Iso:
+               case LiveIso:
+               case IsoRegTest:
+               case LiveIsoRegTest:
+               case Test:
+               case RpcServer:
+               case RpcClient:
+               case RpcProxy:
+               case Alias:
+               case IdlHeader:
+               case EmbeddedTypeLib:
+               case ElfExecutable:
+                       return false;
+               case TypeDontCare:
+                       break;
+       }
+       throw InvalidOperationException ( __FILE__,
+                                         __LINE__ );
+}
+
+string
+Bootstrap::ReplaceVariable ( const string& name,
+                             const string& value,
+                             string path )
+{
+       size_t i = path.find ( name );
+       if ( i != string::npos )
+               return path.replace ( i, name.length (), value );
+       else
+               return path;
+}
+
+void
+Bootstrap::Initialize ()
+{
+       if ( !IsSupportedModuleType ( module->type ) )
+       {
+               throw XMLInvalidBuildFileException (
+                       node.location,
+                       "<bootstrap> is not applicable for this module type." );
+       }
+
+       const XMLAttribute* att = node.GetAttribute ( "installbase", false );
+       if ( att != NULL )
+               base = ReplaceVariable ( "$(CDOUTPUT)", Environment::GetCdOutputPath (), att->value );
+       else
+               base = "";
+
+       att = node.GetAttribute ( "nameoncd", false );
+       if ( att != NULL )
+               nameoncd = att->value;
+       else
+               nameoncd = module->output->name;
+}
+
+void
+Bootstrap::ProcessXML()
+{
+}