reworked linking

This commit is contained in:
2026-01-01 21:34:05 +02:00
parent 9245138eb0
commit 5759e401af
6 changed files with 245 additions and 39 deletions

View File

@@ -9,7 +9,7 @@
class CClangLinker : public ILinker
{
public:
virtual CUtlString Link( LinkProject_t *pProject ) override;
//virtual CUtlString Link( LinkProject_t *pProject ) override;
virtual bool IsLibraryExists( CUtlString szName ) override;
protected:
//virtual CUtlVector<CUtlString> BuildLinkCommandLine( LinkProject_t *pProject, const char *szFileName, const char *szOutputFileName );
@@ -20,12 +20,12 @@ protected:
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) 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 SetDefaultLibraryPaths( CUtlVector<CUtlString> &cmd, LinkProject_t *pProject ) override;
virtual void UseStdLib( CUtlVector<CUtlString> &cmd, bool bUse ) override;
@@ -48,49 +48,86 @@ protected:
const char *CClangLinker::GetCompilerExecutable( LinkProject_t *pProject )
{
IINISection *pSection = NULL;
const char *szLinker = "clang++";
if (!g_pConfig)
return szLinker;
pSection = g_pConfig->GetSection(pProject->m_target.GetTriplet());
if (!pSection)
return szLinker;
szLinker = pSection->GetStringValue("CLANG_LINKER_INTERFACE_NAME");
if (szLinker == NULL)
return "clang++";
IINISection *pSection = NULL;
const char *szLinker = "clang++";
if (!g_pConfig)
return szLinker;
pSection = g_pConfig->GetSection(pProject->m_target.GetTriplet());
if (!pSection)
return szLinker;
szLinker = pSection->GetStringValue("CLANG_LINKER_INTERFACE_NAME");
if (szLinker == NULL)
return "clang++";
return szLinker;
}
void CClangLinker::SetTarget( CUtlVector<CUtlString> &cmd, LinkProject_t *pProject )
{
{
if (pProject->linkType == ELINK_DYNAMIC_LIBRARY)
cmd.AppendTail("-shared");
cmd.AppendTail("-target");
cmd.AppendTail(pProject->m_target.GetTriplet());
}
void CClangLinker::SetSysroot( CUtlVector<CUtlString> &cmd, LinkProject_t *pProject , const char *szSysroot )
void CClangLinker::SetSysroot( CUtlVector<CUtlString> &cmd, LinkProject_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);
}
}
void CClangLinker::SetOutputFile( CUtlVector<CUtlString> &cmd)
void CClangLinker::SetOutputFile( CUtlVector<CUtlString> &cmd, const char *szName )
{
cmd.AppendTail("-o");
cmd.AppendTail(szName);
}
void CClangLinker::SetDefaultLibraryPaths( CUtlVector<CUtlString> &cmd )
void CClangLinker::SetDefaultLibraryPaths( CUtlVector<CUtlString> &cmd, LinkProject_t *pProject )
{
switch (pProject->m_target.kernel)
{
case TARGET_KERNEL_LINUX:
case TARGET_KERNEL_ANDROID:
cmd.AppendTail("-Wl,--disable-new-dtags");
cmd.AppendTail("-Wl,-rpath,$ORIGIN");
break;
case TARGET_KERNEL_DARWIN:
break;
default:
break;
}
}
void CClangLinker::UseStdLib( CUtlVector<CUtlString> &cmd, bool bUse )
{
if (!bUse)
cmd.AppendTail("-nostdlib");
}
@@ -102,38 +139,40 @@ void CClangLinker::UseDynamicLookup( CUtlVector<CUtlString> &cmd, bool bUse )
void CClangLinker::UseFullFile( CUtlVector<CUtlString> &cmd )
{
cmd.AppendTail("-Wl,--whole-archive");
}
void CClangLinker::UsePartialFile( CUtlVector<CUtlString> &cmd )
{
cmd.AppendTail("-Wl,--no-whole-archive");
}
void CClangLinker::LinkFile( CUtlVector<CUtlString> &cmd, const char *szName )
{
cmd.AppendTail(szName);
}
void CClangLinker::LinkLibraryObject( CUtlVector<CUtlString> &cmd, const char *szName )
{
cmd.AppendTail(szName);
}
void CClangLinker::LinkLibrary( CUtlVector<CUtlString> &cmd, const char *szName )
{
cmd.AppendTail("-l");
cmd.AppendTail(szName);
}
void CClangLinker::LinkLibraryPath( CUtlVector<CUtlString> &cmd, const char *szName )
{
cmd.AppendTail("-L");
cmd.AppendTail(szName);
}
EXPOSE_INTERFACE(CClangLinker, ILinker, CLANG_LINKER_INTERFACE_NAME);
/*
CUtlString CClangLinker::Link( LinkProject_t *pProject )
{
if (pProject->m_szName == 0)
@@ -353,7 +392,7 @@ use_default_linker:
compiled:
return szOutputFile;
};
*/
bool CClangLinker::IsLibraryExists( CUtlString szName )
{
szName = CUtlString("lib%s.so", szName.GetString());