diff --git a/fpc/Makefile b/fpc/Makefile index d16cb76..2e5fc5a 100644 --- a/fpc/Makefile +++ b/fpc/Makefile @@ -1,11 +1,11 @@ # We want to build just enough to use other stuff -TIER0_FILES := ../tier0/lib.cpp ../tier0/mem.cpp ../tier0/platform.cpp -TIER1_FILES := ../tier1/utlbuffer.cpp ../tier1/interface.cpp ../tier1/utlstring.cpp ../tier1/utlvector.cpp ../tier1/utlmap.cpp ../tier1/commandline.cpp +TIER0_FILES := ../tier0/lib.cpp ../tier0/mem.cpp ../tier0/platform.cpp ../tier0/commandline.cpp +TIER1_FILES := ../tier1/utlbuffer.cpp ../tier1/interface.cpp ../tier1/utlstring.cpp ../tier1/utlvector.cpp ../tier1/utlmap.cpp TIER2_FILES := ../tier2/filesystem.cpp ../tier2/fileformats/ini.cpp FILESYSTEM_FILES := ../stdfilesystems/filesystem_libc.cpp TIER1_OBJS := $(TIER1_FILES:.cpp=.o) TIER2_OBJS := $(TIER2_FILES:.cpp=.o) -FPC_FILES := library/runner.cpp library/helper.cpp library/c.cpp library/ld.cpp library/clang/c.cpp library/clang/ld.cpp library/target.cpp library/builder.cpp +FPC_FILES := library/helper.cpp library/target.cpp library/builder.cpp library/runner.cpp library/c.cpp library/ld.cpp library/clang/c.cpp library/clang/ld.cpp CC = clang CCFLAGS = -g -I../public -Ipublic @@ -16,14 +16,12 @@ endif ifeq ($(UNAME_S),Linux) endif -recompile: ../build/tools +recompile: ../build/tools/fpc build/fpc build - mv fpc_temp fpc -install: ../build/tools libfpcbuild.a libfpc.so libtier0.so libtier1.a libtier2.a libfilesystem_std.so builddir - $(CC) main.cpp -lc -lstdc++ $(CCFLAGS) -o build/fpc build/libtier0.so build/libtier1.a build/libtier2.a build/libfpc.so build/libfilesystem_std.so - gdb --args build/fpc build - mv fpc_temp fpc +install: ../build/tools/fpc libfpcbuild.a libfpc.so libtier0.so libtier1.a libtier2.a libfilesystem_std.so install_temp builddir + $(CC) -fPIC main.cpp library/helper.cpp library/target.cpp library/builder.cpp -lc -lstdc++ $(CCFLAGS) -o build/fpc build/libtier0.so build/libtier1.a build/libtier2.a -Wl,--disable-new-dtags -Wl,-rpath,'$$ORIGIN' + build/fpc build -fpcdebug libtier0.so: $(TIER0_FILES) builddir $(CC) $(CCFLAGS) -fPIC -shared -o build/libtier0.so $(TIER0_FILES) @@ -31,10 +29,10 @@ libtier0.so: $(TIER0_FILES) builddir %.o: %.cpp $(CC) $(CCFLAGS) -fPIC -c $< -o $@ -libtier1.a: $(TIER1_OBJS) builddir +libtier1.a: $(TIER1_OBJS) builddir libtier0.so ar rcs build/libtier1.a $(TIER1_OBJS) -libtier2.a: $(TIER2_OBJS) builddir +libtier2.a: $(TIER2_OBJS) builddir libtier1.a ar rcs build/libtier2.a $(TIER2_OBJS) libfilesystem_std.so: $(FILESYSTEM_FILES) libtier1.a builddir @@ -43,20 +41,26 @@ libfilesystem_std.so: $(FILESYSTEM_FILES) libtier1.a builddir libfpcbuild.a: buildfile/interfaces.o builddir ar rcs build/libfpcbuild.a buildfile/interfaces.o -libfpc.so: $(FPC_FILES) builddir libfpcbuild.a - $(CC) $(CCFLAGS) -fPIC -shared -o build/libfpc.so build/libfpcbuild.a $(FPC_FILES) +libfpc.so: $(FPC_FILES) builddir libfpcbuild.a libtier1.a + $(CC) $(CCFLAGS) $(FPC_FILES) library/libfpc.cpp -fPIC -shared -o build/libfpc.so build/libtier1.a builddir: mkdir -p build -../build/tools: +../build/tools/fpc: mkdir -p ../build/tools/fpc -install_fpc: +install_fpc: ../build/tools/fpc + mv build/fpc_temp fpc + mv build/libtier0_temp.so libtier0.so + mv build/libfpc_temp.so libfpc.so + mv build/libfilesystem_std_temp.so libfilesystem_std.so cp -r build/* ../build/tools/fpc - cp -r public ../build/tools - cp -r ../public/tier0 ../build/tools/public - cp -r ../public/tier1 ../build/tools/public - cp -r ../public/tier2 ../build/tools/public + +install_temp: builddir + cp -r public build + cp -r ../public/tier0 build/public + cp -r ../public/tier1 build/public + cp -r ../public/tier2 build/public auto: install install_fpc diff --git a/fpc/build.cpp b/fpc/build.cpp index 8f2ce90..a96a0a0 100644 --- a/fpc/build.cpp +++ b/fpc/build.cpp @@ -10,14 +10,20 @@ ADD_DEPENDENCY_BUILD_FILE(tier1, "../tier1/"); ADD_DEPENDENCY_BUILD_FILE(tier2, "../tier2/"); -CUtlVector g_CompiledFiles = { +CUtlVector g_fpcFiles = { "main.cpp", - "library/runner.cpp", "library/helper.cpp", "library/target.cpp", "library/builder.cpp", - +}; + +CUtlVector g_libFpcFiles = { + "library/libfpc.cpp", + "library/helper.cpp", + "library/target.cpp", + "library/builder.cpp", + "library/runner.cpp", "library/winerunner.cpp", "library/c.cpp", @@ -33,47 +39,108 @@ CUtlVector g_CompiledFiles = { }; -CreateInterfaceFn fpcFactory; -ILinker *linker; -ICCompiler *ccompiler; -IFileSystem2 *filesystem2; - CUtlVector g_IncludeDirectories = { "public", "../public", }; - -DECLARE_BUILD_STAGE(fpc) +DECLARE_BUILD_STAGE(libfpcbuild) { - DEPEND_ON_PROJECT("tier0"); - DEPEND_ON_PROJECT("tier1"); - DEPEND_ON_PROJECT("tier2"); - - if (linker->IsLibraryExists("clang")) - g_CompiledFiles.AppendTail("library/clang/c_libclang.cpp"); - else - V_printf("Warning: to support included files libclang must be installed."); CProject_t compileProject = {}; LinkProject_t ldProject = {}; compileProject.m_szName = "fpc"; - compileProject.files = g_CompiledFiles; + compileProject.files = g_libFpcFiles; compileProject.includeDirectories = g_IncludeDirectories; + compileProject.bFPIC = true; ldProject = ccompiler->Compile(&compileProject); - ldProject.libraryObjects = { - GET_PROJECT_LIBRARY("tier0", "tier0") - GET_PROJECT_LIBRARY("tier1", "tier1") - GET_PROJECT_LIBRARY("tier2", "tier2") - }; + ldProject.linkType = ELINK_STATIC_LIBRARY; if (linker->IsLibraryExists("clang")) ldProject.libraries.AppendTail("clang"); CUtlString outputProject = linker->Link(&ldProject); - filesystem2->MakeDirectory("../build/tools"); - filesystem2->CopyFile("fpc_temp", outputProject); + + ADD_OUTPUT_OBJECT("fpc", outputProject) + + return 0; +} +DECLARE_BUILD_STAGE(libfpc) +{ + if (linker->IsLibraryExists("clang")) + g_libFpcFiles.AppendTail("library/clang/c_libclang.cpp"); + else + V_printf("Warning: to support included files libclang must be installed."); + CProject_t compileProject = {}; + LinkProject_t ldProject = {}; + + compileProject.m_szName = "fpc"; + compileProject.files = g_libFpcFiles; + compileProject.includeDirectories = g_IncludeDirectories; + compileProject.bFPIC = true; + ldProject = ccompiler->Compile(&compileProject); + ldProject.linkType = ELINK_DYNAMIC_LIBRARY; + ldProject.libraryObjects = { + GET_PROJECT_LIBRARY(tier0, "tier0"), + GET_PROJECT_LIBRARY(tier1, "tier1"), + GET_PROJECT_LIBRARY(tier2, "tier2"), + }; + V_printf("WHAT %s\n",GET_PROJECT_LIBRARY(tier0, "tier0").GetString()); + + if (linker->IsLibraryExists("clang")) + ldProject.libraries.AppendTail("clang"); + + CUtlString outputProject = linker->Link(&ldProject); + + + ADD_OUTPUT_OBJECT("fpc", outputProject) + + return 0; +}; + +DECLARE_BUILD_STAGE(fpc) +{ + CProject_t compileProject = {}; + LinkProject_t ldProject = {}; + + compileProject.m_szName = "fpc"; + compileProject.files = g_fpcFiles; + compileProject.includeDirectories = g_IncludeDirectories; + ldProject = ccompiler->Compile(&compileProject); + ldProject.libraryObjects = { + GET_PROJECT_LIBRARY(tier0, "tier0"), + GET_PROJECT_LIBRARY(tier1, "tier1"), + GET_PROJECT_LIBRARY(tier2, "tier2"), + GET_PROJECT_LIBRARY(libfpc, "fpc"), + }; + V_printf("WHAT %s\n",GET_PROJECT_LIBRARY(tier0, "tier0").GetString()); + + if (linker->IsLibraryExists("clang")) + ldProject.libraries.AppendTail("clang"); + + CUtlString outputProject = linker->Link(&ldProject); + + + ADD_OUTPUT_OBJECT("fpc", outputProject) + + return 0; +}; + + +DECLARE_BUILD_STAGE(install) +{ + CUtlString szExe = GET_PROJECT_LIBRARY(fpc, "fpc"); + CUtlString szLibFpc = GET_PROJECT_LIBRARY(libfpc, "fpc"); + CUtlString szTier0 = GET_PROJECT_LIBRARY(tier0, "tier0"); + CUtlString szTier1 = GET_PROJECT_LIBRARY(tier1, "tier1"); + CUtlString szTier2 = GET_PROJECT_LIBRARY(tier2, "tier2"); + + filesystem2->CopyFile("build/fpc_temp", szExe); + filesystem2->CopyFile("build/libfpc.so", szLibFpc); + filesystem2->CopyFile("build/libtier0_temp.so", szTier0); + filesystem2->CopyFile("build/libtier1.a", szTier1); + filesystem2->CopyFile("build/libtier2.a", szTier2); return 0; }; diff --git a/fpc/buildfile/interfaces.cpp b/fpc/buildfile/interfaces.cpp index 0993e7c..dc88f73 100644 --- a/fpc/buildfile/interfaces.cpp +++ b/fpc/buildfile/interfaces.cpp @@ -2,6 +2,9 @@ #include "helper.h" static BuildFileInfo_t buildfileinfo = {}; +CBuildStage *g_pCurrentStage = NULL; +GetProjectObjectFn g_pfnGetProjectObject = NULL; + BuildFileInfo_t *GetBuildFileInfo() { return &buildfileinfo; @@ -12,6 +15,7 @@ CBuildStage::CBuildStage( const char *psz, int(*pMainFn)() ) { m_psz = psz; m_pMainFn = pMainFn; + printf("%p\n",m_pMainFn); if (psz == 0 || pMainFn == 0) Plat_FatalErrorFunc("Name and function pointer must be set\n"); @@ -20,7 +24,19 @@ CBuildStage::CBuildStage( const char *psz, int(*pMainFn)() ) CBuildDependentFile::CBuildDependentFile( const char *psz ) { + // TODO: This doesn't affect recursion, which is bad + GetBuildFileInfo()->m_dependantFiles.AppendTail(psz); } -EXPOSE_INTERFACE_GLOBALVAR(BuildFileInfo_t, BuildFileInfo_t, BUILD_FILE_INFO_INTERFACE_NAME, buildfileinfo); +CUtlString FPC_GetProjectObject( const char *szName, const char *szObjectName ) +{ + CUtlString szOutputString; + szOutputString = g_pfnGetProjectObject(szName, szObjectName); + return szOutputString; +} + + +EXPOSE_INTERFACE_GLOBALVAR(BuildFileInfo_t, BuildFileInfo_t, BUILD_FILE_INFO_INTERFACE_VERSION, buildfileinfo); +EXPOSE_INTERFACE_GLOBALVAR(CBuildStage, CBuildStage, BUILD_CURRENT_STAGE_INTERFACE_VERSION, g_pCurrentStage); +EXPOSE_INTERFACE_GLOBALVAR(GetProjectObjectFn, GetProjectObjectFn, BUILD_GET_PROJECT_OBJECT_INTERFACE_VERSION, g_pfnGetProjectObject); diff --git a/fpc/buildfile/interfaces.o b/fpc/buildfile/interfaces.o index 62eb143..93d1f44 100644 Binary files a/fpc/buildfile/interfaces.o and b/fpc/buildfile/interfaces.o differ diff --git a/fpc/fpc_temp b/fpc/fpc_temp new file mode 100644 index 0000000..319fbbb Binary files /dev/null and b/fpc/fpc_temp differ diff --git a/fpc/public/dependencymanager.h b/fpc/generators/make/make.cpp similarity index 100% rename from fpc/public/dependencymanager.h rename to fpc/generators/make/make.cpp diff --git a/fpc/library/builder.cpp b/fpc/library/builder.cpp index c7abd52..e26229a 100644 --- a/fpc/library/builder.cpp +++ b/fpc/library/builder.cpp @@ -2,6 +2,9 @@ #include "ld.h" #include "c.h" +CUtlVector buildFileInfos = {}; + + class CProjectBuilder : public IProjectBuilder { public: @@ -20,6 +23,26 @@ IProjectBuilder *ProjectBuilder() return &s_projectBuilder; }; +CUtlString FPC_GetProjectObject( const char *szName, const char *szObjectName ) +{ + for (auto b: buildFileInfos) + { + for (auto s: b.m_stages) + { + if (strcmp(s->m_psz, szName)) + continue; + for (auto o: s->m_outputs) + { + if (strcmp(o.m_szName, szObjectName)) + continue; + + return o.m_szPath; + } + } + } + return NULL; +} + BuildFile_t *CProjectBuilder::BuildProject( const char *szProjectName, const char *szPath ) { CProject_t stCompileProject = {}; @@ -30,7 +53,8 @@ BuildFile_t *CProjectBuilder::BuildProject( const char *szProjectName, const cha BuildFileInfo_t *pBuildFileInfo; BuildFileInfo_t stBuildFileInfo; BuildFile_t *pBuildFile = NULL; - + CBuildStage **ppExecutedBuildStage = NULL; + GetProjectObjectFn *pfnGetProjectObject = NULL; CUtlString szWd = CUtlString(szPath).GetDirectory(); Plat_SetWorkingDir(szWd); @@ -40,16 +64,17 @@ BuildFile_t *CProjectBuilder::BuildProject( const char *szProjectName, const cha stCompileProject.files = { szPath, }; - stCompileProject.includeDirectories = {CUtlString("%s/public",filesystem2->OwnDirectory()),CUtlString("%s/public", filesystem2->BuildDirectory()), CUtlString("%s/../public",filesystem2->OwnDirectory()),CUtlString("%s/../public", filesystem2->BuildDirectory())}; + stCompileProject.includeDirectories = {CUtlString("%s/public",filesystem2->OwnDirectory())}; stCompileProject.bFPIC = true; stCompileProject.m_target = Target_t::HostTarget(); stLinkProject = ccompiler->Compile(&stCompileProject); stLinkProject.linkType = ELINK_DYNAMIC_LIBRARY; stLinkProject.m_target = Target_t::HostTarget(); - stLinkProject.objects.AppendHead({CUtlString("%s/libfpcbuild.a",filesystem2->OwnDirectory())}); - stLinkProject.objects.AppendHead({CUtlString("%s/libtier2.a",filesystem2->OwnDirectory())}); - stLinkProject.objects.AppendHead({CUtlString("%s/libtier1.a",filesystem2->OwnDirectory())}); + stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libfpcbuild.a",filesystem2->OwnDirectory())}); + stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libfpc.so",filesystem2->OwnDirectory())}); + stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libtier2.a",filesystem2->OwnDirectory())}); + stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libtier1.a",filesystem2->OwnDirectory())}); szBuildLibrary = linker->Link(&stLinkProject); pLibrary = Plat_LoadLibrary(szBuildLibrary); @@ -64,17 +89,21 @@ BuildFile_t *CProjectBuilder::BuildProject( const char *szProjectName, const cha return NULL; } - pBuildFileInfo = (BuildFileInfo_t*)pBuildFactory(BUILD_FILE_INFO_INTERFACE_NAME, NULL); - if (!pBuildFileInfo) + pBuildFileInfo = (BuildFileInfo_t*)pBuildFactory(BUILD_FILE_INFO_INTERFACE_VERSION, NULL); + ppExecutedBuildStage = (CBuildStage**)pBuildFactory(BUILD_CURRENT_STAGE_INTERFACE_VERSION, NULL); + pfnGetProjectObject = (GetProjectObjectFn*)pBuildFactory(BUILD_GET_PROJECT_OBJECT_INTERFACE_VERSION, NULL); + if (!pBuildFileInfo || !ppExecutedBuildStage || !pfnGetProjectObject) { - V_printf("Failed to find build file info interface\n"); + V_printf("Required interfaces are not present\n"); Plat_UnloadLibrary(szBuildLibrary); return NULL; } stBuildFileInfo = *pBuildFileInfo; + buildFileInfos.AppendTail(stBuildFileInfo); + *pfnGetProjectObject = FPC_GetProjectObject; for (auto a: stBuildFileInfo.m_dependantFiles) { - BuildProject("something", CUtlString("%s/build.cpp",a)); + BuildProject("something", CUtlString("%s/%s/build.cpp",szWd.GetString(),a)); } Plat_SetWorkingDir(szWd); @@ -82,7 +111,14 @@ BuildFile_t *CProjectBuilder::BuildProject( const char *szProjectName, const cha for (auto &build: stBuildFileInfo.m_stages) { + *ppExecutedBuildStage = build; build->m_pMainFn(); + for ( auto &o: build->m_outputs) + { + o.m_szPath.AppendHead("/"); + o.m_szPath.AppendHead(Plat_GetWorkingDir()); + printf("%s: %s = %s\n",build->m_psz,o.m_szName, o.m_szPath.GetString()); + }; }; pBuildFile = new BuildFile_t; diff --git a/fpc/library/c.cpp b/fpc/library/c.cpp index de7988d..95e00c5 100644 --- a/fpc/library/c.cpp +++ b/fpc/library/c.cpp @@ -7,7 +7,16 @@ ICCompiler *ccompiler; CUtlString ICCompiler::GetOutputObjectName( CProject_t *pProject, unsigned int hash, CUtlString szFileName ) { CUtlString szTarget = pProject->m_target.GetTriplet(); - return CUtlString("%s/%s/cc/%u_%s/%s/%s%s",FPC_TEMPORAL_DIRNAME, szTarget.GetString(), hash, pProject->m_szName.GetString(), filesystem2->BuildDirectory(), szFileName.GetString(), GetOutputObjectFormat()); + + return CUtlString( + "%s/%s/cc/%u_%s/%s/%s%s", + FPC_TEMPORAL_DIRNAME, + szTarget.GetString(), + hash, + pProject->m_szName.GetString(), + filesystem2->BuildDirectory(), + szFileName.GetString(), + GetOutputObjectFormat()); }; CUtlVector ICCompiler::BuildCommandLine( CProject_t *pProject, const char *szFileName, const char *szOutputFileName ) @@ -44,6 +53,7 @@ LinkProject_t ICCompiler::Compile( CProject_t *pProject ) proj.m_androidmanifest = pProject->m_androidmanifest; unsigned int hash = pProject->GenerateProjectHash(); + // Get output directories for (auto &file: pProject->files) { diff --git a/fpc/library/clang/ld.cpp b/fpc/library/clang/ld.cpp index a6e16e5..4aeccba 100644 --- a/fpc/library/clang/ld.cpp +++ b/fpc/library/clang/ld.cpp @@ -156,7 +156,7 @@ CUtlString CClangLinker::Link( LinkProject_t *pProject ) } if (pProject->m_target.kernel == TARGET_KERNEL_LINUX || pProject->m_target.kernel == TARGET_KERNEL_ANDROID) { - //args.AppendTail("-rdynamic"); + args.AppendTail("-Wl,--disable-new-dtags"); args.AppendTail("-Wl,-rpath,$ORIGIN"); } @@ -174,6 +174,8 @@ CUtlString CClangLinker::Link( LinkProject_t *pProject ) args.AppendTail(object.m_szObjectFile); if (pProject->m_target.kernel == TARGET_KERNEL_WINDOWS || pProject->m_target.kernel == TARGET_KERNEL_LINUX || pProject->m_target.kernel == TARGET_KERNEL_ANDROID) args.AppendTail("-Wl,--no-whole-archive"); + for (auto object: pProject->libraryObjects) + args.AppendTail(object); // Libraries for (auto lib: pProject->libraries) diff --git a/fpc/library/helper.cpp b/fpc/library/helper.cpp index 042f148..8f2ba0e 100644 --- a/fpc/library/helper.cpp +++ b/fpc/library/helper.cpp @@ -35,7 +35,8 @@ static uint32_t pathSize = sizeof(path); static int pathResult = _NSGetExecutablePath(path, &pathSize); #endif static char *szPathDir = dirname(path); -char *g_szBuildDir = 0; +static char *s_szBuildDir = 0; +EXPOSE_INTERFACE_GLOBALVAR(szBuildDir, char*, FILE_SYSTEM_2_BUILD_DIRECTORY_INTERFACE_VERSION, s_szBuildDir); class CPOSIXFileSystem2: public IFileSystem2 { @@ -87,24 +88,26 @@ char *CPOSIXFileSystem2::OwnDirectory() }; char *CPOSIXFileSystem2::BuildDirectory() { - return g_szBuildDir; + return s_szBuildDir; }; void CPOSIXFileSystem2::CopyFile( const char *szDestination, const char *szOrigin ) { CUtlVector args = { - CUtlString(szOrigin), - CUtlString(szDestination), + szOrigin, + szDestination, }; - runner->Run("cp", args); + printf("runner: %p\n",runner); + runner->Run(CUtlString("cp"), args); + printf("runner: %p\n",runner); runner->Wait(); } void CPOSIXFileSystem2::CopyDirectory( const char *szDestination, const char *szOrigin ) { CUtlVector args = { "-r", - CUtlString(szOrigin), - CUtlString(szDestination), + szOrigin, + szDestination, }; runner->Run("cp", args); runner->Wait(); @@ -133,4 +136,5 @@ bool CPOSIXFileSystem2::ShouldRecompile(const char *szSource, const char *szOutp return outbuf.st_mtime < srcbuf.st_mtime; }; + IINIFile *g_pConfig; diff --git a/fpc/library/libfpc.cpp b/fpc/library/libfpc.cpp new file mode 100644 index 0000000..1f05ebb --- /dev/null +++ b/fpc/library/libfpc.cpp @@ -0,0 +1,15 @@ +#include "helper.h" +#include "runner.h" +#include "c.h" +#include "ld.h" + +void *LibFpcInit() +{ + filesystem2 = (IFileSystem2*)CreateInterface(FILE_SYSTEM_2_INTERFACE_NAME, NULL); + runner = (IRunner*)CreateInterface(RUNNER_INTERFACE_NAME, NULL); + ccompiler = (ICCompiler*)CreateInterface(CLANG_C_COMPILER_INTERFACE_NAME, NULL); + linker = (ILinker*)CreateInterface(CLANG_LINKER_INTERFACE_NAME, NULL); + return NULL; +} + +EXPOSE_INTERFACE_FN(LibFpcInit, LibFpcInit, LIBFPC_INIT_INTERFACE_VERSION); diff --git a/fpc/library/runner.cpp b/fpc/library/runner.cpp index 54b6fbe..bf2903a 100644 --- a/fpc/library/runner.cpp +++ b/fpc/library/runner.cpp @@ -9,8 +9,8 @@ #include "winerunner.h" -CUtlVector g_processes; +CUtlVector m_processes; class CPOSIXRunner: public IRunner { public: @@ -51,7 +51,9 @@ int CPOSIXRunner::Run(CUtlString szName, CUtlVector& args) _exit(0); } } - g_processes.AppendTail(pid); + printf("%i %p\n",m_processes.GetSize(),m_processes.GetData()); + m_processes.AppendTail(pid); + printf("%i %p\n",m_processes.GetSize(),m_processes.GetData()); return 0; } @@ -83,7 +85,9 @@ int CPOSIXRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector g_processes; class CWindowsRunner: public IRunner { @@ -15,6 +14,7 @@ public: virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args ) override; virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment ) override; virtual int Wait( void ) override; + CUtlVector s_processes = {}; }; EXPOSE_INTERFACE(CWindowsRunner, IRunner, POSIX_RUNNER_INTERFACE_NAME); @@ -47,7 +47,7 @@ int CWindowsRunner::Run(CUtlString szName, CUtlVector& args) _exit(0); } } - g_processes.AppendTail(pid); + s_processes.AppendTail(pid); return 0; } @@ -79,7 +79,7 @@ int CWindowsRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVectorBuildProject("main",CUtlString("%s/build.cpp",g_szBuildDir)); + BuildFile_t *pBuildFile = ProjectBuilder()->BuildProject("main",CUtlString("%s/build.cpp",*pszBuildDir)); /* @@ -80,6 +80,12 @@ void IEngine_Signal(int sig) Plat_Exit(0); }; +IRunner *runner; +IWineRunner *winerunner; +ICCompiler *ccompiler; +ILinker *linker; + + int main(int c, char **v) { @@ -104,7 +110,6 @@ findbuild: } else { V_fclose(file); } - g_szBuildDir = szBuildcppDir; #ifdef __linux signal(SIGHUP, IEngine_Signal); @@ -118,17 +123,28 @@ findbuild: signal(SIGSEGV, IEngine_Signal); signal(SIGTERM, IEngine_Signal); #endif - - runner = (IRunner*)CreateInterface(RUNNER_INTERFACE_NAME, NULL); - winerunner = (IWineRunner*)CreateInterface(WINE_RUNNER_INTERFACE_NAME, NULL); - filesystem2 = (IFileSystem2*)CreateInterface(FILE_SYSTEM_2_INTERFACE_NAME, NULL); - ccompiler = (ICCompiler*)CreateInterface(CLANG_C_COMPILER_INTERFACE_NAME, NULL); - linker = (ILinker*)CreateInterface(CLANG_LINKER_INTERFACE_NAME, NULL); - void *pFilesystem = Plat_LoadLibrary(CUtlString("%s/libfilesystem_std.so",filesystem2->OwnDirectory())); + + void *pLibFPC = Plat_LoadLibrary("libfpc.so"); + CreateInterfaceFn pLibFPCFactory = Sys_GetFactory(pLibFPC); + + filesystem2 = (IFileSystem2*)pLibFPCFactory(FILE_SYSTEM_2_INTERFACE_NAME, NULL); + pszBuildDir = (char**)pLibFPCFactory(FILE_SYSTEM_2_BUILD_DIRECTORY_INTERFACE_VERSION, NULL); + *pszBuildDir = szBuildcppDir; + runner = (IRunner*)pLibFPCFactory(RUNNER_INTERFACE_NAME, NULL); + winerunner = (IWineRunner*)pLibFPCFactory(WINE_RUNNER_INTERFACE_NAME, NULL); + ccompiler = (ICCompiler*)pLibFPCFactory(CLANG_C_COMPILER_INTERFACE_NAME, NULL); + linker = (ILinker*)pLibFPCFactory(CLANG_LINKER_INTERFACE_NAME, NULL); + + + + pLibFPCFactory(LIBFPC_INIT_INTERFACE_VERSION, NULL); + + + void *pFilesystem = Plat_LoadLibrary("libfilesystem_std.so"); CreateInterfaceFn pFilesystemFactory = Sys_GetFactory(pFilesystem); - filesystem = (IFileSystem*)CreateInterface(FILESYSTEM_INTERFACE_VERSION, NULL); + filesystem = (IFileSystem*)pFilesystemFactory(FILESYSTEM_INTERFACE_VERSION, NULL); filesystem->Init(); g_pConfig = INIManager()->ReadFile(".fpccfg"); diff --git a/fpc/public/generator.h b/fpc/public/generator.h new file mode 100644 index 0000000..e69de29 diff --git a/fpc/public/helper.h b/fpc/public/helper.h index ef27a56..78a70e4 100644 --- a/fpc/public/helper.h +++ b/fpc/public/helper.h @@ -47,6 +47,7 @@ public: // File system manager. //----------------------------------------------------------------------------- #define FILE_SYSTEM_2_INTERFACE_NAME "FileSystem2_001" +#define FILE_SYSTEM_2_BUILD_DIRECTORY_INTERFACE_VERSION "FileSystem2BuildDirectory_001" abstract_class IFileSystem2 { @@ -75,6 +76,11 @@ public: extern IFileSystem2 *filesystem2; +struct StageOutput_t +{ + const char *m_szName; + CUtlString m_szPath; +}; //----------------------------------------------------------------------------- // Build stage. @@ -84,6 +90,8 @@ class CBuildStage public: CBuildStage( const char *psz, int(*pMainFn)() ); const char *m_psz; + CUtlString m_szPath; + CUtlVector m_outputs; int(*m_pMainFn)(); }; @@ -110,11 +118,14 @@ static int __build_stage_##sz() #define ADD_DEPENDENCY_BUILD_FILE(name, path) \ static CBuildDependentFile __##name##DependencyFile(path); -#define ADD_OUTPUT_LIBRARY(sz) \ +#define ADD_OUTPUT_OBJECT(sz, path) \ + g_pCurrentStage->m_outputs.AppendTail((StageOutput_t){sz, path}); #define DEPEND_ON_PROJECT(sz) \ #define GET_PROJECT_LIBRARY(sz, szLib) \ + FPC_GetProjectObject(#sz, szLib) + struct BuildFileInfo_t { @@ -123,8 +134,18 @@ struct BuildFileInfo_t }; BuildFileInfo_t *GetBuildFileInfo(); +extern CBuildStage *g_pCurrentStage; -#define BUILD_FILE_INFO_INTERFACE_NAME "BuildFileInfo001" +CUtlString FPC_GetProjectObject( const char *szName, const char *szObjectName ); + + +#define BUILD_FILE_INFO_INTERFACE_VERSION "BuildFileInfo001" +#define BUILD_CURRENT_STAGE_INTERFACE_VERSION "BuildCurrentStage001" + +typedef CUtlString(*GetProjectObjectFn)( const char *szName, const char *szObjectName ); +#define BUILD_GET_PROJECT_OBJECT_INTERFACE_VERSION "GetProjectObject001" + +#define LIBFPC_INIT_INTERFACE_VERSION "LibFPCInit001" extern IINIFile *g_pConfig; diff --git a/fpc/public/temporalmgr.h b/fpc/public/temporalmgr.h new file mode 100644 index 0000000..e69de29 diff --git a/fpc/public/watchmgr.h b/fpc/public/watchmgr.h new file mode 100644 index 0000000..e69de29 diff --git a/public/tier1/interface.h b/public/tier1/interface.h index e9e9e42..ac5ed1c 100644 --- a/public/tier1/interface.h +++ b/public/tier1/interface.h @@ -27,7 +27,7 @@ public: #define EXPOSE_INTERFACE_GLOBALVAR( className, interfaceName, versionName, globalVarName ) \ static void *__Create##className##_interface() { return ( interfaceName* )( &globalVarName ); }; \ - static CInterfaceRegistry __Create##interfaceName##_registry( __Create##className##_interface, versionName ); + static CInterfaceRegistry __Create##className##_registry( __Create##className##_interface, versionName ); DLL_EXPORT void *CreateInterface( const char *szName, int *pReturnCode ); diff --git a/tier0/build.cpp b/tier0/build.cpp index 8e842e6..e8cca35 100644 --- a/tier0/build.cpp +++ b/tier0/build.cpp @@ -9,6 +9,7 @@ CUtlVector tier0_CompiledFiles = { "mem.cpp", "platform.cpp", "network.cpp", + "commandline.cpp" }; DECLARE_BUILD_STAGE(tier0) @@ -26,7 +27,7 @@ DECLARE_BUILD_STAGE(tier0) ldProject.linkType = ELINK_DYNAMIC_LIBRARY; szOutputProject = linker->Link(&ldProject); - ADD_OUTPUT_LIBRARY(szOutputProject); + ADD_OUTPUT_OBJECT("tier0", szOutputProject); return 0; }; diff --git a/tier1/commandline.cpp b/tier0/commandline.cpp similarity index 100% rename from tier1/commandline.cpp rename to tier0/commandline.cpp diff --git a/tier1/__build.cpp b/tier1/__build.cpp index 4cfb04e..14422e5 100644 --- a/tier1/__build.cpp +++ b/tier1/__build.cpp @@ -13,6 +13,7 @@ CUtlVector tier1_CompiledFiles = { "tier1/utlstring.cpp", "tier1/utlvector.cpp", }; +CUtlString tier1_lib; DECLARE_BUILD_STAGE(tier1) { @@ -21,15 +22,13 @@ DECLARE_BUILD_STAGE(tier1) compileProject.m_szName = "tier1"; compileProject.files = tier1_CompiledFiles; - compileProject.includeDirectories = {"../public"}; + compileProject.includeDirectories = all_IncludeDirectories; compileProject.bFPIC = true; ldProject = ccompiler->Compile(&compileProject); ldProject.linkType = ELINK_STATIC_LIBRARY; - CUtlString szOutputDir = linker->Link(&ldProject); - - ADD_OUTPUT_LIBRARY(szOutputDir) - + CUtlString outputProject = linker->Link(&ldProject); + tier1_lib = outputProject; return 0; }; diff --git a/tier1/build.cpp b/tier1/build.cpp index 402b04b..87b2afb 100644 --- a/tier1/build.cpp +++ b/tier1/build.cpp @@ -7,7 +7,6 @@ CUtlVector tier1_CompiledFiles = { "interface.cpp", "appinit.cpp", - "commandline.cpp", "utlbuffer.cpp", "utlmap.cpp", "utlstring.cpp", @@ -28,7 +27,7 @@ DECLARE_BUILD_STAGE(tier1) CUtlString szOutputDir = linker->Link(&ldProject); - ADD_OUTPUT_LIBRARY(szOutputDir) + ADD_OUTPUT_OBJECT("tier1", szOutputDir) return 0; }; diff --git a/tier1/interface.cpp b/tier1/interface.cpp index 69d5d44..1c8d839 100644 --- a/tier1/interface.cpp +++ b/tier1/interface.cpp @@ -35,8 +35,5 @@ DLL_EXPORT void *CreateInterface( const char *szName, int *pReturnCode ) CreateInterfaceFn Sys_GetFactory( void *lib ) { -#ifdef POSIX - return CreateInterface; -#endif return (CreateInterfaceFn)Plat_GetProc(lib, "CreateInterface"); } diff --git a/tier1/interface.o b/tier1/interface.o index 7ad5ef1..f0047d1 100644 Binary files a/tier1/interface.o and b/tier1/interface.o differ diff --git a/tier2/build.cpp b/tier2/build.cpp index c047f96..7dd949e 100644 --- a/tier2/build.cpp +++ b/tier2/build.cpp @@ -26,7 +26,7 @@ DECLARE_BUILD_STAGE(tier2) CUtlString szOutputProject = linker->Link(&ldProject); - ADD_OUTPUT_LIBRARY(szOutputProject) + ADD_OUTPUT_OBJECT("tier2", szOutputProject) return 0; };