started reworking linker

This commit is contained in:
2026-01-01 14:45:48 +02:00
parent 0b8fb15420
commit 37f689f36d
9 changed files with 198 additions and 3 deletions

View File

@@ -11,6 +11,43 @@ class CClangLinker : public ILinker
public: public:
virtual CUtlString Link( LinkProject_t *pProject ) override; virtual CUtlString Link( LinkProject_t *pProject ) override;
virtual bool IsLibraryExists( CUtlString szName ) override; virtual bool IsLibraryExists( CUtlString szName ) override;
protected:
// Returns file name of the
CUtlString GetOutputObjectName( LinkProject_t *pProject, unsigned int hash, CUtlString szFileName );
virtual CUtlVector<CUtlString> BuildLinkCommandLine( LinkProject_t *pProject, const char *szFileName, const char *szOutputFileName );
virtual CUtlVector<CUtlString> BuildArchiveCommandLine( LinkProject_t *pProject, const char *szFileName, const char *szOutputFileName );
// Returns executable which should the OS run
virtual const char *GetCompilerExecutable( LinkProject_t *pProject ) override;
// returns object file format, eg .obj or .o
virtual const char *GetOutputObjectFormat() override;
virtual void SetTarget( CUtlVector<CUtlString> &cmd, LinkProject_t *pProject ) override;
virtual void SetSysroot( CUtlVector<CUtlString> &cmd, LinkProject_t *pProject , const char *szSysroot ) override;
virtual void SetOutputFile( CUtlVector<CUtlString> &cmd, const char *szName ) override;
// sets rpath
// for windows should be ignored
virtual void SetDefaultLibraryPaths( CUtlVector<CUtlString> &cmd ) override;
virtual void UseStdLib( CUtlVector<CUtlString> &cmd, bool bUse ) override;
// windows doesn't use it as well
virtual void UseDynamicLookup( CUtlVector<CUtlString> &cmd, bool bUse ) override;
// includes whole file
virtual void UseFullFile( CUtlVector<CUtlString> &cmd ) override;
// includes used stuff in a file
virtual void UsePartialFile( CUtlVector<CUtlString> &cmd ) override;
virtual void LinkFile( CUtlVector<CUtlString> &cmd, const char *szName ) override;
virtual void LinkLibraryObject( CUtlVector<CUtlString> &cmd, const char *szName ) override;
virtual void LinkLibrary( CUtlVector<CUtlString> &cmd, const char *szName ) override;
virtual void LinkLibraryPath( CUtlVector<CUtlString> &cmd, const char *szName ) override;
}; };
EXPOSE_INTERFACE(CClangLinker, ILinker, CLANG_LINKER_INTERFACE_NAME); EXPOSE_INTERFACE(CClangLinker, ILinker, CLANG_LINKER_INTERFACE_NAME);

View File

@@ -6,3 +6,65 @@ void LinkProject_t::AddObject( Object_t object )
{ {
objects.AppendTail(object); objects.AppendTail(object);
}; };
CUtlString ILinker::GetOutputObjectName( LinkProject_t *pProject, unsigned int hash, CUtlString szFileName )
{
CUtlString szTarget = pProject->m_target.GetTriplet();
CUtlString szFileNameFormat;
switch (pProject->linkType)
{
case ELINK_EXECUTABLE:
szFileNameFormat = CUtlString(pProject->m_target.GetExecutableFileFormat(),pProject->m_szName.GetString());
break;
case ELINK_DYNAMIC_LIBRARY:
szFileNameFormat = CUtlString(pProject->m_target.GetDynamicLibraryFileFormat(),pProject->m_szName.GetString());
break;
case ELINK_STATIC_LIBRARY:
szFileNameFormat = CUtlString(pProject->m_target.GetStaticLibraryFileFormat(),pProject->m_szName.GetString());
break;
default:
break;
}
return CUtlString(
"%s/%s/ld/%u_%s/%s",
FPC_TEMPORAL_DIRNAME,
szTarget.GetString(),
hash,
pProject->m_szName.GetString(),
szFileNameFormat.GetString());
}
CUtlVector<CUtlString> ILinker::BuildLinkCommandLine( LinkProject_t *pProject, const char *szOutputFileName )
{
CUtlVector<CUtlString> cmd;
SetTarget(cmd, pProject);
SetOutputFile(cmd);
SetSysroot(cmd, pProject, NULL);
UseFullFile(cmd);
for (auto &o: pProject->objects)
{
LinkFile(cmd, o.m_szObjectFile);
}
UsePartialFile(cmd);
for (auto &o: pProject->libraryObjects)
{
LinkLibraryObject(cmd, o);
};
for (auto &o: pProject->libraries)
{
LinkLibrary(cmd, o);
};
for (auto &o: pProject->libraryDirectories)
{
LinkLibraryPath(cmd, o);
};
}
CUtlVector<CUtlString> ILinker::BuildArchiveCommandLine( LinkProject_t *pProject, const char *szOutputFileName )
{
CUtlVector<CUtlString> cmd;
}

View File

@@ -39,6 +39,58 @@ CUtlString Target_t::GetTriplet()
return triplet; return triplet;
} }
const char *Target_t::GetExecutableFileFormat()
{
switch(kernel)
{
case TARGET_KERNEL_LINUX:
case TARGET_KERNEL_ANDROID:
case TARGET_KERNEL_DARWIN:
case TARGET_KERNEL_IOS:
return "%s";
break;
case TARGET_KERNEL_WINDOWS_MSVC:
case TARGET_KERNEL_WINDOWS_GNU:
return "%s.exe";
default:
break;
}
return NULL;
}
const char *Target_t::GetStaticLibraryFileFormat()
{
switch(kernel)
{
case TARGET_KERNEL_LINUX:
case TARGET_KERNEL_ANDROID:
case TARGET_KERNEL_DARWIN:
case TARGET_KERNEL_IOS:
case TARGET_KERNEL_WINDOWS_GNU:
return "lib%s.a";
case TARGET_KERNEL_WINDOWS_MSVC:
return "%s.lib";
default:
break;
}
return NULL;
}
const char *Target_t::GetDynamicLibraryFileFormat()
{
switch(kernel)
{
case TARGET_KERNEL_LINUX:
case TARGET_KERNEL_ANDROID:
return "lib%s.so";
case TARGET_KERNEL_DARWIN:
return "lib%s.dylib";
case TARGET_KERNEL_WINDOWS_GNU:
return "%s.dll";
default:
break;
}
return NULL;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Returns target on which fpc is being run // Returns target on which fpc is being run
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@@ -123,14 +123,15 @@ protected:
virtual void Macro( CUtlVector<CUtlString> &cmd, const char *szName, const char *szValue ) = 0; virtual void Macro( CUtlVector<CUtlString> &cmd, const char *szName, const char *szValue ) = 0;
virtual void SetTarget( CUtlVector<CUtlString> &cmd, CProject_t *pProject ) = 0; virtual void SetTarget( CUtlVector<CUtlString> &cmd, CProject_t *pProject ) = 0;
virtual void CompileFile( CUtlVector<CUtlString> &cmd, const char *szName ) = 0; virtual void SetSysroot( CUtlVector<CUtlString> &cmd, CProject_t *pProject , const char *szSysroot ) = 0;
virtual void SetOutputFile( CUtlVector<CUtlString> &cmd, const char *szName ) = 0; virtual void SetOutputFile( CUtlVector<CUtlString> &cmd, const char *szName ) = 0;
virtual void CompileFile( CUtlVector<CUtlString> &cmd, const char *szName ) = 0;
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;

View File

@@ -94,6 +94,46 @@ public:
virtual CUtlString Link( LinkProject_t *pProject ) = 0; virtual CUtlString Link( LinkProject_t *pProject ) = 0;
virtual bool IsLibraryExists( CUtlString szName ) = 0; virtual bool IsLibraryExists( CUtlString szName ) = 0;
protected:
// Link
// Returns file name of the
CUtlString GetOutputObjectName( LinkProject_t *pProject, unsigned int hash, CUtlString szFileName );
virtual CUtlVector<CUtlString> BuildLinkCommandLine( LinkProject_t *pProject, const char *szOutputFileName );
virtual CUtlVector<CUtlString> BuildArchiveCommandLine( LinkProject_t *pProject, const char *szOutputFileName );
// Returns executable which should the OS run
virtual const char *GetCompilerExecutable( LinkProject_t *pProject ) = 0;
// returns object file format, eg .obj or .o
virtual const char *GetOutputObjectFormat() = 0;
virtual void SetTarget( CUtlVector<CUtlString> &cmd, LinkProject_t *pProject ) = 0;
virtual void SetSysroot( CUtlVector<CUtlString> &cmd, LinkProject_t *pProject , const char *szSysroot ) = 0;
virtual void SetOutputFile( CUtlVector<CUtlString> &cmd ) = 0;
// sets rpath
// for windows should be ignored
virtual void SetDefaultLibraryPaths( CUtlVector<CUtlString> &cmd ) = 0;
virtual void UseStdLib( CUtlVector<CUtlString> &cmd, bool bUse ) = 0;
// windows doesn't use it as well
virtual void UseDynamicLookup( CUtlVector<CUtlString> &cmd, bool bUse ) = 0;
// includes whole file
virtual void UseFullFile( CUtlVector<CUtlString> &cmd ) = 0;
// includes used stuff in a file
virtual void UsePartialFile( CUtlVector<CUtlString> &cmd ) = 0;
virtual void LinkFile( CUtlVector<CUtlString> &cmd, const char *szName ) = 0;
virtual void LinkLibraryObject( CUtlVector<CUtlString> &cmd, const char *szName ) = 0;
virtual void LinkLibrary( CUtlVector<CUtlString> &cmd, const char *szName ) = 0;
virtual void LinkLibraryPath( CUtlVector<CUtlString> &cmd, const char *szName ) = 0;
}; };
extern ILinker *linker; extern ILinker *linker;

View File

@@ -49,6 +49,9 @@ struct Target_t
const char *szSysroot = CommandLine()->ParamValue("-sysroot"); const char *szSysroot = CommandLine()->ParamValue("-sysroot");
CUtlString GetTriplet(); CUtlString GetTriplet();
const char *GetExecutableFileFormat();
const char *GetStaticLibraryFileFormat();
const char *GetDynamicLibraryFileFormat();
static Target_t HostTarget(); static Target_t HostTarget();
static Target_t DefaultTarget(); static Target_t DefaultTarget();
}; };

View File

View File

@@ -22,7 +22,7 @@ CUtlVector<CUtlString> RenderContextVulkan_CompiledFiles = {
"materialsystem/vulkan/commands/base.cpp", "materialsystem/vulkan/commands/base.cpp",
"materialsystem/vulkan/libraries/raster.cpp", "materialsystem/vulkan/libraries/raster.cpp",
"external/volk/volk.c", "external/volk/volk.c",
} };
CUtlString material_lib; CUtlString material_lib;
DECLARE_BUILD_STAGE(MaterialSystem) DECLARE_BUILD_STAGE(MaterialSystem)