Factorize code for simple module types

svn path=/trunk/; revision=34846
This commit is contained in:
Hervé Poussineau 2008-07-27 14:01:24 +00:00
parent 6b50b9e320
commit 12a1603c6e
4 changed files with 82 additions and 302 deletions

View file

@ -34,6 +34,44 @@ using std::map;
typedef set<string> set_string; typedef set<string> set_string;
static const struct
{
HostType DefaultHost;
} ModuleHandlerInformations[] = {
{ HostTrue }, // BuildTool
{ HostFalse }, // StaticLibrary
{ HostFalse }, // ObjectLibrary
{ HostFalse }, // Kernel
{ HostFalse }, // KernelModeDLL
{ HostFalse }, // KernelModeDriver
{ HostFalse }, // NativeDLL
{ HostFalse }, // NativeCUI
{ HostFalse }, // Win32DLL
{ HostFalse }, // Win32OCX
{ HostFalse }, // Win32CUI
{ HostFalse }, // Win32GUI
{ HostFalse }, // BootLoader
{ HostFalse }, // BootSector
{ HostFalse }, // Iso
{ HostFalse }, // LiveIso
{ HostFalse }, // Test
{ HostFalse }, // RpcServer
{ HostFalse }, // RpcClient
{ HostFalse }, // Alias
{ HostFalse }, // BootProgram
{ HostFalse }, // Win32SCR
{ HostFalse }, // IdlHeader
{ HostFalse }, // IsoRegTest
{ HostFalse }, // LiveIsoRegTest
{ HostFalse }, // EmbeddedTypeLib
{ HostFalse }, // ElfExecutable
{ HostFalse }, // RpcProxy
{ HostTrue }, // HostStaticLibrary
{ HostFalse }, // Cabinet
{ HostFalse }, // KeyboardLayout
{ HostFalse }, // MessageHeader
};
string string
MingwBackend::GetFullPath ( const FileLocation& file ) const MingwBackend::GetFullPath ( const FileLocation& file ) const
{ {
@ -252,7 +290,7 @@ MingwBackend::ProcessModules ()
h->EnablePreCompiledHeaderSupport (); h->EnablePreCompiledHeaderSupport ();
if ( module.host == HostDefault ) if ( module.host == HostDefault )
{ {
module.host = h->DefaultHost(); module.host = ModuleHandlerInformations[h->module.type].DefaultHost;
assert ( module.host != HostDefault ); assert ( module.host != HostDefault );
} }
v.push_back ( h ); v.push_back ( h );
@ -324,6 +362,8 @@ MingwBackend::CheckAutomaticDependenciesForModuleOnly ()
void void
MingwBackend::ProcessNormal () MingwBackend::ProcessNormal ()
{ {
assert(sizeof(ModuleHandlerInformations)/sizeof(ModuleHandlerInformations[0]) == TypeDontCare);
DetectCompiler (); DetectCompiler ();
DetectBinutils (); DetectBinutils ();
DetectNetwideAssembler (); DetectNetwideAssembler ();

View file

@ -165,18 +165,20 @@ MingwModuleHandler::InstanciateHandler (
MingwModuleHandler* handler; MingwModuleHandler* handler;
switch ( module.type ) switch ( module.type )
{ {
case StaticLibrary:
case HostStaticLibrary:
case ObjectLibrary:
case RpcServer:
case RpcClient:
case RpcProxy:
case MessageHeader:
case IdlHeader:
case EmbeddedTypeLib:
handler = new MingwModuleHandler( module );
break;
case BuildTool: case BuildTool:
handler = new MingwBuildToolModuleHandler ( module ); handler = new MingwBuildToolModuleHandler ( module );
break; break;
case StaticLibrary:
handler = new MingwStaticLibraryModuleHandler ( module );
break;
case HostStaticLibrary:
handler = new MingwHostStaticLibraryModuleHandler ( module );
break;
case ObjectLibrary:
handler = new MingwObjectLibraryModuleHandler ( module );
break;
case Kernel: case Kernel:
handler = new MingwKernelModuleHandler ( module ); handler = new MingwKernelModuleHandler ( module );
break; break;
@ -230,30 +232,12 @@ MingwModuleHandler::InstanciateHandler (
case Test: case Test:
handler = new MingwTestModuleHandler ( module ); handler = new MingwTestModuleHandler ( module );
break; break;
case RpcServer:
handler = new MingwRpcServerModuleHandler ( module );
break;
case RpcClient:
handler = new MingwRpcClientModuleHandler ( module );
break;
case RpcProxy:
handler = new MingwRpcProxyModuleHandler ( module );
break;
case Alias: case Alias:
handler = new MingwAliasModuleHandler ( module ); handler = new MingwAliasModuleHandler ( module );
break; break;
case MessageHeader:
handler = new MingwMessageHeaderModuleHandler (module);
break;
case IdlHeader:
handler = new MingwIdlHeaderModuleHandler ( module );
break;
case Cabinet: case Cabinet:
handler = new MingwCabinetModuleHandler ( module ); handler = new MingwCabinetModuleHandler ( module );
break; break;
case EmbeddedTypeLib:
handler = new MingwEmbeddedTypeLibModuleHandler ( module );
break;
case ElfExecutable: case ElfExecutable:
handler = new MingwElfExecutableModuleHandler ( module ); handler = new MingwElfExecutableModuleHandler ( module );
break; break;
@ -2541,66 +2525,6 @@ MingwKernelModuleHandler::GenerateKernelModuleTarget ()
} }
MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwStaticLibraryModuleHandler::Process ()
{
GenerateStaticLibraryModuleTarget ();
}
void
MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ()
{
GenerateRules ();
}
MingwHostStaticLibraryModuleHandler::MingwHostStaticLibraryModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwHostStaticLibraryModuleHandler::Process ()
{
GenerateHostStaticLibraryModuleTarget ();
}
void
MingwHostStaticLibraryModuleHandler::GenerateHostStaticLibraryModuleTarget ()
{
GenerateRules ();
}
MingwObjectLibraryModuleHandler::MingwObjectLibraryModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwObjectLibraryModuleHandler::Process ()
{
GenerateObjectLibraryModuleTarget ();
}
void
MingwObjectLibraryModuleHandler::GenerateObjectLibraryModuleTarget ()
{
GenerateRules ();
}
MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler ( MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler (
const Module& module_ ) const Module& module_ )
@ -2608,19 +2532,6 @@ MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler (
{ {
} }
MingwEmbeddedTypeLibModuleHandler::MingwEmbeddedTypeLibModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwEmbeddedTypeLibModuleHandler::Process ()
{
GenerateRules ();
}
void void
MingwKernelModeDLLModuleHandler::AddImplicitLibraries ( Module& module ) MingwKernelModeDLLModuleHandler::AddImplicitLibraries ( Module& module )
@ -3695,48 +3606,6 @@ MingwTestModuleHandler::GenerateTestModuleTarget ()
} }
MingwRpcServerModuleHandler::MingwRpcServerModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwRpcServerModuleHandler::Process ()
{
GenerateRules ();
}
MingwRpcClientModuleHandler::MingwRpcClientModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwRpcClientModuleHandler::Process ()
{
GenerateRules ();
}
MingwRpcProxyModuleHandler::MingwRpcProxyModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwRpcProxyModuleHandler::Process ()
{
GenerateRules ();
}
MingwAliasModuleHandler::MingwAliasModuleHandler ( MingwAliasModuleHandler::MingwAliasModuleHandler (
const Module& module_ ) const Module& module_ )
@ -3749,31 +3618,6 @@ MingwAliasModuleHandler::Process ()
{ {
} }
MingwMessageHeaderModuleHandler::MingwMessageHeaderModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwMessageHeaderModuleHandler::Process ()
{
GenerateRules ();
}
MingwIdlHeaderModuleHandler::MingwIdlHeaderModuleHandler (
const Module& module_ )
: MingwModuleHandler ( module_ )
{
}
void
MingwIdlHeaderModuleHandler::Process ()
{
GenerateRules ();
}
MingwCabinetModuleHandler::MingwCabinetModuleHandler ( MingwCabinetModuleHandler::MingwCabinetModuleHandler (
const Module& module_ ) const Module& module_ )

View file

@ -65,9 +65,8 @@ public:
static MingwModuleHandler* InstanciateHandler ( const Module& module_, static MingwModuleHandler* InstanciateHandler ( const Module& module_,
MingwBackend* backend_ ); MingwBackend* backend_ );
virtual HostType DefaultHost() = 0;
void GeneratePreconditionDependencies (); void GeneratePreconditionDependencies ();
virtual void Process () = 0; virtual void Process () { GenerateRules (); }
virtual std::string TypeSpecificCFlags() { return ""; } virtual std::string TypeSpecificCFlags() { return ""; }
virtual std::string TypeSpecificNasmFlags() { return ""; } virtual std::string TypeSpecificNasmFlags() { return ""; }
virtual std::string TypeSpecificLinkerFlags() { return ""; } virtual std::string TypeSpecificLinkerFlags() { return ""; }
@ -192,7 +191,6 @@ class MingwBuildToolModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwBuildToolModuleHandler ( const Module& module ); MingwBuildToolModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostTrue; }
virtual void Process (); virtual void Process ();
private: private:
void GenerateBuildToolModuleTarget (); void GenerateBuildToolModuleTarget ();
@ -203,51 +201,16 @@ class MingwKernelModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwKernelModuleHandler ( const Module& module ); MingwKernelModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
private: private:
void GenerateKernelModuleTarget (); void GenerateKernelModuleTarget ();
}; };
class MingwStaticLibraryModuleHandler : public MingwModuleHandler
{
public:
MingwStaticLibraryModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process ();
private:
void GenerateStaticLibraryModuleTarget ();
};
class MingwHostStaticLibraryModuleHandler : public MingwModuleHandler
{
public:
MingwHostStaticLibraryModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostTrue; }
virtual void Process ();
private:
void GenerateHostStaticLibraryModuleTarget ();
};
class MingwObjectLibraryModuleHandler : public MingwModuleHandler
{
public:
MingwObjectLibraryModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process ();
private:
void GenerateObjectLibraryModuleTarget ();
};
class MingwKernelModeDLLModuleHandler : public MingwModuleHandler class MingwKernelModeDLLModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwKernelModeDLLModuleHandler ( const Module& module ); MingwKernelModeDLLModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
void AddImplicitLibraries ( Module& module ); void AddImplicitLibraries ( Module& module );
private: private:
@ -259,7 +222,6 @@ class MingwKernelModeDriverModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwKernelModeDriverModuleHandler ( const Module& module ); MingwKernelModeDriverModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
std::string TypeSpecificCFlags() { return "-D__NTDRIVER__"; } std::string TypeSpecificCFlags() { return "-D__NTDRIVER__"; }
void AddImplicitLibraries ( Module& module ); void AddImplicitLibraries ( Module& module );
@ -272,7 +234,6 @@ class MingwNativeDLLModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwNativeDLLModuleHandler ( const Module& module ); MingwNativeDLLModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
void AddImplicitLibraries ( Module& module ); void AddImplicitLibraries ( Module& module );
private: private:
@ -284,7 +245,6 @@ class MingwNativeCUIModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwNativeCUIModuleHandler ( const Module& module ); MingwNativeCUIModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
std::string TypeSpecificCFlags() { return "-D__NTAPP__"; } std::string TypeSpecificCFlags() { return "-D__NTAPP__"; }
void AddImplicitLibraries ( Module& module ); void AddImplicitLibraries ( Module& module );
@ -297,7 +257,6 @@ class MingwWin32DLLModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwWin32DLLModuleHandler ( const Module& module ); MingwWin32DLLModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
void AddImplicitLibraries ( Module& module ); void AddImplicitLibraries ( Module& module );
private: private:
@ -309,7 +268,6 @@ class MingwWin32OCXModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwWin32OCXModuleHandler ( const Module& module ); MingwWin32OCXModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
void AddImplicitLibraries ( Module& module ); void AddImplicitLibraries ( Module& module );
private: private:
@ -321,7 +279,6 @@ class MingwWin32CUIModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwWin32CUIModuleHandler ( const Module& module ); MingwWin32CUIModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
void AddImplicitLibraries ( Module& module ); void AddImplicitLibraries ( Module& module );
private: private:
@ -333,7 +290,6 @@ class MingwWin32GUIModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwWin32GUIModuleHandler ( const Module& module ); MingwWin32GUIModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
void AddImplicitLibraries ( Module& module ); void AddImplicitLibraries ( Module& module );
private: private:
@ -345,7 +301,6 @@ class MingwBootLoaderModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwBootLoaderModuleHandler ( const Module& module ); MingwBootLoaderModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
std::string TypeSpecificLinkerFlags() { return "-nostartfiles -nostdlib"; } std::string TypeSpecificLinkerFlags() { return "-nostartfiles -nostdlib"; }
private: private:
@ -357,7 +312,6 @@ class MingwBootSectorModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwBootSectorModuleHandler ( const Module& module ); MingwBootSectorModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
std::string TypeSpecificNasmFlags() { return "-f bin"; } std::string TypeSpecificNasmFlags() { return "-f bin"; }
private: private:
@ -369,7 +323,6 @@ class MingwBootProgramModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwBootProgramModuleHandler ( const Module& module ); MingwBootProgramModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
std::string GetProgTextAddrMacro (); std::string GetProgTextAddrMacro ();
std::string TypeSpecificLinkerFlags() { return "-nostartfiles -nostdlib"; } std::string TypeSpecificLinkerFlags() { return "-nostartfiles -nostdlib"; }
@ -382,7 +335,6 @@ class MingwIsoModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwIsoModuleHandler ( const Module& module ); MingwIsoModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
private: private:
void GenerateIsoModuleTarget (); void GenerateIsoModuleTarget ();
@ -401,7 +353,6 @@ class MingwLiveIsoModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwLiveIsoModuleHandler ( const Module& module ); MingwLiveIsoModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
private: private:
void GenerateLiveIsoModuleTarget (); void GenerateLiveIsoModuleTarget ();
@ -420,7 +371,6 @@ class MingwTestModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwTestModuleHandler ( const Module& module ); MingwTestModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
protected: protected:
virtual void GetModuleSpecificCompilationUnits ( std::vector<CompilationUnit*>& compilationUnits ); virtual void GetModuleSpecificCompilationUnits ( std::vector<CompilationUnit*>& compilationUnits );
@ -428,54 +378,10 @@ private:
void GenerateTestModuleTarget (); void GenerateTestModuleTarget ();
}; };
class MingwRpcServerModuleHandler : public MingwModuleHandler
{
public:
MingwRpcServerModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process ();
};
class MingwRpcClientModuleHandler : public MingwModuleHandler
{
public:
MingwRpcClientModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process ();
};
class MingwRpcProxyModuleHandler : public MingwModuleHandler
{
public:
MingwRpcProxyModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process ();
};
class MingwMessageHeaderModuleHandler : public MingwModuleHandler
{
public:
MingwMessageHeaderModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process ();
};
class MingwAliasModuleHandler : public MingwModuleHandler class MingwAliasModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwAliasModuleHandler ( const Module& module ); MingwAliasModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process ();
};
class MingwIdlHeaderModuleHandler : public MingwModuleHandler
{
public:
MingwIdlHeaderModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
}; };
@ -483,15 +389,6 @@ class MingwCabinetModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwCabinetModuleHandler ( const Module& module ); MingwCabinetModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process ();
};
class MingwEmbeddedTypeLibModuleHandler : public MingwModuleHandler
{
public:
MingwEmbeddedTypeLibModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
}; };
@ -499,7 +396,6 @@ class MingwElfExecutableModuleHandler : public MingwModuleHandler
{ {
public: public:
MingwElfExecutableModuleHandler ( const Module& module ); MingwElfExecutableModuleHandler ( const Module& module );
virtual HostType DefaultHost() { return HostFalse; }
virtual void Process (); virtual void Process ();
}; };

View file

@ -275,39 +275,39 @@ private:
enum ModuleType enum ModuleType
{ {
BuildTool = 0, BuildTool,
StaticLibrary = 1, StaticLibrary,
ObjectLibrary = 2, ObjectLibrary,
Kernel = 3, Kernel,
KernelModeDLL = 4, KernelModeDLL,
KernelModeDriver = 5, KernelModeDriver,
NativeDLL = 6, NativeDLL,
NativeCUI = 7, NativeCUI,
Win32DLL = 8, Win32DLL,
Win32OCX = 9, Win32OCX,
Win32CUI = 10, Win32CUI,
Win32GUI = 11, Win32GUI,
BootLoader = 12, BootLoader,
BootSector = 13, BootSector,
Iso = 14, Iso,
LiveIso = 15, LiveIso,
Test = 16, Test,
RpcServer = 17, RpcServer,
RpcClient = 18, RpcClient,
Alias = 19, Alias,
BootProgram = 20, BootProgram,
Win32SCR = 21, Win32SCR,
IdlHeader = 23, IdlHeader,
IsoRegTest = 24, IsoRegTest,
LiveIsoRegTest = 25, LiveIsoRegTest,
EmbeddedTypeLib = 26, EmbeddedTypeLib,
ElfExecutable = 27, ElfExecutable,
RpcProxy, RpcProxy,
HostStaticLibrary, HostStaticLibrary,
TypeDontCare,
Cabinet, Cabinet,
KeyboardLayout, KeyboardLayout,
MessageHeader MessageHeader,
TypeDontCare, // always at the end
}; };
enum HostType enum HostType