//====== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======= // // Purpose: // //============================================================================= #ifndef VCPROJGENERATOR_H #define VCPROJGENERATOR_H #ifdef _WIN32 #pragma once #endif class CProjectConfiguration; class CVCProjGenerator; class CProjectTool; struct PropertyState_t { ToolProperty_t *m_pToolProperty; CUtlString m_OrdinalString; CUtlString m_StringValue; }; // ps3 visual studio integration enum PS3VSIType_e { PS3_VSI_TYPE_UNDEFINED = -1, PS3_VSI_TYPE_SNC = 0, PS3_VSI_TYPE_GCC = 1, }; class CProjectFile { public: CProjectFile( CVCProjGenerator *pGenerator, const char *pFilename ); ~CProjectFile(); bool GetConfiguration( const char *pConfigName, CProjectConfiguration **ppConfig ); bool AddConfiguration( const char *pConfigName, CProjectConfiguration **ppConfig ); bool RemoveConfiguration( CProjectConfiguration *pConfig ); CUtlString m_Name; CVCProjGenerator *m_pGenerator; CUtlVector< CProjectConfiguration* > m_Configs; }; class CProjectFolder { public: CProjectFolder( CVCProjGenerator *pGenerator, const char *pFolderName ); ~CProjectFolder(); bool GetFolder( const char *pFolderName, CProjectFolder **pFolder ); bool AddFolder( const char *pFolderName, CProjectFolder **pFolder ); void AddFile( const char *pFilename, CProjectFile **ppFile ); bool FindFile( const char *pFilename ); bool RemoveFile( const char *pFilename ); CUtlString m_Name; CVCProjGenerator *m_pGenerator; CUtlLinkedList< CProjectFolder* > m_Folders; CUtlLinkedList< CProjectFile* > m_Files; }; class CPropertyStateLessFunc { public: bool Less( const int& lhs, const int& rhs, void *pContext ); }; class CPropertyStates { public: CPropertyStates(); bool SetProperty( ToolProperty_t *pToolProperty, CProjectTool *pRootTool = NULL ); bool SetBoolProperty( ToolProperty_t *pToolProperty, bool bEnabled ); PropertyState_t *GetProperty( int nPropertyId ); PropertyState_t *GetProperty( const char *pPropertyName ); CUtlVector< PropertyState_t > m_Properties; CUtlSortVector< int, CPropertyStateLessFunc > m_PropertiesInOutputOrder; private: bool SetStringProperty( ToolProperty_t *pToolProperty, CProjectTool *pRootTool = NULL ); bool SetListProperty( ToolProperty_t *pToolProperty, CProjectTool *pRootTool = NULL ); bool SetBoolProperty( ToolProperty_t *pToolProperty, CProjectTool *pRootTool = NULL ); bool SetBoolProperty( ToolProperty_t *pToolProperty, CProjectTool *pRootTool, bool bEnabled ); bool SetIntegerProperty( ToolProperty_t *pToolProperty, CProjectTool *pRootTool = NULL ); }; class CProjectTool { public: CProjectTool( CVCProjGenerator *pGenerator ) { m_pGenerator = pGenerator; } CVCProjGenerator *GetGenerator() { return m_pGenerator; } // when the property belongs to the root tool (i.e. linker), no root tool is passed in // when the property is for the file's specific configuration tool, (i.e. compiler/debug), the root tool must be supplied virtual bool SetProperty( ToolProperty_t *pToolProperty, CProjectTool *pRootTool = NULL ); CPropertyStates m_PropertyStates; private: CVCProjGenerator *m_pGenerator; }; class CDebuggingTool : public CProjectTool { public: CDebuggingTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CCompilerTool : public CProjectTool { public: CCompilerTool( CVCProjGenerator *pGenerator, const char *pConfigName, bool bIsFileConfig ) : CProjectTool( pGenerator ) { m_ConfigName = pConfigName; m_bIsFileConfig = bIsFileConfig; } bool SetProperty( ToolProperty_t *pToolProperty, CProjectTool *pRootTool = NULL ); private: CUtlString m_ConfigName; bool m_bIsFileConfig; }; class CLibrarianTool : public CProjectTool { public: CLibrarianTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CLinkerTool : public CProjectTool { public: CLinkerTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CManifestTool : public CProjectTool { public: CManifestTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CXMLDocGenTool : public CProjectTool { public: CXMLDocGenTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CBrowseInfoTool : public CProjectTool { public: CBrowseInfoTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CResourcesTool : public CProjectTool { public: CResourcesTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CPreBuildEventTool : public CProjectTool { public: CPreBuildEventTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CPreLinkEventTool : public CProjectTool { public: CPreLinkEventTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CPostBuildEventTool : public CProjectTool { public: CPostBuildEventTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CCustomBuildTool : public CProjectTool { public: CCustomBuildTool( CVCProjGenerator *pGenerator, const char *pConfigName, bool bIsFileConfig ) : CProjectTool( pGenerator ) { m_ConfigName = pConfigName; m_bIsFileConfig = bIsFileConfig; } bool SetProperty( ToolProperty_t *pToolProperty, CProjectTool *pRootTool = NULL ); private: CUtlString m_ConfigName; bool m_bIsFileConfig; }; class CXboxImageTool : public CProjectTool { public: CXboxImageTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CXboxDeploymentTool : public CProjectTool { public: CXboxDeploymentTool( CVCProjGenerator *pGenerator ) : CProjectTool( pGenerator ) {} }; class CProjectConfiguration { public: CProjectConfiguration( CVCProjGenerator *pGenerator, const char *pConfigName, const char *pFilename ); ~CProjectConfiguration(); CDebuggingTool *GetDebuggingTool() { return m_pDebuggingTool; } CCompilerTool *GetCompilerTool() { return m_pCompilerTool; } CLibrarianTool *GetLibrarianTool() { return m_pLibrarianTool; } CLinkerTool *GetLinkerTool() { return m_pLinkerTool; } CManifestTool *GetManifestTool() { return m_pManifestTool; } CXMLDocGenTool *GetXMLDocGenTool() { return m_pXMLDocGenTool; } CBrowseInfoTool *GetBrowseInfoTool() { return m_pBrowseInfoTool; } CResourcesTool *GetResourcesTool() { return m_pResourcesTool; } CPreBuildEventTool *GetPreBuildEventTool() { return m_pPreBuildEventTool; } CPreLinkEventTool *GetPreLinkEventTool() { return m_pPreLinkEventTool; } CPostBuildEventTool *GetPostBuildEventTool() { return m_pPostBuildEventTool; } CCustomBuildTool *GetCustomBuildTool() { return m_pCustomBuildTool; } CXboxImageTool *GetXboxImageTool() { return m_pXboxImageTool; } CXboxDeploymentTool *GetXboxDeploymentTool() { return m_pXboxDeploymentTool; } bool IsEmpty(); bool SetProperty( ToolProperty_t *pToolProperty ); CVCProjGenerator *m_pGenerator; // type of config, and config's properties bool m_bIsFileConfig; CUtlString m_Name; CPropertyStates m_PropertyStates; private: // the config's tools CDebuggingTool *m_pDebuggingTool; CCompilerTool *m_pCompilerTool; CLibrarianTool *m_pLibrarianTool; CLinkerTool *m_pLinkerTool; CManifestTool *m_pManifestTool; CXMLDocGenTool *m_pXMLDocGenTool; CBrowseInfoTool *m_pBrowseInfoTool; CResourcesTool *m_pResourcesTool; CPreBuildEventTool *m_pPreBuildEventTool; CPreLinkEventTool *m_pPreLinkEventTool; CPostBuildEventTool *m_pPostBuildEventTool; CCustomBuildTool *m_pCustomBuildTool; CXboxImageTool *m_pXboxImageTool; CXboxDeploymentTool *m_pXboxDeploymentTool; }; class IVCProjWriter { public: virtual bool Save( const char *pOutputFilename ) = 0; }; class CVCProjGenerator : public CBaseProjectDataCollector { public: typedef CBaseProjectDataCollector BaseClass; CVCProjGenerator(); virtual const char *GetProjectFileExtension(); virtual void StartProject(); virtual void EndProject(); virtual CUtlString GetProjectName(); virtual void SetProjectName( const char *pProjectName ); virtual void GetAllConfigurationNames( CUtlVector< CUtlString > &configurationNames ); virtual void StartConfigurationBlock( const char *pConfigName, bool bFileSpecific ); virtual void EndConfigurationBlock(); virtual bool StartPropertySection( configKeyword_e keyword, bool *pbShouldSkip ); virtual void HandleProperty( const char *pProperty, const char *pCustomScriptData ); virtual void EndPropertySection( configKeyword_e keyword ); virtual void StartFolder( const char *pFolderName ); virtual void EndFolder(); virtual bool StartFile( const char *pFilename, bool bWarnIfAlreadyExists ); virtual void EndFile(); virtual void FileExcludedFromBuild( bool bExcluded ); virtual bool RemoveFile( const char *pFilename ); CGeneratorDefinition *GetGeneratorDefinition() { return m_pGeneratorDefinition; } void SetupGeneratorDefinition( IVCProjWriter *pVCProjWriter, const char *pDefinitionName, PropertyName_t *pPropertyNames ); PS3VSIType_e GetVSIType() { return m_VSIType; } CUtlString GetGUIDString() { return m_GUIDString; } bool GetRootConfiguration( const char *pConfigName, CProjectConfiguration **pConfig ); CProjectFolder *GetRootFolder() { return m_pRootFolder; } private: void Clear(); bool Config_GetConfigurations( const char *pszConfigName ); // returns true if found, false otherwise bool GetFolder( const char *pFolderName, CProjectFolder *pParentFolder, CProjectFolder **pOutFolder ); // returns true if added, false otherwise (duplicate) bool AddFolder( const char *pFolderName, CProjectFolder *pParentFolder, CProjectFolder **pOutFolder ); // returns true if found, false otherwise bool FindFile( const char *pFilename, CProjectFile **pFile ); void AddFileToFolder( const char *pFilename, CProjectFolder *pFolder, bool bWarnIfExists, CProjectFile **pFile ); // returns true if removed, false otherwise (not found) bool RemoveFileFromFolder( const char *pFilename, CProjectFolder *pFolder ); bool IsConfigurationNameValid( const char *pConfigName ); void SetGUID( const char *pOutputFilename ); configKeyword_e SetPS3VisualStudioIntegrationType( configKeyword_e eKeyword ); void ApplyInternalPreprocessorDefinitions(); private: configKeyword_e m_nActivePropertySection; CGeneratorDefinition *m_pGeneratorDefinition; CDebuggingTool *m_pDebuggingTool; CCompilerTool *m_pCompilerTool; CLibrarianTool *m_pLibrarianTool; CLinkerTool *m_pLinkerTool; CManifestTool *m_pManifestTool; CXMLDocGenTool *m_pXMLDocGenTool; CBrowseInfoTool *m_pBrowseInfoTool; CResourcesTool *m_pResourcesTool; CPreBuildEventTool *m_pPreBuildEventTool; CPreLinkEventTool *m_pPreLinkEventTool; CPostBuildEventTool *m_pPostBuildEventTool; CCustomBuildTool *m_pCustomBuildTool; CXboxImageTool *m_pXboxImageTool; CXboxDeploymentTool *m_pXboxDeploymentTool; CProjectConfiguration *m_pConfig; CProjectConfiguration *m_pFileConfig; CProjectFile *m_pProjectFile; CSimplePointerStack< CProjectFolder*, CProjectFolder*, 128 > m_spFolderStack; CSimplePointerStack< CCompilerTool*, CCompilerTool*, 128 > m_spCompilerStack; CSimplePointerStack< CCustomBuildTool*, CCustomBuildTool*, 128 > m_spCustomBuildToolStack; CUtlString m_ProjectName; CUtlString m_OutputFilename; CProjectFolder *m_pRootFolder; CUtlVector< CProjectConfiguration* > m_RootConfigurations; // primary file dictionary CUtlRBTree< CProjectFile*, int > m_FileDictionary; CUtlString m_GUIDString; IVCProjWriter *m_pVCProjWriter; // ps3 visual studio integration PS3VSIType_e m_VSIType; }; #endif // VCPROJGENERATOR_H