From d19f8742720dcb37147bbe918f6aab9fef37a0ac Mon Sep 17 00:00:00 2001 From: kotofyt Date: Tue, 28 Oct 2025 19:20:11 +0200 Subject: [PATCH] fpc --- fpc/Makefile | 3 +- fpc/library/windows/ld.cpp | 25 ++++---- fpc/library/windows/runner.cpp | 101 +++++++++++++++++++++++++++++++++ fpc/public/ld.h | 13 +++++ 4 files changed, 129 insertions(+), 13 deletions(-) create mode 100644 fpc/library/windows/runner.cpp diff --git a/fpc/Makefile b/fpc/Makefile index 7bc3f0a..c3c8e41 100644 --- a/fpc/Makefile +++ b/fpc/Makefile @@ -1,5 +1,6 @@ # We want to build just enough to use other stuff -TIER_FILES := ../tier0/lib.cpp ../tier0/mem.cpp ../tier0/platform.cpp ../tier1/utlbuffer.cpp ../tier1/interface.cpp ../tier1/utlstring.cpp ../tier1/utlvector.cpp ../tier1/utlmap.cpp ../tier1/commandline.cpp +TIER_FILES := ../tier0/lib.cpp ../tier0/mem.cpp ../tier0/platform.cpp ../tier1/utlbuffer.cpp ../tier1/interface.cpp ../tier1/utlstring.cpp ../tier1/utlvector.cpp ../tier1/utlmap.cpp ../tier1/commandline.cpp ../tier2/filesystem.cpp ../tier2/filesystem_libc.cpp ../tier2/fileformats/ini.cpp + FPC_FILES := main.cpp library/runner.cpp library/helper.cpp library/c.cpp library/ld.cpp library/clang/c.cpp library/clang/ld.cpp library/target.cpp CC = clang OUTPUT_DIR = fpc diff --git a/fpc/library/windows/ld.cpp b/fpc/library/windows/ld.cpp index 2ee4d49..785652f 100644 --- a/fpc/library/windows/ld.cpp +++ b/fpc/library/windows/ld.cpp @@ -49,8 +49,14 @@ CUtlString CMSVCLinker::Link( LinkProject_t *pProject ) szOutputDir = dirname(szOutputDir); filesystem2->MakeDirectory(szOutputDir); + if (!g_pConfig) + Plat_FatalErrorFunc(".fpccfg was not found"); IINISection *pSection = g_pConfig->GetSection("MSVC_LINKER_INTERFACE_NAME"); + if (!pSection) + Plat_FatalErrorFunc("MSVC_LINKER_INTERFACE_NAME was not found in .fpccfg"); CUtlString szExePath = pSection->GetStringValue("exe"); + if (!pSection) + Plat_FatalErrorFunc("exe was not found in MSVC_LINKER_INTERFACE_NAME"); if (pProject->linkType == ELINK_STATIC_LIBRARY) { @@ -106,11 +112,15 @@ CUtlString CMSVCLinker::Link( LinkProject_t *pProject ) "-target", szCompiledTarget, }; + if (pProject->linkType == ELINK_KERNEL_DRIVER) + { + args.AppendTail("/driver"); + args.AppendTail(CUtlString("/entry:\"%s\"", pProject->szEntry)); + } // Disable stdlib if (pProject->bNoStdLib) { - args.AppendTail("-nostdlib"); } for (auto object: pProject->objects) @@ -118,21 +128,12 @@ CUtlString CMSVCLinker::Link( LinkProject_t *pProject ) for (auto lib: pProject->libraries) { + /* args.AppendTail("-l"); args.AppendTail(lib); + */ } - // Apple frameworks - for (auto &directory: pProject->frameworkDirectories) - { - args.AppendTail("-F"); - args.AppendTail(directory); - } - for (auto &framework: pProject->frameworks) - { - args.AppendTail("-framework"); - args.AppendTail(framework); - } runner->Run(szExePath, args); runner->Wait(); } diff --git a/fpc/library/windows/runner.cpp b/fpc/library/windows/runner.cpp new file mode 100644 index 0000000..c5a9c64 --- /dev/null +++ b/fpc/library/windows/runner.cpp @@ -0,0 +1,101 @@ +#include "runner.h" +#include "tier0/platform.h" +#include "tier1/interface.h" +#include "tier1/utlstring.h" +#include "tier1/utlvector.h" +#include "tier1/commandline.h" +#include "windows.h" + +CUtlVector g_processes; + +class CWindowsRunner: public IRunner +{ +public: + virtual int Run( CUtlString szName, CUtlVector& args ) override; + 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; +}; + +EXPOSE_INTERFACE(CWindowsRunner, IRunner, POSIX_RUNNER_INTERFACE_NAME); +IRunner *runner; + +int CWindowsRunner::Run(CUtlString szName, CUtlVector& args) +{ + pid_t pid = fork(); + if (pid < 0) + Plat_FatalErrorFunc("Failed to fork"); + /* child */ + if (pid == 0) + { + CUtlVector execargs; + execargs.AppendTail(szName); + if (CommandLine()->CheckParam("-fpcdebug")) + V_printf("%s",szName.GetString()); + for (auto &arg: args) + { + execargs.AppendTail(arg); + if (CommandLine()->CheckParam("-fpcdebug")) + V_printf(" %s",arg.GetString()); + } + if (CommandLine()->CheckParam("-fpcdebug")) + V_printf("\n"); + execargs.AppendTail(0); + if ( execvp(szName, (char *const*)execargs.GetData()) == -1 ) + { + V_printf("Failed to launch %s\n",szName.GetString()); + _exit(0); + } + } + g_processes.AppendTail(pid); + return 0; +} + +int CWindowsRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector& args) +{ + pid_t pid = fork(); + if (pid < 0) + Plat_FatalErrorFunc("Failed to fork"); + /* child */ + if (pid == 0) + { + CUtlVector execargs; + execargs.AppendTail(szName); + if (CommandLine()->CheckParam("-fpcdebug")) + V_printf("%s",szName.GetString()); + for (auto &arg: args) + { + execargs.AppendTail(arg); + if (CommandLine()->CheckParam("-fpcdebug")) + V_printf(" %s",arg.GetString()); + } + if (CommandLine()->CheckParam("-fpcdebug")) + V_printf("\n"); + execargs.AppendTail(0); + chdir(szDirectory.GetString()); + if ( execvp(szName, (char *const*)execargs.GetData()) == -1 ) + { + V_printf("Failed to launch %s\n",szName.GetString()); + _exit(0); + } + } + g_processes.AppendTail(pid); + /* parent */ + return 0; +} + +int CWindowsRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment) +{ + +} + +int CWindowsRunner::Wait( void ) +{ + for (auto &process: g_processes) + { + int status; + pid_t wpid = waitpid(process, &status, 0); + } + g_processes = {}; + return 0; +}; diff --git a/fpc/public/ld.h b/fpc/public/ld.h index 664cef7..81b3aff 100644 --- a/fpc/public/ld.h +++ b/fpc/public/ld.h @@ -17,6 +17,14 @@ enum ELinkType ELINK_EXECUTABLE, ELINK_DYNAMIC_LIBRARY, ELINK_STATIC_LIBRARY, + + // drivers + ELINK_KERNEL_DRIVER +}; + +enum EWindowsSubsystem +{ + WINDOWS_SUBSYSTEM_NATIVE, }; //---------------------------------------------------------------------------- @@ -58,6 +66,8 @@ public: // Apple framework directories CUtlVector frameworkDirectories = {}; + const char *szEntry = ""; + // Disables C standart library bool bNoStdLib; @@ -66,6 +76,9 @@ public: // Android manifest AndroidManifest_t m_androidmanifest; + + // Windows subsystem + EWindowsSubsystem m_eWindowsSubsystem; }; // Basic interface name