From 3beb7aad3ba52299b9e42875d2ed15fb15c333aa Mon Sep 17 00:00:00 2001 From: kotofyt Date: Mon, 2 Jun 2025 19:56:18 +0300 Subject: [PATCH] Build system almost done --- .gitignore | 5 ++ engine/engine.cpp | 12 ---- fpc/.fpc/cc/1762019572/build.cpp.o | Bin 6056 -> 0 bytes fpc/.fpc/ld/855499559/libbuild.so | Bin 16064 -> 0 bytes fpc/Makefile | 8 ++- fpc/build.cpp | 42 +++++++++++++- fpc/library/c.cpp | 11 ++-- fpc/library/helper.cpp | 12 +++- fpc/library/ld.cpp | 3 +- fpc/main.cpp | 30 +++++++++- fpc/public/helper.h | 3 +- public/tier1/utlbuffer.h | 88 ++++++++++++++++------------- public/tier1/utlstring.h | 2 +- public/tier1/utlvector.h | 19 ++++--- tier0/platform.cpp | 28 +++++++++ tier1/utlstring.cpp | 5 +- 16 files changed, 191 insertions(+), 77 deletions(-) delete mode 100644 fpc/.fpc/cc/1762019572/build.cpp.o delete mode 100644 fpc/.fpc/ld/855499559/libbuild.so diff --git a/.gitignore b/.gitignore index 91c614e..ce59207 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,8 @@ compile_commands.json # Added by cargo /target + +# fpc stuff +.fpc +fpc/.fpc +fpc/fpc diff --git a/engine/engine.cpp b/engine/engine.cpp index 1e60137..e8879cc 100644 --- a/engine/engine.cpp +++ b/engine/engine.cpp @@ -52,18 +52,6 @@ void IEngine_Signal(int sig) void IEngine::Init() { /* trap signals */ - #ifdef __linux - signal(SIGHUP, IEngine_Signal); - signal(SIGINT, IEngine_Signal); - signal(SIGQUIT, IEngine_Signal); - signal(SIGILL, IEngine_Signal); - signal(SIGTRAP, IEngine_Signal); - signal(SIGIOT, IEngine_Signal); - signal(SIGBUS, IEngine_Signal); - signal(SIGFPE, IEngine_Signal); - signal(SIGSEGV, IEngine_Signal); - signal(SIGTERM, IEngine_Signal); - #endif IFileSystem::InitFilesystem(); IVideo::Init(); diff --git a/fpc/.fpc/cc/1762019572/build.cpp.o b/fpc/.fpc/cc/1762019572/build.cpp.o deleted file mode 100644 index e6f37d326078c5a22d065dae53d6104954c7a5bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6056 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 diff --git a/fpc/Makefile b/fpc/Makefile index c3a87a6..53fa97c 100644 --- a/fpc/Makefile +++ b/fpc/Makefile @@ -2,8 +2,12 @@ TIER0_FILES := $(wildcard ../tier0/*.cpp) TIER1_FILES := $(wildcard ../tier1/*.cpp) FPC_FILES := main.cpp library/runner.cpp library/helper.cpp library/c.cpp library/ld.cpp CC = clang -OUTPUT_DIR = ../build/tools/fpc +OUTPUT_DIR = fpc -full: $(TIER0_FILES) $(TIER1_FILES) $(FPC_FILES) +install: + +../build/tools: mkdir -p ../build/tools + +minimal: $(TIER0_FILES) $(TIER1_FILES) $(FPC_FILES) ../build/tools $(CC) -g -rdynamic $(TIER0_FILES) $(TIER1_FILES) $(FPC_FILES) -I../public -Ipublic -lc -lstdc++ -o $(OUTPUT_DIR) diff --git a/fpc/build.cpp b/fpc/build.cpp index 5e8c243..625beec 100644 --- a/fpc/build.cpp +++ b/fpc/build.cpp @@ -1,8 +1,46 @@ -#include "helper.h" +#include "public/c.h" +#include "public/ld.h" +#include "public/c.h" +#include "public/helper.h" +#include "tier0/platform.h" +#include "signal.h" + +CUtlVector g_CompiledFiles = { + "main.cpp", + "library/runner.cpp", + "library/helper.cpp", + "library/c.cpp", + "library/ld.cpp", + "../tier0/lib.cpp", + "../tier0/mem.cpp", + "../tier0/platform.cpp", + "../tier1/utlbuffer.cpp", + "../tier1/utlstring.cpp", + "../tier1/utlvector.cpp", + "../tier1/utlmap.cpp", + "../tier1/commandline.cpp", +}; + +CUtlVector g_IncludeDirectories = { + "public", + "../public", +}; + int build_fpc() { - V_printf("cool\n"); + CCProject compileProject = {}; + CLDProject ldProject = {}; + + compileProject.m_szName = "fpc"; + compileProject.files = g_CompiledFiles; + compileProject.includeDirectories = g_IncludeDirectories; + ldProject = compileProject.Compile(); + + ldProject.Link(); + + IFileSystem2::MakeDirectory("../build/tools"); + return 0; }; DECLARE_BUILD_STAGE(fpc, build_fpc); diff --git a/fpc/library/c.cpp b/fpc/library/c.cpp index 87183c2..4812e3d 100644 --- a/fpc/library/c.cpp +++ b/fpc/library/c.cpp @@ -19,12 +19,13 @@ CLDProject CCProject::Compile() unsigned int hash = GenerateProjectHash(); for (auto &file: files) { - CUtlString szOutputFile = CUtlString("%s/cc/%u/%s.o",FPC_TEMPORAL_DIRNAME, hash, file.GetString()); + CUtlString szOutputFile = CUtlString("%s/cc/%u_%s/%s/%s.o",FPC_TEMPORAL_DIRNAME, hash, m_szName.GetString(), IFileSystem2::OwnDirectory(), file.GetString()); CUtlString szOutputDir = szOutputFile; szOutputDir = dirname(szOutputDir); IFileSystem2::MakeDirectory(szOutputDir); CUtlVector args = { + "-g", "-c", "-o", szOutputFile, @@ -52,10 +53,10 @@ CLDProject CCProject::Compile() IRunner::Run("clang", args); proj.objects.AppendTail((CObject){szOutputFile}); - ClangFile_t file = {}; - file.m_szName = m_szName; - file.m_szArguments = args; - g_clangFiles.AppendTail(file); + ClangFile_t cfile = {}; + cfile.m_szName = m_szName; + cfile.m_szArguments = args; + g_clangFiles.AppendTail(cfile); } return proj; } diff --git a/fpc/library/helper.cpp b/fpc/library/helper.cpp index f06c2b8..41e0eac 100644 --- a/fpc/library/helper.cpp +++ b/fpc/library/helper.cpp @@ -3,6 +3,8 @@ #include "tier0/platform.h" #include "tier1/utlvector.h" #include "tier1/utlstring.h" +#include "unistd.h" +#include "libgen.h" unsigned int g_hashState = 102851263; unsigned int CProject::GenerateProjectHash( void ) @@ -19,11 +21,19 @@ unsigned int CProject::GenerateProjectHash( void ) return hash; }; +static char path[1024]; +static ssize_t pathSize = readlink("/proc/self/exe", path, sizeof(path) - 1); +static char* pathDir = dirname(path); +char *IFileSystem2::OwnDirectory() +{ + return pathDir; +}; + void IFileSystem2::MakeDirectory( const char *psz ) { CUtlVector args = { "-p", - psz, + CUtlString(psz), }; IRunner::Run("mkdir", args); }; diff --git a/fpc/library/ld.cpp b/fpc/library/ld.cpp index cad8e50..e11b107 100644 --- a/fpc/library/ld.cpp +++ b/fpc/library/ld.cpp @@ -17,7 +17,7 @@ CUtlString CLDProject::Link( void ) szFileName = CUtlString("lib%s.so", m_szName.GetString()); break; } - CUtlString szOutputFile = CUtlString("%s/ld/%u/%s",FPC_TEMPORAL_DIRNAME, hash, szFileName.GetString()); + CUtlString szOutputFile = CUtlString("%s/ld/%u_%s/%s",FPC_TEMPORAL_DIRNAME, hash, m_szName.GetString(), szFileName.GetString()); CUtlString szOutputDir = szOutputFile; szOutputDir = dirname(szOutputDir); IFileSystem2::MakeDirectory(szOutputDir); @@ -29,6 +29,7 @@ CUtlString CLDProject::Link( void ) IRunner::Run("ar", args); } else { CUtlVector args = { + "-rdynamic", "-o", szOutputFile, }; diff --git a/fpc/main.cpp b/fpc/main.cpp index 1a0775f..0a50f1f 100644 --- a/fpc/main.cpp +++ b/fpc/main.cpp @@ -4,6 +4,7 @@ #include "tier1/commandline.h" #include "c.h" #include "tier1/utlvector.h" +#include "signal.h" int build() { @@ -24,10 +25,37 @@ int build() return 0; }; - +void IEngine_Signal(int sig) +{ + switch (sig) + { + case SIGSEGV: + case SIGILL: + case SIGABRT: + Plat_Backtrace(); + Plat_FatalErrorFunc("Fault"); + break; + default: + break; + }; + _exit(0); +}; int main(int c, char **v) { + #ifdef __linux + signal(SIGHUP, IEngine_Signal); + signal(SIGINT, IEngine_Signal); + signal(SIGQUIT, IEngine_Signal); + signal(SIGILL, IEngine_Signal); + signal(SIGTRAP, IEngine_Signal); + signal(SIGIOT, IEngine_Signal); + signal(SIGBUS, IEngine_Signal); + signal(SIGFPE, IEngine_Signal); + signal(SIGSEGV, IEngine_Signal); + signal(SIGTERM, IEngine_Signal); + V_printf("cool\n"); + #endif ICommandLine::CreateCommandLine(c, v); if (ICommandLine::CheckParam("build")) return build(); diff --git a/fpc/public/helper.h b/fpc/public/helper.h index e3d21be..c6084c8 100644 --- a/fpc/public/helper.h +++ b/fpc/public/helper.h @@ -15,13 +15,12 @@ public: interface IFileSystem2 { public: + static char *OwnDirectory(); static void MakeDirectory( const char *psz ); static void CopyFile( const char *szDestination, const char *szOrigin ); static void CopyDirectory( const char *szDestination, const char *szOrigin ); }; - - class CBuildStage { public: diff --git a/public/tier1/utlbuffer.h b/public/tier1/utlbuffer.h index 7746a6a..edc82b7 100644 --- a/public/tier1/utlbuffer.h +++ b/public/tier1/utlbuffer.h @@ -5,6 +5,7 @@ #include "tier0/mem.h" #include "tier0/platform.h" #include "tier0/lib.h" +#include "new" template class CUtlBuffer; @@ -31,8 +32,8 @@ public: T operator []( const size_t nIndex ) const; CUtlBuffer& operator=(const CUtlBuffer& other); private: - T* m_pData; - size_t m_nSize; + T* m_pData = NULL; + size_t m_nSize = 0; }; //----------------------------------------------------------------------------- @@ -156,6 +157,7 @@ public: CUtlResizableBuffer( size_t nSize ); CUtlResizableBuffer( const CUtlBuffer& buffer ); CUtlResizableBuffer( const CUtlResizableBuffer& buffer ); + ~CUtlResizableBuffer(); size_t GetSize() const; size_t GetRealSize() const; @@ -168,9 +170,9 @@ public: CUtlResizableBuffer& operator=(const CUtlResizableBuffer& other); private: size_t CalculateMemorySize(size_t nSize); - T* m_pData; - size_t m_nSize; - size_t m_nAllocatedSize; + T* m_pData = NULL; + size_t m_nSize = 0; + size_t m_nAllocatedSize = 0; }; @@ -179,24 +181,20 @@ private: // Constructor. //----------------------------------------------------------------------------- template -CUtlResizableBuffer::CUtlResizableBuffer() : m_nSize(1) +CUtlResizableBuffer::CUtlResizableBuffer() { - m_pData = (T*)V_malloc(1); - m_nAllocatedSize = 1; + m_pData = NULL; + m_nSize = 0; + m_nAllocatedSize = 0; } //----------------------------------------------------------------------------- // Constructor. //----------------------------------------------------------------------------- template -CUtlResizableBuffer::CUtlResizableBuffer( size_t nSize ) : m_nSize(nSize) +CUtlResizableBuffer::CUtlResizableBuffer( size_t nSize ) { - if ( nSize == 0 ) - nSize = 1; - size_t nAllocSize = CalculateMemorySize(sizeof(T)*nSize); - m_pData = (T*)V_malloc(nAllocSize); - m_nAllocatedSize = nAllocSize; - V_memset(m_pData, 0, sizeof(T)*nSize); + Resize(nSize); } //----------------------------------------------------------------------------- @@ -205,10 +203,6 @@ CUtlResizableBuffer::CUtlResizableBuffer( size_t nSize ) : m_nSize(nSize) template CUtlResizableBuffer::CUtlResizableBuffer( const CUtlBuffer& buffer ) : m_nSize(buffer.nSize) { - size_t nAllocSize = CalculateMemorySize(sizeof(T)*buffer.nSize); - m_pData = (T*)V_malloc(nAllocSize); - m_nAllocatedSize = nAllocSize; - V_memcpy(m_pData,buffer.m_pData,sizeof(T)*buffer.nSize); } //----------------------------------------------------------------------------- @@ -217,11 +211,21 @@ CUtlResizableBuffer::CUtlResizableBuffer( const CUtlBuffer& buffer ) : m_n template CUtlResizableBuffer::CUtlResizableBuffer( const CUtlResizableBuffer& buffer ) : m_nSize(buffer.m_nSize) { - m_pData = (T*)V_malloc(sizeof(T)*buffer.m_nAllocatedSize); - m_nAllocatedSize = buffer.m_nAllocatedSize; - V_memcpy(m_pData,buffer.m_pData,sizeof(T)*buffer.m_nSize); + *this = buffer; } +template +CUtlResizableBuffer::~CUtlResizableBuffer() +{ + for ( size_t i = 0; i < m_nSize; i++) + m_pData[i].~T(); + if (m_pData) + V_free(m_pData); + m_pData = 0; + m_nSize = 0; + m_nAllocatedSize = 0; +}; + //----------------------------------------------------------------------------- // Gets memory size. //----------------------------------------------------------------------------- @@ -246,25 +250,21 @@ size_t CUtlResizableBuffer::GetRealSize( void ) const template void CUtlResizableBuffer::Resize( size_t nSize ) { - if ( nSize == 0 ) - nSize = 1; - - - if ( m_pData == 0 ) - m_pData = (T*)V_malloc(CalculateMemorySize(sizeof(T)*nSize)); - else + if (nSize > m_nAllocatedSize) { - size_t nAllocSize = CalculateMemorySize(sizeof(T)*nSize); - if (nAllocSize!=m_nAllocatedSize) + size_t nAllocationSize = CalculateMemorySize(nSize); + T *pData = (T*)V_malloc(nAllocationSize*sizeof(T)); + for (size_t i = 0; i < m_nSize; i++) { - // not ideal - T* pData = (T*)V_malloc(nAllocSize); - V_memcpy(pData, m_pData, m_nAllocatedSize>nAllocSize ? nAllocSize : m_nAllocatedSize ); - m_nAllocatedSize = nAllocSize; - V_free(m_pData); - m_pData = pData; + new (&pData[i]) T(m_pData[i]); + m_pData[i].~T(); } + V_free(m_pData); + m_pData = pData; + m_nAllocatedSize = nAllocationSize; } + for ( size_t i = m_nSize; i < nSize; ++i ) + new (&m_pData[i]) T(); m_nSize = nSize; } @@ -320,11 +320,17 @@ CUtlResizableBuffer& CUtlResizableBuffer::operator=(const CUtlResizableBuf { if ( this != &other ) { - V_free(m_pData); - m_pData = (T*)V_malloc(other.m_nAllocatedSize); - V_memcpy(m_pData, other.m_pData, sizeof(T)*other.m_nSize); + if (m_pData) + { + for (size_t i = 0; i < m_nSize; i++) + m_pData[i].~T(); + V_free(m_pData); + } + m_pData = (T*)V_malloc(other.m_nAllocatedSize*sizeof(T)); m_nAllocatedSize = other.m_nAllocatedSize; m_nSize = other.m_nSize; + for ( size_t i = 0; i < other.m_nSize; i++) + new (&m_pData[i]) T(other.m_pData[i]); } return *this; } @@ -343,7 +349,9 @@ size_t CUtlResizableBuffer::CalculateMemorySize(size_t nSize) x |= x >> 4; x |= x >> 8; x |= x >> 16; +#if SIZE_MAX > UINT32_MAX x |= x >> 32; +#endif return x + 1; } diff --git a/public/tier1/utlstring.h b/public/tier1/utlstring.h index 9ad3098..2aad6a0 100644 --- a/public/tier1/utlstring.h +++ b/public/tier1/utlstring.h @@ -26,7 +26,7 @@ public: bool operator==(CUtlString& string); bool operator!=(CUtlString& string); private: - CUtlVector m_data; + CUtlVector m_data = 0; }; #endif diff --git a/public/tier1/utlvector.h b/public/tier1/utlvector.h index c1086e5..90d7def 100644 --- a/public/tier1/utlvector.h +++ b/public/tier1/utlvector.h @@ -75,7 +75,7 @@ private: template CUtlVector::CUtlVector( void ) { - m_data.Resize(0); + }; //---------------------------------------------------------------------------- @@ -85,6 +85,7 @@ template CUtlVector::CUtlVector( size_t nSize ) { m_data.Resize(nSize); + V_memset(m_data.GetMemory(),0,m_data.GetSize()*sizeof(T)); m_nSize = nSize; }; @@ -95,20 +96,20 @@ template CUtlVector::CUtlVector( CUtlInitializerList initalizerList ) { m_data.Resize(initalizerList.size()); + V_memset(m_data.GetMemory(),0,m_data.GetSize()*sizeof(T)); m_nSize = m_data.GetSize(); - V_memcpy(m_data.GetMemory(), initalizerList.begin(), m_data.GetSize()*sizeof(T)); + for (size_t i = 0; i CUtlVector::CUtlVector( const CUtlVector& vector ) { - m_data = vector.m_data; + *this = vector; } template CUtlVector::~CUtlVector() { - for ( uint32_t i = 0; i < m_nSize; i++ ) - m_data[i].~T(); } template @@ -133,7 +134,8 @@ template void CUtlVector::AppendTail( const T *pData, size_t n ) { m_data.Resize(m_data.GetSize()+n); - V_memcpy(m_data+m_nSize,pData,sizeof(T)*n); + for ( size_t i = 0; i < n; i++ ) + m_data[i+m_nSize] = pData[i]; m_nSize+=n; } @@ -180,6 +182,7 @@ size_t CUtlVector::GetSize( void ) template void CUtlVector::Resize( size_t nSize ) { + m_data.Resize(nSize); m_nSize = nSize; } template @@ -193,9 +196,7 @@ CUtlVector &CUtlVector::operator=(const CUtlVector &vec) if (this != &vec) { m_nSize = vec.m_nSize; - m_data.Resize(m_nSize); - for ( uint32_t i = 0; i < m_nSize; i++ ) - m_data[i] = vec.m_data[i]; + m_data = vec.m_data; } return *this; } diff --git a/tier0/platform.cpp b/tier0/platform.cpp index c5fdfb5..6f32473 100644 --- a/tier0/platform.cpp +++ b/tier0/platform.cpp @@ -60,7 +60,35 @@ PLATFORM_INTERFACE void Plat_ListDirRecursive(const char* szPath, ListDirCallbac } PLATFORM_INTERFACE void Plat_ListDir(const char* szPath, ListDirCallbackFn file, ListDirCallbackFn dir) { + struct dirent *entry; + DIR *dp = opendir(szPath); + if (!dp) { + return; + } + + while ((entry = readdir(dp)) != NULL) { + char full_path[1024]; + if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) + continue; + + snprintf(full_path, sizeof(full_path), "%s/%s", szPath, entry->d_name); + + struct stat statbuf; + if (stat(full_path, &statbuf) == -1) { + continue; + } + + if (S_ISDIR(statbuf.st_mode)) { + if (dir) + dir(full_path); + } else { + if (file) + file(full_path); + } + } + + closedir(dp); } PLATFORM_INTERFACE char *Plat_GetExtension( const char *szPath ) diff --git a/tier1/utlstring.cpp b/tier1/utlstring.cpp index b605330..35677cc 100644 --- a/tier1/utlstring.cpp +++ b/tier1/utlstring.cpp @@ -23,7 +23,7 @@ CUtlString::CUtlString( const char *szFormat, ... ) m_data.Reserve(nSize + 1); va_end(vlArgs2); V_vsnprintf(m_data.GetData(), nSize + 1, szFormat, vlArgs); - m_data.Resize(nSize); + m_data.Resize(nSize+1); va_end(vlArgs); } @@ -34,6 +34,7 @@ CUtlString::CUtlString( const CUtlString &sz ) void CUtlString::AppendTail( const char *psz ) { + m_data.Resize(m_data.GetSize()-1); m_data.AppendTail(psz,V_strlen(psz)); m_data.Reserve(m_data.GetSize()+1); m_data[m_data.GetSize()] = 0; @@ -73,7 +74,9 @@ CUtlString::operator char*( void ) CUtlString &CUtlString::operator=(const CUtlString &sz) { if (this != &sz) + { m_data = sz.m_data; + } return *this; }