Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

301 lines
9.2 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Interface for makefiles to build differently depending on where they are run from
//
//===========================================================================//
#ifndef DMEMAKEFILEUTILS_H
#define DMEMAKEFILEUTILS_H
#ifdef _WIN32
#pragma once
#endif
#include "movieobjects/idmemakefileutils.h"
#include "datamodel/dmehandle.h"
#include "tier1/utlsymbol.h"
#include "tier3/tier3.h"
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class CDmeMakefileUtils;
class CDmeMDLMakefile;
class CDmeMayaMakefile;
class CDmeSourceMayaFile;
class CDmeMakefile;
//-----------------------------------------------------------------------------
//
// This glue code here is to make it easy to create methods using various DmElement types
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Compilation steps
//-----------------------------------------------------------------------------
enum CompilationStep_t
{
BUILDING_STANDARD_DEPENDENCIES = 0,
BUILDING_ALL_DEPENDENCIES,
BEFORE_COMPILATION,
PERFORMING_COMPILATION,
AFTER_COMPILATION_FAILED,
AFTER_COMPILATION_SUCCEEDED,
NOT_COMPILING,
};
//-----------------------------------------------------------------------------
// Utility adapter class to hook compile funcs into the map
//-----------------------------------------------------------------------------
class CCompileFuncAdapterBase
{
public:
virtual void InitializeAdapter( ) = 0;
virtual bool PerformCompilationStep( CDmElement *pElement, CompilationStep_t step ) = 0;
protected:
// Constructor, protected because these should never be instanced directly
CCompileFuncAdapterBase( ) {}
public:
CUtlSymbol m_ElementType;
CCompileFuncAdapterBase *m_pNext;
};
template< class U, class T >
class CCompileFuncAdapter : public CCompileFuncAdapterBase
{
typedef CCompileFuncAdapterBase BaseClass;
public:
CCompileFuncAdapter( )
{
// Hook into the list
m_pNext = U::m_CompileFuncTree.m_pFirstAdapter;
U::m_CompileFuncTree.m_pFirstAdapter = this;
}
virtual void InitializeAdapter( )
{
m_ElementType = T::GetStaticTypeSymbol();
if ( m_pNext )
{
m_pNext->InitializeAdapter();
}
}
virtual bool PerformCompilationStep( CDmElement *pElement, CompilationStep_t step )
{
T *pConverted = CastElement< T >( pElement );
if ( pConverted )
return U::m_pSingleton->PerformCompilationStep( pConverted, step );
return false;
}
};
//-----------------------------------------------------------------------------
// Utility adapter class to hook editor opening funcs into the map
//-----------------------------------------------------------------------------
class COpenEditorFuncAdapterBase
{
public:
virtual void InitializeAdapter( ) = 0;
virtual void OpenEditor( CDmElement *pElement ) = 0;
protected:
// Constructor, protected because these should never be instanced directly
COpenEditorFuncAdapterBase( ) {}
public:
CUtlSymbol m_ElementType;
COpenEditorFuncAdapterBase *m_pNext;
};
template< class U, class T >
class COpenEditorFuncAdapter : public COpenEditorFuncAdapterBase
{
typedef COpenEditorFuncAdapterBase BaseClass;
public:
COpenEditorFuncAdapter( )
{
// Hook into the list
m_pNext = U::m_OpenEditorFuncTree.m_pFirstAdapter;
U::m_OpenEditorFuncTree.m_pFirstAdapter = this;
}
virtual void InitializeAdapter( )
{
m_ElementType = T::GetStaticTypeSymbol();
if ( m_pNext )
{
m_pNext->InitializeAdapter();
}
}
virtual void OpenEditor( CDmElement *pElement )
{
T *pConverted = CastElement< T >( pElement );
if ( pConverted )
{
U::m_pSingleton->OpenEditor( pConverted );
}
}
};
#define DECLARE_DMEMAKEFILE_UTIL_CLASS_BASE( _className ) \
protected: \
typedef _className ThisClass; \
static CompileFuncTree_t m_CompileFuncTree; \
static OpenEditorFuncTree_t m_OpenEditorFuncTree; \
static _className *m_pSingleton; \
template< typename U, typename T > friend class CCompileFuncAdapter; \
template< typename U, typename T > friend class COpenEditorFuncAdapter; \
virtual CompileFuncTree_t* GetCompileTree() \
{ \
return &m_CompileFuncTree; \
} \
virtual OpenEditorFuncTree_t* GetOpenEditorTree() \
{ \
return &m_OpenEditorFuncTree; \
} \
#define DECLARE_DMEMAKEFILE_UTIL_CLASS( _className, _baseClass ) \
DECLARE_DMEMAKEFILE_UTIL_CLASS_BASE( _className ) \
typedef _baseClass BaseClass; \
protected: \
virtual void InitializeFuncMaps() \
{ \
m_pSingleton = this; \
m_CompileFuncTree.m_pBaseAdapterTree = &BaseClass::m_CompileFuncTree; \
m_CompileFuncTree.m_pFirstAdapter->InitializeAdapter( ); \
m_OpenEditorFuncTree.m_pBaseAdapterTree = &BaseClass::m_OpenEditorFuncTree; \
m_OpenEditorFuncTree.m_pFirstAdapter->InitializeAdapter( ); \
BaseClass::InitializeFuncMaps(); \
} \
#define DECLARE_DMEMAKEFILE_UTIL_CLASS_ROOT( _className ) \
DECLARE_DMEMAKEFILE_UTIL_CLASS_BASE( _className ) \
protected: \
virtual void InitializeFuncMaps() \
{ \
m_pSingleton = this; \
m_CompileFuncTree.m_pBaseAdapterTree = NULL; \
m_CompileFuncTree.m_pFirstAdapter->InitializeAdapter( ); \
m_OpenEditorFuncTree.m_pBaseAdapterTree = NULL; \
m_OpenEditorFuncTree.m_pFirstAdapter->InitializeAdapter( ); \
} \
#define IMPLEMENT_DMEMAKEFILE_UTIL_CLASS( _className ) \
CDmeMakefileUtils::CompileFuncTree_t _className::m_CompileFuncTree; \
CDmeMakefileUtils::OpenEditorFuncTree_t _className::m_OpenEditorFuncTree; \
_className *_className::m_pSingleton; \
#define DECLARE_COMPILEFUNC( _className ) \
bool PerformCompilationStep( _className *pClassName, CompilationStep_t step ); \
CCompileFuncAdapter< ThisClass, _className > m_##_className##CompileAdapter
#define DECLARE_OPENEDITORFUNC( _className ) \
void OpenEditor( _className *pClassName ); \
COpenEditorFuncAdapter< ThisClass, _className > m_##_className##OpenEditorAdapter
//-----------------------------------------------------------------------------
// Interface for makefiles to build differently depending on where they are run from
//-----------------------------------------------------------------------------
class CDmeMakefileUtils : public CTier3AppSystem<IDmeMakefileUtils>
{
protected:
struct CompileFuncTree_t
{
CCompileFuncAdapterBase *m_pFirstAdapter;
CompileFuncTree_t *m_pBaseAdapterTree;
};
struct OpenEditorFuncTree_t
{
COpenEditorFuncAdapterBase *m_pFirstAdapter;
OpenEditorFuncTree_t *m_pBaseAdapterTree;
};
typedef CTier3AppSystem< IDmeMakefileUtils > BaseClass;
DECLARE_DMEMAKEFILE_UTIL_CLASS_ROOT( CDmeMakefileUtils );
public:
// Constructor, destructor
CDmeMakefileUtils();
virtual ~CDmeMakefileUtils();
// Inherited from IAppSystem
virtual void *QueryInterface( const char *pInterfaceName );
virtual InitReturnVal_t Init();
// Inherited from IDmeMakefileUtils
virtual void PerformCompile( CDmElement *pElement, bool bBuildAllDependencies );
virtual bool IsCurrentlyCompiling( );
virtual int GetCompileOutputSize();
virtual CompilationState_t UpdateCompilation( char *pOutputBuf, int nBufLen );
virtual void AbortCurrentCompilation();
virtual void PerformOpenEditor( CDmElement *pElement );
virtual int GetExitCode();
protected:
// Compile functions + editor functions
DECLARE_COMPILEFUNC( CDmElement );
DECLARE_COMPILEFUNC( CDmeMakefile );
DECLARE_COMPILEFUNC( CDmeMDLMakefile );
DECLARE_COMPILEFUNC( CDmeMayaMakefile );
DECLARE_OPENEDITORFUNC( CDmeSourceMayaFile );
// Queues up a compilation task
// ( Call only in BUILDING_STANDARD_DEPENDENCIES or BUILDING_ALL_DEPENDENCIES )
void AddCompilationTask( CDmElement* pElement );
// Sets the compilation process handle
// ( Call only in PERFORMING_COMPILATION )
void SetCompileProcess( ProcessHandle_t hProcess );
private:
struct CompileInfo_t
{
CDmeHandle< CDmElement > m_hElement;
CCompileFuncAdapterBase *m_pAdapter;
};
// Finds the adapter class associated with a particular element type
CCompileFuncAdapterBase *DetermineCompileAdapter( CDmElement *pElement );
COpenEditorFuncAdapterBase *DetermineOpenEditorAdapter( CDmElement *pElement );
// Dequeue the first compile task and start it up
void StartNextCompileTask();
// Performs the compilation step on all elements
bool PerformCompilationStep( CompilationStep_t step );
// Queues up a compilation task
void AddCompilationTask( CDmElement* pElement, CCompileFuncAdapterBase *pAdapter );
// Default implementatations for compile dependencies
bool AddCompileDependencies( CDmeMakefile *pMakefile, bool bBuildAllDependencies );
CUtlVector< CompileInfo_t > m_CompileTasks;
ProcessHandle_t m_hCompileProcess;
int m_nCurrentCompileTask;
int m_nExitCode;
CompilationStep_t m_CompilationStep;
};
#endif // DMEMAKEFILEUTILS_H