started reworking linker
This commit is contained in:
@@ -11,6 +11,43 @@ class CClangLinker : public ILinker
|
||||
public:
|
||||
virtual CUtlString Link( LinkProject_t *pProject ) 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);
|
||||
|
||||
@@ -6,3 +6,65 @@ void LinkProject_t::AddObject( Object_t 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,58 @@ CUtlString Target_t::GetTriplet()
|
||||
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
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user