From bf5ca2c23b1695ae13dc6009db82e291206f91b0 Mon Sep 17 00:00:00 2001 From: kotofyt Date: Fri, 26 Dec 2025 23:59:32 +0200 Subject: [PATCH] trying to improve the stuff --- fpc/build.cpp | 6 +++++- fpc/library/builder.cpp | 0 fpc/library/helper.cpp | 6 +++--- fpc/main.cpp | 20 ++++++++++++++++---- fpc/public/builder.h | 31 +++++++++++++++++++++++++++++++ fpc/public/helper.h | 24 +++++++++++++++++++----- fpc/public/interfaces.cpp | 11 +++++++++++ public/tier1/interface.h | 11 +++++++++-- tier1/interface.cpp | 2 +- 9 files changed, 95 insertions(+), 16 deletions(-) create mode 100644 fpc/library/builder.cpp create mode 100644 fpc/public/builder.h create mode 100644 fpc/public/interfaces.cpp diff --git a/fpc/build.cpp b/fpc/build.cpp index c03c43a..800a090 100644 --- a/fpc/build.cpp +++ b/fpc/build.cpp @@ -60,7 +60,11 @@ DECLARE_BUILD_STAGE(fpc) compileProject.files = g_CompiledFiles; compileProject.includeDirectories = g_IncludeDirectories; ldProject = ccompiler->Compile(&compileProject); - ldProject.libraryObjects = GET_PROJECT_LIBRARY("tier0", "tier0"); + ldProject.libraryObjects = { + GET_PROJECT_LIBRARY("tier0", "tier0") + GET_PROJECT_LIBRARY("tier1", "tier1") + GET_PROJECT_LIBRARY("tier2", "tier2") + }; if (linker->IsLibraryExists("clang")) ldProject.libraries.AppendTail("clang"); diff --git a/fpc/library/builder.cpp b/fpc/library/builder.cpp new file mode 100644 index 0000000..e69de29 diff --git a/fpc/library/helper.cpp b/fpc/library/helper.cpp index b016ff3..600b66a 100644 --- a/fpc/library/helper.cpp +++ b/fpc/library/helper.cpp @@ -135,11 +135,11 @@ bool CPOSIXFileSystem2::ShouldRecompile(const char *szSource, const char *szOutp CUtlVector g_buildStages; -CBuildStage::CBuildStage( CUtlString sz, int(*pMainFn)() ) +CBuildStage::CBuildStage( const char *psz, int(*pMainFn)() ) { - m_sz = sz; + m_psz = psz; m_pMainFn = pMainFn; - if (sz == 0 || pMainFn == 0) + if (psz == 0 || pMainFn == 0) Plat_FatalErrorFunc("Name and function pointer must be set\n"); g_buildStages.AppendTail(this); diff --git a/fpc/main.cpp b/fpc/main.cpp index 159714e..aa8b638 100644 --- a/fpc/main.cpp +++ b/fpc/main.cpp @@ -16,11 +16,16 @@ CUtlString owndir; extern char *g_szBuildDir; -int build() + +void build_tier0() { +}; - +int build() +{ + CreateInterfaceFn pBuildFactory; + BuildFileInfo_t *pBuildFileInfo; CProject_t compileScriptProject = {}; compileScriptProject.m_szName = "build"; compileScriptProject.files = {"build.cpp"}; @@ -36,12 +41,19 @@ int build() void *scriptDLL = Plat_LoadLibrary(script); + pBuildFactory = Sys_GetFactory(scriptDLL); + + + pBuildFactory = NULL; + pBuildFileInfo = (BuildFileInfo_t*)pBuildFactory(BUILD_FILE_INFO_INTERFACE_NAME, NULL); + if (!pBuildFactory) + Plat_FatalErrorFunc("Failed to find build file info interface\n"); auto PreinitFn = (void(*)())Plat_GetProc(scriptDLL, "Preinit"); if (PreinitFn) PreinitFn(); - for (auto &build: BuildStages()) + for (auto &build: pBuildFileInfo->m_stages) { build->m_pMainFn(); }; @@ -61,7 +73,7 @@ void IEngine_Signal(int sig) case SIGILL: case SIGABRT: Plat_Backtrace(); - Plat_FatalErrorFunc("Fault"); + Plat_FatalErrorFunc("Fault\n"); break; case SIGINT: Plat_Exit(0); diff --git a/fpc/public/builder.h b/fpc/public/builder.h new file mode 100644 index 0000000..c9add11 --- /dev/null +++ b/fpc/public/builder.h @@ -0,0 +1,31 @@ +#ifndef BUILDER_H +#define BUILDER_H + +#include "tier1/interface.h" +#include "tier1/utlvector.h" + +struct BuildOutput_t +{ + +}; + +struct BuildOutputs_t +{ + const char *m_szBuildStageName; + CUtlVector m_buildOutputs; +}; + +struct BuildFile_t +{ + void *m_pLibrary; + CUtlVector m_compiledProjects; +}; + +abstract_class IProjectBuilder +{ + virtual BuildFile_t *BuildProject( const char *szPath ) = 0; +}; + +IProjectBuilder *ProjectBuilder(); + +#endif diff --git a/fpc/public/helper.h b/fpc/public/helper.h index 1ea0986..f4f9ed5 100644 --- a/fpc/public/helper.h +++ b/fpc/public/helper.h @@ -9,6 +9,7 @@ #include "tier1/utlstring.h" #include "target.h" #include "tier2/fileformats/ini.h" +#include "tier1/interface.h" #define FPC_TEMPORAL_DIRNAME ".fpc" @@ -81,11 +82,17 @@ extern IFileSystem2 *filesystem2; class CBuildStage { public: - CBuildStage( CUtlString sz, int(*pMainFn)() ); - CUtlString m_sz; + CBuildStage( const char *psz, int(*pMainFn)() ); + const char *m_psz; int(*m_pMainFn)(); }; + +class CBuildDependentFile +{ + +}; + //----------------------------------------------------------------------------- // Declares new build stage. // example: @@ -107,9 +114,16 @@ int __build_stage_##sz() #define GET_PROJECT_LIBRARY(sz, szLib) \ -// Returns all available build stages -// Used internally -CUtlVector& BuildStages(); +struct BuildFileInfo_t +{ + CUtlVector m_dependantFile; + CUtlVector m_stages; +}; + +BuildFileInfo_t *GetBuildFileInfo(); + +#define BUILD_FILE_INFO_INTERFACE_NAME "BuildFileInfo001" + extern IINIFile *g_pConfig; diff --git a/fpc/public/interfaces.cpp b/fpc/public/interfaces.cpp new file mode 100644 index 0000000..af5492a --- /dev/null +++ b/fpc/public/interfaces.cpp @@ -0,0 +1,11 @@ +#include "tier1/interface.h" +#include "helper.h" + +static BuildFileInfo_t buildfileinfo = {}; +BuildFileInfo_t *GetBuildFileInfo() +{ + return &buildfileinfo; +} + + +EXPOSE_INTERFACE_GLOBALVAR(BuildFileInfo_t, BuildFileInfo_t, BUILD_FILE_INFO_INTERFACE_NAME, buildfileinfo); diff --git a/public/tier1/interface.h b/public/tier1/interface.h index 0eb0cd0..9f7de00 100644 --- a/public/tier1/interface.h +++ b/public/tier1/interface.h @@ -6,8 +6,6 @@ typedef void *( *CreateInterfaceFn )( const char *szName, int *pReturnCode ); typedef void *( *InstantiateInterfaceFn )( void ); -CreateInterfaceFn Plat_GetInterfaceFactory( void *lib ); - class CInterfaceRegistry { public: @@ -24,7 +22,16 @@ public: static void *__Create##className##_interface() { return ( interfaceName* )( new className ); }; \ static CInterfaceRegistry __Create##className##_registry( __Create##className##_interface, versionName ); +#define EXPOSE_INTERFACE_FN( functionName, interfaceName, versionName ) \ + static CInterfaceRegistry __Create##interfaceName##_registry( functionName, versionName ); + +#define EXPOSE_INTERFACE_GLOBALVAR( className, interfaceName, versionName, globalVarName ) \ + static void *__Create##interfaceName##_interface() { return ( interfaceName* )( &globalVarName ); }; \ + static CInterfaceRegistry __Create##interfaceName##_registry( __Create##className##_interface, versionName ); + void *CreateInterface( const char *szName, int *pReturnCode ); +CreateInterfaceFn Sys_GetFactory( void *pLibrary ); + #endif diff --git a/tier1/interface.cpp b/tier1/interface.cpp index 21e0c2b..180777d 100644 --- a/tier1/interface.cpp +++ b/tier1/interface.cpp @@ -28,7 +28,7 @@ void *CreateInterface( const char *szName, int *pReturnCode ) return 0; } -CreateInterfaceFn Plat_GetInterfaceFactory( void *lib ) +CreateInterfaceFn Sys_GetFactory( void *lib ) { return (CreateInterfaceFn)Plat_GetProc(lib, "CreateInterface"); }