improvements on fpc

This commit is contained in:
2026-01-01 02:14:54 +02:00
parent 773a541199
commit 0b8fb15420
31 changed files with 143 additions and 82 deletions
+2 -1
View File
@@ -1,5 +1,4 @@
build build
.god
.git .git
.cache .cache
compile_commands.json compile_commands.json
@@ -33,3 +32,5 @@ Icon?
# Added by cargo # Added by cargo
/target /target
*.o
+5 -5
View File
@@ -20,7 +20,7 @@ recompile: ../build/tools/fpc
build/fpc build build/fpc build
install: ../build/tools/fpc libfpcbuild.a libfpc.so libtier0.so libtier1.a libtier2.a libfilesystem_std.so install_temp builddir 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' $(CC) -fPIC main.cpp library/helper.cpp library/target.cpp library/builder.cpp -lc -lstdc++ $(CCFLAGS) -o build/fpc libtier0.so build/libtier1.a build/libtier2.a -Wl,--disable-new-dtags -Wl,-rpath,'$$ORIGIN'
build/fpc build -fpcdebug build/fpc build -fpcdebug
libtier0.so: $(TIER0_FILES) builddir libtier0.so: $(TIER0_FILES) builddir
@@ -51,10 +51,10 @@ builddir:
mkdir -p ../build/tools/fpc mkdir -p ../build/tools/fpc
install_fpc: ../build/tools/fpc install_fpc: ../build/tools/fpc
mv build/fpc_temp fpc mv build/fpc_temp build/fpc
mv build/libtier0_temp.so libtier0.so #mv build/libtier0_temp.so libtier0.so
mv build/libfpc_temp.so libfpc.so mv build/libfpc_temp.so build/libfpc.so
mv build/libfilesystem_std_temp.so libfilesystem_std.so #mv build/libfilesystem_std_temp.so libfilesystem_std.so
cp -r build/* ../build/tools/fpc cp -r build/* ../build/tools/fpc
install_temp: builddir install_temp: builddir
+8 -6
View File
@@ -82,7 +82,7 @@ DECLARE_BUILD_STAGE(libfpc)
ldProject = ccompiler->Compile(&compileProject); ldProject = ccompiler->Compile(&compileProject);
ldProject.linkType = ELINK_DYNAMIC_LIBRARY; ldProject.linkType = ELINK_DYNAMIC_LIBRARY;
ldProject.libraryObjects = { ldProject.libraryObjects = {
GET_PROJECT_LIBRARY(tier0, "tier0"), "libtier0.so",
GET_PROJECT_LIBRARY(tier1, "tier1"), GET_PROJECT_LIBRARY(tier1, "tier1"),
GET_PROJECT_LIBRARY(tier2, "tier2"), GET_PROJECT_LIBRARY(tier2, "tier2"),
}; };
@@ -109,10 +109,9 @@ DECLARE_BUILD_STAGE(fpc)
compileProject.includeDirectories = g_IncludeDirectories; compileProject.includeDirectories = g_IncludeDirectories;
ldProject = ccompiler->Compile(&compileProject); ldProject = ccompiler->Compile(&compileProject);
ldProject.libraryObjects = { ldProject.libraryObjects = {
GET_PROJECT_LIBRARY(tier0, "tier0"), "libtier0.so",
GET_PROJECT_LIBRARY(tier1, "tier1"), GET_PROJECT_LIBRARY(tier1, "tier1"),
GET_PROJECT_LIBRARY(tier2, "tier2"), GET_PROJECT_LIBRARY(tier2, "tier2"),
GET_PROJECT_LIBRARY(libfpc, "fpc"),
}; };
V_printf("WHAT %s\n",GET_PROJECT_LIBRARY(tier0, "tier0").GetString()); V_printf("WHAT %s\n",GET_PROJECT_LIBRARY(tier0, "tier0").GetString());
@@ -135,12 +134,15 @@ DECLARE_BUILD_STAGE(install)
CUtlString szTier0 = GET_PROJECT_LIBRARY(tier0, "tier0"); CUtlString szTier0 = GET_PROJECT_LIBRARY(tier0, "tier0");
CUtlString szTier1 = GET_PROJECT_LIBRARY(tier1, "tier1"); CUtlString szTier1 = GET_PROJECT_LIBRARY(tier1, "tier1");
CUtlString szTier2 = GET_PROJECT_LIBRARY(tier2, "tier2"); CUtlString szTier2 = GET_PROJECT_LIBRARY(tier2, "tier2");
filesystem2->CopyFile("build/fpc_temp", szExe); filesystem2->CopyFile("build/fpc_temp", szExe);
filesystem2->CopyFile("build/libfpc.so", szLibFpc); filesystem2->CopyFile("build/libfpc_temp.so", szLibFpc);
filesystem2->CopyFile("build/libtier0_temp.so", szTier0);
/*
filesystem2->CopyFile("build/libtier1.a", szTier1); filesystem2->CopyFile("build/libtier1.a", szTier1);
filesystem2->CopyFile("build/libtier2.a", szTier2); filesystem2->CopyFile("build/libtier2.a", szTier2);
filesystem2->CopyFile("build/libtier0_temp.so", szTier0);
*/
return 0; return 0;
}; };
Binary file not shown.
BIN
View File
Binary file not shown.
+38 -36
View File
@@ -93,43 +93,45 @@ CUtlString CAPKTool::BuildPackage( AndroidManifest_t manifest, CUtlString szMani
{ {
V_printf(" APKTOOL %s\n", manifest.m_szPackageID.GetString()); V_printf(" APKTOOL %s\n", manifest.m_szPackageID.GetString());
if (CommandLine()->ParamValue("-android_build_tools"))
{
CUtlVector<CUtlString> args = {
"package",
"-f",
"-M",
"AndroidManifest.xml",
"-S",
"res",
"-I",
CUtlString("%s/../../platforms/android-%lu/android.jar", CommandLine()->ParamValue("-android_build_tools"), manifest.m_nTargetVersion),
"-F",
CUtlString("%s.unaligned.apk", manifest.m_szPackageID.GetString()),
};
CUtlString szAndroidSDK = CommandLine()->ParamValue("-android_build_tools");
runner->Run(CUtlString("%s/aapt",szAndroidSDK.GetString()),szManifestDir,args);
runner->Wait();
args = { IINISection *pSection = NULL;
"-u", const char *szBuildTools;
CUtlString("%s.unaligned.apk", manifest.m_szPackageID.GetString()), pSection = g_pConfig->GetSection("Android_Build_Tools");
"lib/x86_64/libnative-app.so", if (!pSection)
}; Plat_FatalErrorFunc("build_tools are required for this target");
runner->Run("zip",szManifestDir, args); szBuildTools = pSection->GetStringValue("path");
runner->Wait(); CUtlVector<CUtlString> args = {
"package",
args = { "-f",
"-f", "-M",
"-v", "AndroidManifest.xml",
"4", "-S",
CUtlString("%s.unaligned.apk", manifest.m_szPackageID.GetString()), "res",
CUtlString("%s.apk", manifest.m_szPackageID.GetString()), "-I",
}; CUtlString("%s/../../platforms/android-%lu/android.jar", szBuildTools, manifest.m_nTargetVersion),
runner->Run(CUtlString("%s/zipalign",szAndroidSDK.GetString()),szManifestDir,args); "-F",
} else CUtlString("%s.unaligned.apk", manifest.m_szPackageID.GetString()),
Plat_FatalErrorFunc("-android_build_tools was not specified."); };
return 0; runner->Run(CUtlString("%s/aapt",szBuildTools),szManifestDir,args);
runner->Wait();
args = {
"-u",
CUtlString("%s.unaligned.apk", manifest.m_szPackageID.GetString()),
"lib/x86_64/libnative-app.so",
};
runner->Run("zip",szManifestDir, args);
runner->Wait();
args = {
"-f",
"-v",
"4",
CUtlString("%s.unaligned.apk", manifest.m_szPackageID.GetString()),
CUtlString("%s.apk", manifest.m_szPackageID.GetString()),
};
runner->Run(CUtlString("%s/zipalign",szBuildTools),szManifestDir,args);
return manifest.m_szPackageID;
} }
IAPKTool *APKTool() IAPKTool *APKTool()
+1 -1
View File
@@ -71,7 +71,7 @@ BuildFile_t *CProjectBuilder::BuildProject( const char *szProjectName, const cha
stLinkProject = ccompiler->Compile(&stCompileProject); stLinkProject = ccompiler->Compile(&stCompileProject);
stLinkProject.linkType = ELINK_DYNAMIC_LIBRARY; stLinkProject.linkType = ELINK_DYNAMIC_LIBRARY;
stLinkProject.m_target = Target_t::HostTarget(); stLinkProject.m_target = Target_t::HostTarget();
stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libfpcbuild.a",filesystem2->OwnDirectory())}); stLinkProject.objects.AppendHead({CUtlString("%s/libfpcbuild.a",filesystem2->OwnDirectory())});
stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libfpc.so",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/libtier2.a",filesystem2->OwnDirectory())});
stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libtier1.a",filesystem2->OwnDirectory())}); stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libtier1.a",filesystem2->OwnDirectory())});
+1
View File
@@ -31,6 +31,7 @@ CUtlVector<CUtlString> ICCompiler::BuildCommandLine( CProject_t *pProject, const
EnablePIE(cmd); EnablePIE(cmd);
SetTarget(cmd, pProject); SetTarget(cmd, pProject);
SetOutputFile(cmd, szOutputFileName); SetOutputFile(cmd, szOutputFileName);
SetSysroot(cmd, pProject, NULL);
CompileFile(cmd, szFileName); CompileFile(cmd, szFileName);
for (auto &macro: pProject->macros) for (auto &macro: pProject->macros)
Macro(cmd, macro.szName, macro.szValue.GetString()); Macro(cmd, macro.szName, macro.szValue.GetString());
+28 -5
View File
@@ -46,6 +46,8 @@ protected:
virtual void EnableDebugSymbols( CUtlVector<CUtlString> &cmd ) override; virtual void EnableDebugSymbols( CUtlVector<CUtlString> &cmd ) override;
virtual void EnablePIE( CUtlVector<CUtlString> &cmd ) override; virtual void EnablePIE( CUtlVector<CUtlString> &cmd ) override;
virtual void EnablePIC( CUtlVector<CUtlString> &cmd ) override; virtual void EnablePIC( CUtlVector<CUtlString> &cmd ) override;
virtual void SetSysroot( CUtlVector<CUtlString> &cmd, CProject_t *pProject, const char *szSysroot ) override;
}; };
const char *CClangCompiler::GetOutputObjectFormat() const char *CClangCompiler::GetOutputObjectFormat()
@@ -117,6 +119,31 @@ void CClangCompiler::EnablePIC( CUtlVector<CUtlString> &cmd )
{ {
cmd.AppendTail("-fPIC"); cmd.AppendTail("-fPIC");
} }
void CClangCompiler::SetSysroot( CUtlVector<CUtlString> &cmd, CProject_t *pProject, const char *szName )
{
if (szName != NULL)
{
cmd.AppendTail("--sysroot");
cmd.AppendTail(szName);
return;
}
if (!g_pConfig)
return;
IINISection *pSection = g_pConfig->GetSection(pProject->m_target.GetTriplet());
if (!pSection)
return;
const char *szSysroot = pSection->GetStringValue("sysroot");
if (szSysroot)
{
cmd.AppendTail("--sysroot");
cmd.AppendTail(szSysroot);
}
}
EXPOSE_INTERFACE(CClangCompiler, ICCompiler, CLANG_C_COMPILER_INTERFACE_NAME); EXPOSE_INTERFACE(CClangCompiler, ICCompiler, CLANG_C_COMPILER_INTERFACE_NAME);
@@ -194,12 +221,8 @@ LinkProject_t CClangCompiler::Compile( CProject_t *pProject )
args.AppendTail("-miphoneos-version-min=18.0 "); args.AppendTail("-miphoneos-version-min=18.0 ");
args.AppendTail("-fembed-bitcode"); args.AppendTail("-fembed-bitcode");
} }
if (pProject->m_target.szSysroot)
{
args.AppendTail(CUtlString("--sysroot=%s", pProject->m_target.szSysroot));
}
*/ */
if (!filesystem2->ShouldRecompile(file, szOutputFile)) if (!filesystem2->ShouldRecompile(file, szOutputFile))
goto skipcompile; goto skipcompile;
else else
+27 -11
View File
@@ -139,14 +139,14 @@ CUtlString CClangLinker::Link( LinkProject_t *pProject )
} }
else if (pProject->m_target.kernel == TARGET_KERNEL_ANDROID) else if (pProject->m_target.kernel == TARGET_KERNEL_ANDROID)
{ {
args.AppendTail(CUtlString("--sysroot=%s/sysroot", pProject->m_target.szSysroot)); // args.AppendTail(CUtlString("--sysroot=%s/sysroot", pProject->m_target.szSysroot));
// Shouldn't be here ? // Shouldn't be here ?
args.AppendTail("-static-libstdc++"); args.AppendTail("-static-libstdc++");
} }
else if (pProject->m_target.szSysroot) else if (pProject->m_target.szSysroot)
{ {
args.AppendTail(CUtlString("--sysroot=%s", pProject->m_target.szSysroot)); // args.AppendTail(CUtlString("--sysroot=%s", pProject->m_target.szSysroot));
} }
// Magic for the systems // Magic for the systems
@@ -201,18 +201,34 @@ CUtlString CClangLinker::Link( LinkProject_t *pProject )
args.AppendTail(framework); args.AppendTail(framework);
} }
// Android SDK requires sysroot IINISection *pSection = NULL;
if (pProject->m_target.kernel == TARGET_KERNEL_ANDROID) const char *szLinker;
{ const char *szSysroot;
if (!pProject->m_target.szSysroot) if (!g_pConfig)
Plat_FatalErrorFunc("szSysroot must be specified for android\n"); goto use_default_linker;
runner->Run(CUtlString("%s/bin/clang++",pProject->m_target.szSysroot), args);
}
else pSection = g_pConfig->GetSection(pProject->m_target.GetTriplet());
if (!pSection)
goto use_default_linker;
szSysroot = pSection->GetStringValue("sysroot");
if (szSysroot)
{ {
runner->Run("clang++", args); args.AppendTail("--sysroot");
args.AppendTail(szSysroot);
} }
szLinker = pSection->GetStringValue("CLANG_LINKER_INTERFACE_NAME");
if (szLinker)
{
runner->Run(szLinker, args);
}
runner->Wait();
goto compiled;
use_default_linker:
runner->Run("clang++", args);
runner->Wait(); runner->Wait();
} }
compiled: compiled:
+1 -2
View File
@@ -97,9 +97,7 @@ void CPOSIXFileSystem2::CopyFile( const char *szDestination, const char *szOrigi
szOrigin, szOrigin,
szDestination, szDestination,
}; };
printf("runner: %p\n",runner);
runner->Run(CUtlString("cp"), args); runner->Run(CUtlString("cp"), args);
printf("runner: %p\n",runner);
runner->Wait(); runner->Wait();
} }
void CPOSIXFileSystem2::CopyDirectory( const char *szDestination, const char *szOrigin ) void CPOSIXFileSystem2::CopyDirectory( const char *szDestination, const char *szOrigin )
@@ -138,3 +136,4 @@ bool CPOSIXFileSystem2::ShouldRecompile(const char *szSource, const char *szOutp
IINIFile *g_pConfig; IINIFile *g_pConfig;
EXPOSE_INTERFACE_GLOBALVAR(IINIFile, IINIFile, LIBFPC_CONFIG_INTERFACE_VERSION, g_pConfig);
-10
View File
@@ -51,9 +51,7 @@ int CPOSIXRunner::Run(CUtlString szName, CUtlVector<CUtlString>& args)
_exit(0); _exit(0);
} }
} }
printf("%i %p\n",m_processes.GetSize(),m_processes.GetData());
m_processes.AppendTail(pid); m_processes.AppendTail(pid);
printf("%i %p\n",m_processes.GetSize(),m_processes.GetData());
return 0; return 0;
} }
@@ -85,9 +83,7 @@ int CPOSIXRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector<CUtl
_exit(0); _exit(0);
} }
} }
printf("%i %p\n",m_processes.GetSize(),m_processes.GetData());
m_processes.AppendTail(pid); m_processes.AppendTail(pid);
printf("%i %p\n",m_processes.GetSize(),m_processes.GetData());
/* parent */ /* parent */
return 0; return 0;
} }
@@ -99,14 +95,8 @@ int CPOSIXRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector<CUtl
int CPOSIXRunner::Wait( void ) int CPOSIXRunner::Wait( void )
{ {
printf("%i %p\n",m_processes.GetSize(),m_processes.GetData());
if (m_processes.GetSize())
printf("%i\n",m_processes[0]);
printf("%i %p\n",m_processes.GetSize(),m_processes.GetData());
for (int i = 0; i<m_processes.GetSize(); i++) for (int i = 0; i<m_processes.GetSize(); i++)
{ {
printf("p %i\n",m_processes[i]);
int status; int status;
pid_t wpid = waitpid(m_processes[i], &status, 0); pid_t wpid = waitpid(m_processes[i], &status, 0);
} }
+3
View File
@@ -149,6 +149,9 @@ findbuild:
g_pConfig = INIManager()->ReadFile(".fpccfg"); g_pConfig = INIManager()->ReadFile(".fpccfg");
IINIFile **ppConfig = (IINIFile**)pLibFPCFactory(LIBFPC_CONFIG_INTERFACE_VERSION, NULL);
*ppConfig = g_pConfig;
CommandLine()->CreateCommandLine(c, v); CommandLine()->CreateCommandLine(c, v);
if (CommandLine()->CheckParam("build")) if (CommandLine()->CheckParam("build"))
return build(); return build();
+2
View File
@@ -129,6 +129,8 @@ protected:
virtual void EnableDebugSymbols( CUtlVector<CUtlString> &cmd ) = 0; virtual void EnableDebugSymbols( CUtlVector<CUtlString> &cmd ) = 0;
virtual void EnablePIE( CUtlVector<CUtlString> &cmd ) = 0; virtual void EnablePIE( CUtlVector<CUtlString> &cmd ) = 0;
virtual void EnablePIC( CUtlVector<CUtlString> &cmd ) = 0; virtual void EnablePIC( CUtlVector<CUtlString> &cmd ) = 0;
virtual void SetSysroot( CUtlVector<CUtlString> &cmd, CProject_t *pProject , const char *szSysroot ) = 0;
}; };
extern ICCompiler *ccompiler; extern ICCompiler *ccompiler;
+1
View File
@@ -149,5 +149,6 @@ typedef CUtlString(*GetProjectObjectFn)( const char *szName, const char *szObjec
extern IINIFile *g_pConfig; extern IINIFile *g_pConfig;
#define LIBFPC_CONFIG_INTERFACE_VERSION "LibFPCConfig001"
#endif #endif
+6
View File
@@ -0,0 +1,6 @@
[x86_64-linux-android]
sysroot = "/home/kotofyt/Android/Sdk/ndk/29.0.13599879/toolchains/llvm/prebuilt/linux-x86_64/sysroot"
CLANG_LINKER_INTERFACE_NAME = "/home/kotofyt/Android/Sdk/ndk/29.0.13599879/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++"
[Android_Build_Tools]
path = "/home/kotofyt/Android/Sdk/build-tools/36.0.0"
+3
View File
@@ -16,8 +16,11 @@ DECLARE_BUILD_STAGE(android_build)
compileProject.m_szName = "android_app"; compileProject.m_szName = "android_app";
compileProject.m_androidmanifest = manifest; compileProject.m_androidmanifest = manifest;
compileProject.bFPIC = true; compileProject.bFPIC = true;
compileProject.m_target = Target_t::HostTarget();
compileProject.m_target.kernel = TARGET_KERNEL_ANDROID;
compileProject.files = { compileProject.files = {
"main.c", "main.c",
"android_native_app_glue.c",
}; };
LinkProject_t ldProject = ccompiler->Compile(&compileProject); LinkProject_t ldProject = ccompiler->Compile(&compileProject);
ldProject.libraries = { ldProject.libraries = {
-3
View File
@@ -17,7 +17,6 @@ static void handle_cmd(struct android_app* app, int32_t cmd) {
} }
} }
// Entry point for native app
void android_main(struct android_app* app) { void android_main(struct android_app* app) {
app->onAppCmd = handle_cmd; app->onAppCmd = handle_cmd;
@@ -26,7 +25,6 @@ void android_main(struct android_app* app) {
int events; int events;
struct android_poll_source* source; struct android_poll_source* source;
// Main event loop
while (1) { while (1) {
int ident; int ident;
while ((ident = ALooper_pollOnce(0, NULL, &events, (void**)&source)) >= 0) { while ((ident = ALooper_pollOnce(0, NULL, &events, (void**)&source)) >= 0) {
@@ -37,6 +35,5 @@ void android_main(struct android_app* app) {
} }
} }
// Here you can update your game/render loop
} }
} }
Binary file not shown.
+11 -1
View File
@@ -118,7 +118,17 @@ public:
} }
virtual CUtlBuffer<unsigned char> Read( IFileHandle *pFile ) override { return NULL; }; virtual CUtlBuffer<unsigned char> Read( IFileHandle *pFile ) override { return NULL; };
virtual const char *ReadString( IFileHandle *pFile ) override { return NULL; }; virtual const char *ReadString( IFileHandle *pFile ) override {
char *szData = NULL;
size_t uSize = Size(pFile);
szData = (char*)V_malloc(uSize+1);
Read(pFile, szData,uSize);
szData[uSize] = 0;
return szData;
};
}; };
EXPOSE_INTERFACE(CLIBCFileSystem, IFileSystem, FILESYSTEM_INTERFACE_VERSION) EXPOSE_INTERFACE(CLIBCFileSystem, IFileSystem, FILESYSTEM_INTERFACE_VERSION)
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+6 -1
View File
@@ -58,7 +58,12 @@ const char *CINISection::GetStringValue( const char *szKeyName )
CUtlString CINISection::GetUTLStringValue( const char *szKeyName ) CUtlString CINISection::GetUTLStringValue( const char *szKeyName )
{ {
for (auto &value: m_values)
{
if (value->m_szKey == szKeyName)
return value->m_szData;
}
return 0;
} }
class CINIFile: public IINIFile class CINIFile: public IINIFile
Binary file not shown.
Binary file not shown.