summaryrefslogtreecommitdiff
path: root/external/vpc/utils/vpc/dependencies.h
diff options
context:
space:
mode:
Diffstat (limited to 'external/vpc/utils/vpc/dependencies.h')
-rw-r--r--external/vpc/utils/vpc/dependencies.h197
1 files changed, 197 insertions, 0 deletions
diff --git a/external/vpc/utils/vpc/dependencies.h b/external/vpc/utils/vpc/dependencies.h
new file mode 100644
index 0000000..87ff41d
--- /dev/null
+++ b/external/vpc/utils/vpc/dependencies.h
@@ -0,0 +1,197 @@
+//====== Copyright 1996-2005, Valve Corporation, All rights reserved. =======
+//
+// Purpose:
+//
+//=============================================================================
+
+#ifndef DEPENDENCIES_H
+#define DEPENDENCIES_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+enum EDependencyType
+{
+ k_eDependencyType_SourceFile, // .cpp, .cxx, .h, .hxx
+ k_eDependencyType_Project, // this is a project file WITHOUT the target-specific extension (.mak, .vpj, .vcproj).
+ k_eDependencyType_Library, // this is a library file
+ k_eDependencyType_Unknown // Unrecognized file extension (probably .ico or .rc2 or somesuch).
+};
+
+class CProjectDependencyGraph;
+enum k_EDependsOnFlags
+{
+ k_EDependsOnFlagCheckNormalDependencies = 0x01,
+ k_EDependsOnFlagCheckAdditionalDependencies = 0x02,
+ k_EDependsOnFlagRecurse = 0x04,
+ k_EDependsOnFlagTraversePastLibs = 0x08
+};
+
+// Flags to CProjectDependencyGraph::BuildProjectDependencies.
+#define BUILDPROJDEPS_FULL_DEPENDENCY_SET 0x01 // This tells it to build a graph of all projects in the source tree _including_ all games.
+#define BUILDPROJDEPS_CHECK_ALL_PROJECTS 0x02 // If this is set, then it reads all .vpc files.
+ // If this is not set, then it only includes the files from the command line with the "vpc +tier0 *bitmap +client /tf" syntax
+
+class CDependency
+{
+friend class CProjectDependencyGraph;
+friend class CSingleProjectScanner;
+
+public:
+ CDependency( CProjectDependencyGraph *pDependencyGraph );
+ virtual ~CDependency();
+
+ // Flags are a combination of k_EDependsOnFlags.
+ bool DependsOn( CDependency *pTest, int flags=k_EDependsOnFlagCheckNormalDependencies | k_EDependsOnFlagRecurse );
+ const char* GetName() const;
+
+ // Returns true if the absolute filename of this thing (CDependency::m_Filename) matches the absolute path specified.
+ bool CompareAbsoluteFilename( const char *pAbsPath ) const;
+
+
+private:
+ bool FindDependency_Internal( CUtlVector<CUtlBuffer> &callTreeOutputStack, CDependency *pTest, int flags, int depth );
+ void Mark();
+ bool HasBeenMarked();
+
+public:
+ CUtlString m_Filename; // Full paths (slashes are platform dependent).
+ // This is the VPC filename for a project (use CDependency_Project::m_ProjectFilename for the VCPROJ/VPJ filename).
+ EDependencyType m_Type;
+
+ // Files that this guy depends on.
+ CUtlVector<CDependency*> m_Dependencies;
+
+ // Files added by $AdditionalProjectDependencies. This is in a separate list because we don't
+ // always want DependsOn() to check this.
+ CUtlVector<CDependency*> m_AdditionalDependencies;
+
+private:
+ CProjectDependencyGraph *m_pDependencyGraph;
+ unsigned int m_iDependencyMark;
+ bool m_bCheckedIncludes; // Set to true when we have checked all the includes for this.
+
+ // Cache info.
+ int64 m_nCacheFileSize;
+ int64 m_nCacheModificationTime;
+
+ // Used by the cache.
+ bool m_bCacheDirty; // File size or modification time don't match.
+};
+
+
+// This represents a project (.vcproj) file, NOT a project like a projectIndex_t.
+// There can be separate .vcproj files (and thus separate CDependency_Project) for each game and platform of a projectIndex_t.
+// If m_Type == k_eDependencyType_Project, then you can cast to this.
+class CDependency_Project : public CDependency
+{
+public:
+ typedef CDependency BaseClass;
+
+ CDependency_Project( CProjectDependencyGraph *pDependencyGraph );
+
+ // These functions read/write g_pVPC->GetOutputFilename() and such (all the m_xxStoredXXXX vars below).
+ void StoreProjectParameters( const char *szScriptName );
+ void ExportProjectParameters();
+
+ // Does a case-insensitive string compare against m_ProjectName.
+ // Returns -1 if not found or the index into projects.
+ static int FindByProjectName( CUtlVector<CDependency_Project*> &projects, const char *pTestName );
+
+
+public:
+ // Include directories for the project.
+ CUtlVector<CUtlString> m_IncludeDirectories;
+
+ // Straight out of the $AdditionalProjectDependencies key (split on semicolons).
+ CUtlVector<CUtlString> m_AdditionalProjectDependencies;
+
+ // Straight out of the $AdditionalOutputFiles key (split on semicolons).
+ CUtlVector<CUtlString> m_AdditionalOutputFiles;
+
+ CUtlString m_ProjectName; // This comes from the $Project key in the .vpc file.
+ CUtlString m_ProjectFilename; // Absolute path to the VCPROJ file (g_pVPC->GetOutputFilename() - see CDependency::m_Filename for the VPC filename).
+ CUtlString m_ImportLibrary;
+
+ // Note that there can be multiple CDependency_Projects with the same m_iProjectIndex.
+ projectIndex_t m_iProjectIndex;
+
+ // This is used by /p4sln. It uses this to call into VPC_ParseProjectScript. These are the values of g_pVPC->GetOutputFilename(), szScriptName,
+ // and the defines at the time of building this project.
+ CUtlString m_StoredOutputFilename;
+ char m_szStoredScriptName[MAX_PATH];
+ char m_szStoredCurrentDirectory[MAX_PATH];
+ CUtlVector<bool> m_StoredConditionalsActive;
+};
+
+
+// This class builds a graph of all dependencies, starting at the projects.
+class CProjectDependencyGraph : public IProjectIterator
+{
+friend class CDependency;
+
+public:
+ CProjectDependencyGraph();
+
+ // This is the main function to generate dependencies.
+ // nBuildProjectDepsFlags is a combination of BUILDPROJDEPS_ flags.
+ void BuildProjectDependencies( int nBuildProjectDepsFlags, CUtlVector< CDependency_Project *> *pPhase1Projects = NULL );
+
+ bool HasGeneratedDependencies() const;
+
+ CDependency* FindDependency( const char *pFilename );
+ CDependency* FindOrCreateDependency( const char *pFilename );
+
+ // Look for all projects (that we've scanned during BuildProjectDependencies) that depend on the specified project.
+ // If bDownwards is true, then it adds iProject and all projects that _it depends on_.
+ // If bDownwards is false, then it adds iProject and all projects that _depend on it_.
+ void GetProjectDependencyTree( projectIndex_t iProject, CUtlVector<projectIndex_t> &dependentProjects, bool bDownwards );
+
+ // This solves the central mismatch between the way VPC references projects and the way the CDependency stuff does.
+ //
+ // - VPC uses projectIndex_t, but a single projectIndex_t can turn into multiple games (server_tf, server_episodic, etc) in VPC_IterateTargetProjects.
+ // - The dependency code has a separate CDependency_Project for each game.
+ //
+ // This takes a bunch of project indices (usually m_targetProjects, which comes from the command line's "+this -that *theother" syntax),
+ // which are game-agnostic, and based on what games were specified on the command line, it builds the list of CDependency_Project*s.
+ void TranslateProjectIndicesToDependencyProjects( CUtlVector<projectIndex_t> &projectList, CUtlVector<CDependency_Project*> &out );
+
+// IProjectIterator overrides.
+protected:
+ virtual bool VisitProject( projectIndex_t iProject, const char *szProjectName );
+
+
+private:
+ void ClearAllDependencyMarks();
+
+ // Functions for the vpc.cache file management.
+ bool LoadCache( const char *pFilename );
+ bool SaveCache( const char *pFilename );
+ void WriteString( FILE *fp, CUtlString &utlString );
+ CUtlString ReadString( FILE *fp );
+
+ void CheckCacheEntries();
+ void RemoveDirtyCacheEntries();
+ void MarkAllCacheEntriesValid();
+
+ void ResolveAdditionalProjectDependencies( CUtlVector< CDependency_Project *> *pPhase1Projects = NULL );
+
+public:
+ // Projects and everything they depend on.
+ CUtlVector<CDependency_Project*> m_Projects;
+ CUtlDict<CDependency*,int> m_AllFiles; // All files go in here. They should never be duplicated. These are indexed by the full filename (except .lib files, which have that stripped off).
+ bool m_bFullDependencySet; // See bFullDepedencySet passed into BuildProjectDependencies.
+ int m_nFilesParsedForIncludes;
+
+private:
+ // Used when sweeping the dependency graph to prevent looping around forever.
+ unsigned int m_iDependencyMark;
+ bool m_bHasGeneratedDependencies; // Set to true after finishing BuildProjectDependencies.
+};
+
+
+bool IsLibraryFile( const char *pFilename );
+bool IsSharedLibraryFile( const char *pFilename );
+
+
+#endif // DEPENDENCIES_H