o
    Wod                     @  s  d dl mZ d dlZd dlZd dlZd dlZddlmZ ddlm	Z	m
Z
 ddlmZ ejr?ddlmZ ddlmZ dd	lmZ ejG d
d dejZG dd dZG dd dZG dd deeZG dd deeZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZ G d"d# d#eZ!G d$d% d%eZ"G d&d' d'e"Z#G d(d) d)eZ$dvd1d2Z%dwd4d5Z&dxd7d8Z'G d9d: d:ej(d;Z)G d<d= d=Z*G d>d? d?Z+G d@dA dAe*e)Z,G dBdC dCe,Z-G dDdE dEe+e*e)Z.G dFdG dGe.Z/G dHdI dIe.Z0G dJdK dKe.Z1G dLdM dMe+e*e)Z2G dNdO dOe+e*e)Z3G dPdQ dQe)Z4G dRdS dSe)Z5G dTdU dUe)Z6G dVdW dWe)Z7G dXdY dYe7Z8G dZd[ d[e*e)Z9G d\d] d]e9Z:G d^d_ d_e2Z;G d`da dae*e)Z<G dbdc dce*e)Z=e=Z>G ddde deeZ?e?Z@G dfdg dgZAG dhdi dieAe)ZBG djdk dkeAe)ZCG dldm dmeAe)ZDG dndo doe*e)ZEG dpdq dqe*e)ZFG drds dseAe)ZGG dtdu due*e)ZHdS )y    )annotationsN   )mesonlib)EnvironmentExceptionMesonExceptionCompilerArgs)KeyedOptionDictType)Environment)MachineChoicec                   @  s    e Zd ZdZe Ze ZdS )RSPFileSyntaxz,Which RSP file syntax the compiler supports.N)__name__
__module____qualname____doc__enumautoMSVCGCC r   r   yhome/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/lib/python3.10/site-packages/mesonbuild/linkers/linkers.pyr      s    r   c                   @  s   e Zd ZU ded< dCddZdDdEddZdFddZdGddZdHddZdIddZ	dJddZ
dKd d!ZdHd"d#ZdLd+d,ZdMd-d.ZdHd/d0ZdGd1d2ZedNd3d4ZedNd5d6ZdOd8d9ZdPd:d;ZdHd<d=ZdHd>d?ZdQdAdBZdS )RStaticLinkerstridexelistT.List[str]c                 C  
   || _ d S N)r   selfr   r   r   r   __init__,      
zStaticLinker.__init__NargsT.Optional[T.Iterable[str]]returnr   c                 C  s
   t | |S r   r   r   r"   r   r   r   compiler_args/   r!   zStaticLinker.compiler_argsboolc                 C     t  S )z[
        Determines whether the linker can accept arguments using the @rsp syntax.
        r   
is_windowsr   r   r   r   can_linker_accept_rsp2   s   z"StaticLinker.can_linker_accept_rspoptions'KeyedOptionDictType'c                 C     g S )z=Like compilers.get_base_link_args, but for the static linker.r   r   r-   r   r   r   get_base_link_args8      zStaticLinker.get_base_link_argsc                 C  
   | j  S r   r   copyr+   r   r   r   get_exelist<   r!   zStaticLinker.get_exelistenv'Environment'is_thinc                 C  r/   r   r   r   r7   r9   r   r   r   get_std_link_args?      zStaticLinker.get_std_link_args	buildtypec                 C  r/   r   r   r   r=   r   r   r   get_buildtype_linker_argsB   r<   z&StaticLinker.get_buildtype_linker_argstargetc                 C  r/   r   r   r   r@   r   r   r   get_output_argsE   r<   zStaticLinker.get_output_argsc                 C  r/   r   r   r+   r   r   r   get_coverage_link_argsH   r<   z#StaticLinker.get_coverage_link_args	build_dirfrom_dirrpath_pathsT.Tuple[str, ...]build_rpathinstall_rpath"T.Tuple[T.List[str], T.Set[bytes]]c                 C  
   g t  fS r   setr   r7   rD   rE   rF   rH   rI   r   r   r   build_rpath_argsK      
zStaticLinker.build_rpath_argsc                 C  r/   r   r   r   r7   r   r   r   thread_link_flagsP   r<   zStaticLinker.thread_link_flagsc                 C  r/   r   r   r+   r   r   r   openmp_flagsS   r<   zStaticLinker.openmp_flagsc                 C  r/   r   r   r0   r   r   r   get_option_link_argsV   r<   z!StaticLinker.get_option_link_argsc                 C     |d d  S r   r   clsr"   r   r   r   unix_args_to_nativeY      z StaticLinker.unix_args_to_nativec                 C  rU   r   r   rV   r   r   r   native_args_to_unix]   rY   z StaticLinker.native_args_to_unix
targetfilec                 C     d S r   r   r   r[   r   r   r   get_link_debugfile_namea   r<   z$StaticLinker.get_link_debugfile_namec                 C  r/   r   r   r]   r   r   r   get_link_debugfile_argsd   r2   z$StaticLinker.get_link_debugfile_argsc                 C  r/   r   r   r+   r   r   r   get_always_argsh   r<   zStaticLinker.get_always_argsc                 C  r/   r   r   r+   r   r   r   get_linker_always_argsk   r<   z#StaticLinker.get_linker_always_argsr   c                 C  s(   |   rJ | j dt| j d)The format of the RSP file that this compiler supports.

        If `self.can_linker_accept_rsp()` returns True, then this needs to
        be implemented
        zI linker accepts RSP, but doesn' provide a supported format, this is a bugz8 does not implement rsp format, this shouldn't be called)r,   r   r   r+   r   r   r   rsp_file_syntaxn   s   zStaticLinker.rsp_file_syntaxr   r   r   )r"   r#   r$   r   r$   r'   r-   r.   r$   r   r$   r   r7   r8   r9   r'   r$   r   r=   r   r$   r   r@   r   r$   r   r7   r8   rD   r   rE   r   rF   rG   rH   r   rI   r   r$   rJ   r7   r8   r$   r   r"   r   r$   r   r[   r   r$   r   r[   r   r$   r   r$   r   )r   r   r   __annotations__r    r&   r,   r1   r6   r;   r?   rB   rC   rO   rR   rS   rT   classmethodrX   rZ   r^   r_   r`   ra   rc   r   r   r   r   r   (   s0   
 















r   c                   @  s`   e Zd ZdgZdddZddd	Zdd
dZdddZedddZ	edddZ
dddZdS )VisualStudioLikeLinkerz/NOLOGOmachiner   c                 C  r   r   rt   )r   rt   r   r   r   r    {   r!   zVisualStudioLikeLinker.__init__r$   r   c                 C  r3   r   always_argsr5   r+   r   r   r   r`   ~   r!   z&VisualStudioLikeLinker.get_always_argsc                 C  r3   r   rv   r+   r   r   r   ra      r!   z-VisualStudioLikeLinker.get_linker_always_argsr@   c                 C  s,   g }| j r|d| j  g7 }|d| g7 }|S Nz	/MACHINE:/OUT:ru   )r   r@   r"   r   r   r   rB      s
   z&VisualStudioLikeLinker.get_output_argsr"   c                 C     ddl m} ||S Nr   )VisualStudioCCompiler)compilers.cr|   rX   rW   r"   r|   r   r   r   rX         
z*VisualStudioLikeLinker.unix_args_to_nativec                 C  rz   r{   )r}   r|   rZ   r~   r   r   r   rZ      r   z*VisualStudioLikeLinker.native_args_to_unixr   c                 C     t jS r   r   r   r+   r   r   r   rc         z&VisualStudioLikeLinker.rsp_file_syntaxN)rt   r   rg   rj   rm   rp   )r   r   r   rw   r    r`   ra   rB   rr   rX   rZ   rc   r   r   r   r   rs   x   s    



rs   c                   @     e Zd ZdZd	ddZdS )
VisualStudioLinkerzMicrosoft's lib static linker.r   r   rt   r   c                 C     t | | t| | d S r   r   r    rs   r   r   rt   r   r   r   r          zVisualStudioLinker.__init__Nr   r   rt   r   r   r   r   r   r    r   r   r   r   r          r   c                   @  r   )
IntelVisualStudioLinkerzIntel's xilib static linker.r   r   rt   r   c                 C  r   r   r   r   r   r   r   r       r   z IntelVisualStudioLinker.__init__Nr   r   r   r   r   r   r      r   r   c                   @  s:   e Zd ZdgZdddZdd
dZdddZdddZdS )ArLikeLinker-csrr$   r'   c                 C     dS NFr   r+   r   r   r   r,         z"ArLikeLinker.can_linker_accept_rspr7   r8   r9   r   c                 C     | j S r   std_argsr:   r   r   r   r;      r   zArLikeLinker.get_std_link_argsr@   r   c                 C     |gS r   r   rA   r   r   r   rB      r   zArLikeLinker.get_output_argsr   c                 C  r   r   r   r   r+   r   r   r   rc      r   zArLikeLinker.rsp_file_syntaxNre   rh   rj   rp   )r   r   r   r   r,   r;   rB   rc   r   r   r   r   r      s    


r   c                      s6   e Zd ZdZd fddZdd
dZdddZ  ZS )ArLinkerarfor_machinemesonlib.MachineChoicer   r   c                   sn   t  | t| jdg d }d}d}d|v r|d7 }d|v r#d}|g| _|| g| _d	|v | _|| _d S )
Nz-h   Zcsr z[D]Dz[T]Tz@<)	superr    r   
Popen_safer   r   std_thin_argscan_rspr   )r   r   r   stdoZstdargsZthinargs	__class__r   r   r       s   

zArLinker.__init__r$   r'   c                 C  r   r   )r   r+   r   r   r   r,      r   zArLinker.can_linker_accept_rspr7   r8   r9   c                 C  s0   |r|j | j  s|j | j  s| jS | jS r   )machinesr   Z	is_darwinis_sunosr   r   r:   r   r   r   r;      s
   zArLinker.get_std_link_args)r   r   r   r   re   rh   )r   r   r   r   r    r,   r;   __classcell__r   r   r   r   r      s
    
r   c                   @     e Zd ZdZdS )AppleArLinkerZapplearNr   r   r   r   r   r   r   r   r      s    r   c                   @  r   )ArmarLinkerZarmarNr   r   r   r   r   r      s    r   c                      sN   e Zd Zejdd fdd	ZdddZdddZdddZdddZ	  Z
S )DLinker)
rsp_syntaxr   r   archr   r   r   c                  s&   t  | |d | _|| _|| _d S )Nr   )r   r    r   r   _DLinker__rsp_syntax)r   r   r   r   r   r   r   r       s   

zDLinker.__init__r7   r8   r9   r'   r$   c                 C     dgS )Nz-libr   r:   r   r   r   r;      r   zDLinker.get_std_link_argsr@   c                 C  
   d| gS )Nz-of=r   rA   r   r   r   rB      r!   zDLinker.get_output_argsc                 C  s<   t  r| jdkrdgS | jdkr| jdkrdgS dgS g S )Nx86_64z-m64Z
x86_mscoffZdmdz
-m32mscoffz-m32)r   r*   r   r   r+   r   r   r   ra      s   
zDLinker.get_linker_always_argsc                 C  r   r   )r   r+   r   r   r   rc      r   zDLinker.rsp_file_syntax)r   r   r   r   r   r   rh   rj   rg   rp   )r   r   r   r   r   r    r;   rB   ra   rc   r   r   r   r   r   r      s    


	r   c                      <   e Zd Zd fddZdddZdddZdddZ  ZS )
CcrxLinkerr   r   c                      t  | d| _d S )Nrlinkr   r    r   r   r   r   r   r         
zCcrxLinker.__init__r$   r'   c                 C  r   r   r   r+   r   r   r   r,   
  r<   z CcrxLinker.can_linker_accept_rspr@   r   c                 C     d| gS Nz-output=r   rA   r   r   r   rB        zCcrxLinker.get_output_argsc                 C     ddgS )Nz-nologoz-form=libraryr   r+   r   r   r   ra        z!CcrxLinker.get_linker_always_argsrd   re   rj   rg   r   r   r   r    r,   rB   ra   r   r   r   r   r   r     
    

r   c                      r   )
Xc16Linkerr   r   c                   r   )Nzxc16-arr   r   r   r   r   r      r   zXc16Linker.__init__r$   r'   c                 C  r   r   r   r+   r   r   r   r,     r<   z Xc16Linker.can_linker_accept_rspr@   r   c                 C     | gS r   r   rA   r   r   r   rB     r   zXc16Linker.get_output_argsc                 C  r   )Nrcsr   r+   r   r   r   ra      r   z!Xc16Linker.get_linker_always_argsrd   re   rj   rg   r   r   r   r   r   r     r   r   c                      s2   e Zd Zd fddZdddZdddZ  ZS )CompCertLinkerr   r   c                   r   )Nccompr   r   r   r   r   r    %  r   zCompCertLinker.__init__r$   r'   c                 C  r   r   r   r+   r   r   r   r,   )  r<   z$CompCertLinker.can_linker_accept_rspr@   r   c                 C  r   Nz-or   rA   r   r   r   rB   ,  r   zCompCertLinker.get_output_argsrd   re   rj   )r   r   r   r    r,   rB   r   r   r   r   r   r   #  s    
r   c                      r   )TILinkerr   r   c                   r   )Nzti-arr   r   r   r   r   r    2  r   zTILinker.__init__r$   r'   c                 C  r   r   r   r+   r   r   r   r,   6  r<   zTILinker.can_linker_accept_rspr@   r   c                 C  r   r   r   rA   r   r   r   rB   9  r   zTILinker.get_output_argsc                 C  r   )N-rr   r+   r   r   r   ra   <  r   zTILinker.get_linker_always_argsrd   re   rj   rg   r   r   r   r   r   r   0  r   r   c                   @  r   )C2000LinkerZar2000Nr   r   r   r   r   r   @      r   c                   @  s   e Zd ZdZddgZdS )AIXArLinkerZaixarr   z-XanyN)r   r   r   r   r   r   r   r   r   r   E  s    r   
raw_rpathsrG   rD   r   rE   r$   r   c                   s     fdd| D }t |}|S )Nc                   s   g | ]}t | qS r   )evaluate_rpath.0prD   rE   r   r   
<listcomp>N  s    z"prepare_rpaths.<locals>.<listcomp>)order_rpaths)r   rD   rE   Zinternal_format_rpathsZordered_rpathsr   r   r   prepare_rpathsJ  s   r   
rpath_listc                 C  s   t | tjjdS )N)key)sortedospathisabs)r   r   r   r   r   S  s   	r   r   c                 C  s>   | |krdS t j| r| S t jt j|| t j||S Nr   )r   r   r   relpathjoin)r   rD   rE   r   r   r   r   _  s
   "r   c                   @  s  e Zd ZdZg g g g g g dZejd{ddZd|d
dZddd}ddZ	d{ddZ
d{ddZd{ddZd~ddZddd Zdd"d#Zd~d$d%Zd{d&d'Zdd*d+Zdd0d1Zdd3d4Zdd5d6Zd~d7d8Zdd9d:Zd~d;d<Zd~d=d>Zdd@dAZddCdDZddFdGZd~dHdIZddJdKZd~dLdMZej ddOdPZ!d~dQdRZ"ej ddTdUZ#ddVdWZ$ddYdZZ%dd[d\Z&d~d]d^Z'd~d_d`Z(d~dadbZ)ddcddZ*ddedfZ+d~dgdhZ,ddpdqZ-ddxdyZ.dzS )DynamicLinkerzBase class for dynamic linkers.plaindebugZdebugoptimizedreleaseZminsizeZcustomr$   r   c                 C  r\   r   r   r+   r   r   r   r   t  r2   zDynamicLinker.idargT.Union[str, T.List[str]]r   c                   sb   t |tr|gn|} jd u r|S t  jtr  fdd|D S g }|D ]
}| j|g 7 }q$|S )Nc                   s   g | ]} j | qS r   )
prefix_arg)r   r   r+   r   r   r   }      z/DynamicLinker._apply_prefix.<locals>.<listcomp>)
isinstancer   r   )r   r   r"   retr   r+   r   _apply_prefixx  s   
zDynamicLinker._apply_prefixunknown versionversionr   r   r   r   rw   r   c                C  s(   || _ || _|| _|| _|| _d | _d S r   )r   r   r   r   rw   rt   )r   r   r   r   rw   r   r   r   r   r      s   
zDynamicLinker.__init__c                 C  s   d t| j| jd| jS )Nz<{}: v{} `{}`> )formattyper   r   r   r   r+   r   r   r   __repr__     zDynamicLinker.__repr__c                 C  r   r   )r   r+   r   r   r   get_id  r   zDynamicLinker.get_idc                 C  s   d| j  d| j dS )N(r   ))r   r   r+   r   r   r   get_version_string     z DynamicLinker.get_version_stringc                 C  r3   r   r4   r+   r   r   r   r6     r!   zDynamicLinker.get_exelistr'   c                 C  r(   r   r)   r+   r   r   r   get_accepts_rsp  s   zDynamicLinker.get_accepts_rspr   c                 C  r   )rb   r   r+   r   r   r   rc     s   zDynamicLinker.rsp_file_syntaxc                 C  r3   r   rv   r+   r   r   r   r`     r!   zDynamicLinker.get_always_argsc                 C  r   r   r   r+   r   r   r   get_lib_prefix  r<   zDynamicLinker.get_lib_prefixr-   r.   c                 C  r/   r   r   r0   r   r   r   get_option_args  r<   zDynamicLinker.get_option_argsr"   r7   r8   T.Tuple[bool, bool]c                 C     t d| j d)Nz	Language z+ does not support has_multi_link_arguments.r   r   )r   r"   r7   r   r   r   has_multi_arguments     z!DynamicLinker.has_multi_argumentsr[   c                 C  r   )z*Name of debug file written out (see below)Nr   r]   r   r   r   get_debugfile_name  r2   z DynamicLinker.get_debugfile_namec                 C  r/   )zSome compilers (MSVC) write debug into a separate file.

        This method takes the target object path and returns a list of
        commands to append to the linker invocation to control where that
        file is written.
        r   r]   r   r   r   get_debugfile_args  s   z DynamicLinker.get_debugfile_argsc                 C  r/   r   r   r+   r   r   r   get_std_shared_lib_args  r<   z%DynamicLinker.get_std_shared_lib_argsc                 C  s   |   S r   )r  r0   r   r   r   get_std_shared_module_args  r   z(DynamicLinker.get_std_shared_module_argsc                 C  r   )NLinker z1 does not support position-independent executabler   r+   r   r   r   get_pie_args  s   zDynamicLinker.get_pie_argsc                 C  r/   r   r   r+   r   r   r   get_lto_args  r<   zDynamicLinker.get_lto_argsr   c                 C  r/   r   r   r   r   r   r   r   get_thinlto_cache_args  r<   z$DynamicLinker.get_thinlto_cache_argsvaluec                 C  r/   r   r   r   r  r   r   r   sanitizer_args  r<   zDynamicLinker.sanitizer_argsr=   c                 C  s
   | j | S r   )_BUILDTYPE_ARGSr>   r   r   r   get_buildtype_args  rP   z DynamicLinker.get_buildtype_argsc                 C  r/   r   r   r+   r   r   r   get_asneeded_args  r<   zDynamicLinker.get_asneeded_argsc                 C  r   )Nr  z does not support link_wholer   r%   r   r   r   get_link_whole_for     z DynamicLinker.get_link_whole_forc                 C  r   )Nr  z! does not support allow undefinedr   r+   r   r   r   get_allow_undefined_args  r  z&DynamicLinker.get_allow_undefined_argsoutnamec                 C  r\   r   r   r   r  r   r   r   rB     r2   zDynamicLinker.get_output_argsc                 C  r   )Nr  z, doesn't implement coverage data generation.r   r+   r   r   r   get_coverage_args  r   zDynamicLinker.get_coverage_argsdirnamec                 C  r\   r   r   r   r  r   r   r   get_search_args  r2   zDynamicLinker.get_search_argsc                 C  r/   r   r   rQ   r   r   r   export_dynamic_args  r<   z!DynamicLinker.export_dynamic_args
implibnamec                 C  r/   )zThe name of the outputted import library.

        This implementation is used only on Windows by compilers that use GNU ld
        r   r   r  r   r   r   import_library_args  s   z!DynamicLinker.import_library_argsc                 C  r/   r   r   rQ   r   r   r   thread_flags  r<   zDynamicLinker.thread_flagsc                 C  r/   )a  Arguments to error if there are any undefined symbols at link time.

        This is the inverse of get_allow_undefined_args().

        TODO: A future cleanup might merge this and
              get_allow_undefined_args() into a single method taking a
              boolean
        r   r+   r   r   r   no_undefined_args  s   	zDynamicLinker.no_undefined_argsc                 C  r/   )z&Arguments to make all warnings errors.r   r+   r   r   r   fatal_warnings	  r2   zDynamicLinker.fatal_warningsc                 C  r/   r   r   r+   r   r   r   headerpad_args  r2   zDynamicLinker.headerpad_argsc                 C  r/   r   r   r	  r   r   r   get_gui_app_args  r2   zDynamicLinker.get_gui_app_argsc                 C  r/   r   r   r	  r   r   r   get_win_subsystem_args  r   z$DynamicLinker.get_win_subsystem_argsc                 C     t d)Nz,This linker does not support bitcode bundlesr   r+   r   r   r   bitcode_args  r   zDynamicLinker.bitcode_argsrD   rE   rF   rG   rH   rI   rJ   c                 C  rK   r   rL   rN   r   r   r   rO     rP   zDynamicLinker.build_rpath_argsprefix
shlib_namesuffix	soversiondarwin_versionsT.Tuple[str, str]c                 C  r/   r   r   r   r7   r$  r%  r&  r'  r(  r   r   r   get_soname_args"  r2   zDynamicLinker.get_soname_argsNr$   r   r   r   r$   r   
r   r   r   r   r   r   rw   r   r   r   rg   re   rp   rf   )r"   r   r7   r8   r$   r   rn   ro   r   r   r$   r   r  r   r$   r   ri   rm   r  r   r$   r   r  r   r$   r   rl   r  r   r$   r   r  r'   r$   r   rk   r7   r8   r$  r   r%  r   r&  r   r'  r   r(  r)  r$   r   )/r   r   r   r   r  abcabstractpropertyr   r   r    r   r   r   r6   r   rc   r`   r   r   r   r   r   r  r  r  r  r  r
  r  r  r  r  abstractmethodrB   r  r  r  r  r  r  r  r  r  r   r#  rO   r+  r   r   r   r   r   g  sh    	














	



















r   )	metaclassc                   @  s.   e Zd ZdZdddZddd	ZdddZdS )PosixDynamicLinkerMixinzMixin class for POSIX-ish linkers.

    This is obviously a pretty small subset of the linker interface, but
    enough dynamic linkers that meson supports are POSIX-like but not
    GNU-like that it makes sense to split this out.
    r  r   r$   r   c                 C  s   d|gS r   r   r  r   r   r   rB   0  r   z'PosixDynamicLinkerMixin.get_output_argsc                 C  r   )N-sharedr   r+   r   r   r   r  3  r   z/PosixDynamicLinkerMixin.get_std_shared_lib_argsr  c                 C  r   Nz-Lr   r  r   r   r   r  6  r!   z'PosixDynamicLinkerMixin.get_search_argsNr1  rg   r2  )r   r   r   r   rB   r  r  r   r   r   r   r:  '  s
    

r:  c                
   @  s   e Zd ZdZejrejZdIddZ	g g g dgg g d	Z
d
ddddddddd	ZdJddZdKddZdKddZdLddZdKdd ZdKd!d"ZdMd$d%ZdKd&d'ZdNd*d+ZdOd-d.ZdNd/d0ZdKd1d2ZdKd3d4ZdPd;d<ZdQdDdEZdMdFdGZdHS )RGnuLikeDynamicLinkerMixinzMixin class for dynamic linkers that provides gnu-like interface.

    This acts as a base for the GNU linkers (bfd and gold), LLVM's lld, and
    other linkers like GNU-ld.
    r   r   r$   r   c                 C  r\   r   r   r   r   r   r   r   r   D      z'GnuLikeDynamicLinkerMixin._apply_prefixz-O1r   1windowsconsole710Z11Z12Z13Z16)	ZnativerA  rB  posixZefi_applicationZefi_boot_service_driverZefi_runtime_driverZefi_romZboot_applicationr=   r   c                      t  fdd j| D S )Nc                      g | ]}  |qS r   r   r   ar+   r   r   r   ^  r   z@GnuLikeDynamicLinkerMixin.get_buildtype_args.<locals>.<listcomp>r   listifyr  r>   r   r+   r   r  [  s   z,GnuLikeDynamicLinkerMixin.get_buildtype_argsc                 C  r   )Nz-pier   r+   r   r   r   r  `  r   z&GnuLikeDynamicLinkerMixin.get_pie_argsc                 C  
   |  dS )Nz--as-neededrH  r+   r   r   r   r  c  r!   z+GnuLikeDynamicLinkerMixin.get_asneeded_argsr"   c                 C      |s|S |  d| |  d S Nz--whole-archivez--no-whole-archiverH  r%   r   r   r   r  f     z,GnuLikeDynamicLinkerMixin.get_link_whole_forc                 C  rM  N--allow-shlib-undefinedrH  r+   r   r   r   r  k  r!   z2GnuLikeDynamicLinkerMixin.get_allow_undefined_argsc                 C  r   )Nz-fltor   r+   r   r   r   r  n  r   z&GnuLikeDynamicLinkerMixin.get_lto_argsr  c                 C     |dkrg S d| gS Nnonez-fsanitize=r   r	  r   r   r   r
  q     
z(GnuLikeDynamicLinkerMixin.sanitizer_argsc                 C  r   Nz
--coverager   r+   r   r   r   r  v  r   z+GnuLikeDynamicLinkerMixin.get_coverage_argsr7   r8   c                 C  s0   |j | j }| s| r| dS | dS )Nz--export-all-symbolsz-export-dynamicr   r   r*   	is_cygwinr   )r   r7   mr   r   r   r  y  s   

z-GnuLikeDynamicLinkerMixin.export_dynamic_argsr  c                 C     |  d| S )Nz--out-implib=rH  r  r   r   r   r       z-GnuLikeDynamicLinkerMixin.import_library_argsc                 C  s   |j | j  r
g S dgS Nz-pthread)r   r   Zis_haikurQ   r   r   r   r    s   z&GnuLikeDynamicLinkerMixin.thread_flagsc                 C  rM  )Nz--no-undefinedrH  r+   r   r   r   r    r!   z+GnuLikeDynamicLinkerMixin.no_undefined_argsc                 C  rM  )Nz--fatal-warningsrH  r+   r   r   r   r    r!   z(GnuLikeDynamicLinkerMixin.fatal_warningsr$  r%  r&  r'  r(  r)  c           	      C  sR   |j | j }| s| rg S |d u rdnd| }| d| | d| | S Nr   .z-soname,rX  )	r   r7   r$  r%  r&  r'  r(  rZ  sostrr   r   r   r+    s
   z)GnuLikeDynamicLinkerMixin.get_soname_argsrD   rE   rF   rG   rH   rI   rJ   c              
     sr  |j | j }| s| rg t fS |s|s|sg t fS g }d t|||}	t fdd|	D }
t }|
D ]
}||	d q9|dkr]|
| |
dD ]
}||	d qRt set rm|| d d|
}t|t|k rdt|t|  }|s|}n|d | }|| d	|  t r||fS |D ]}|| d
tj||  q||fS )N$ORIGINc                      g | ]	}t j |qS r   r   r   r   r   Zorigin_placeholderr   r   r         z>GnuLikeDynamicLinkerMixin.build_rpath_args.<locals>.<listcomp>utf8r   :z	-z,originX-rpath,z-rpath-link,)r   r   r*   rY  rM   r   r   
OrderedSetaddencodesplitZis_dragonflybsdZ
is_openbsdextendr   r   lenr   r   r   )r   r7   rD   rE   rF   rH   rI   rZ  r"   processed_rpaths	all_pathsrpath_dirs_to_remover   pathspaddingr   rd  r   rO     s<   



 z*GnuLikeDynamicLinkerMixin.build_rpath_argsc                 C  sp   d }d|v r| dd\}}| j|}|d ur*|d ur#|d| 7 }d| g}n	td|d| |S )N,r   rg  --subsystem,win_subsystem: z: not handled in MinGW linker. This should not be possible.)rm  _SUBSYSTEMSgetr   MesonBugExceptionr   )r   r  Zversionsuffixnewvaluer"   r   r   r   r     s   
z0GnuLikeDynamicLinkerMixin.get_win_subsystem_argsNr-  ri   rg   rm   r0  rl   r3  r5  rk   )r   r   r   r   r   TYPE_CHECKINGr   HOSTr   r   r  rx  r  r  r  r  r  r  r
  r  r  r  r  r  r  r+  rO   r   r   r   r   r   r=  :  sL    
















	Dr=  c                   @  s   e Zd ZdZdZd7ddZd7ddZd8ddZd7ddZd9ddZ	d7ddZ
d:ddZd7ddZd7ddZd7ddZd7ddZd;d(d)Zd<d1d2Zd=d4d5Zd6S )>AppleDynamicLinkerzApple's ld implementation.Zld64r$   r   c                 C  rM  )Nz-dead_strip_dylibsrH  r+   r   r   r   r    r!   z$AppleDynamicLinker.get_asneeded_argsc                 C  rM  )N-undefined,dynamic_lookuprH  r+   r   r   r   r    r!   z+AppleDynamicLinker.get_allow_undefined_argsr-   r.   c                 C  s   dg|  d S )Nz-bundler  rH  r0   r   r   r   r    s   z-AppleDynamicLinker.get_std_shared_module_argsc                 C  r/   r   r   r+   r   r   r   r    r<   zAppleDynamicLinker.get_pie_argsr"   c                 C  s,   g }|D ]}| | d || q|S )Nz-force_load)rn  r   append)r   r"   resultrJ  r   r   r   r     s
   z%AppleDynamicLinker.get_link_whole_forc                 C  r   rW  r   r+   r   r   r   r    r   z$AppleDynamicLinker.get_coverage_argsr  r   c                 C  rS  rT  r   r	  r   r   r   r
  
  rV  z!AppleDynamicLinker.sanitizer_argsc                 C  rM  )Nz-undefined,errorrH  r+   r   r   r   r    r!   z$AppleDynamicLinker.no_undefined_argsc                 C  rM  )Nz-headerpad_max_install_namesrH  r+   r   r   r   r    r!   z!AppleDynamicLinker.headerpad_argsc                 C  rM  )Nz-bitcode_bundlerH  r+   r   r   r   r#    r!   zAppleDynamicLinker.bitcode_argsc                 C  rM  )Nz-fatal_warningsrH  r+   r   r   r   r    r!   z!AppleDynamicLinker.fatal_warningsr7   r8   r$  r%  r&  r'  r(  r)  c           	      C  sZ   d||g}|d ur| d|  | d dd|g}|r+|d|d d|d	 g |S )
Nz@rpath/r_  z.dylibz-install_namer   z-compatibility_versionr   z-current_versionr   )r  r   rn  )	r   r7   r$  r%  r&  r'  r(  Zinstall_namer"   r   r   r   r+    s   

z"AppleDynamicLinker.get_soname_argsrD   rE   rF   rG   rH   rI   rJ   c                   |   |s|s|sg t  fS g }d t|||}t fdd|D }	|dkr*|	| |	D ]}
|| d|
  q,|t  fS )Nz@loader_pathc                   rb  r   rc  r   rd  r   r   r   1  re  z7AppleDynamicLinker.build_rpath_args.<locals>.<listcomp>r   ri  rM   r   r   rj  rk  rn  r   r   r7   rD   rE   rF   rH   rI   r"   rp  rq  Zrpr   rd  r   rO   '  s   


z#AppleDynamicLinker.build_rpath_argsr   c                 C  r   )Nz-Wl,-cache_path_lto,r   r  r   r   r   r  9  r!   z)AppleDynamicLinker.get_thinlto_cache_argsNrg   rf   rm   r0  r5  rk   r/  )r   r   r   r   r   r  r  r  r  r  r  r
  r  r  r#  r  r+  rO   r  r   r   r   r   r~    s"    












r~  c                   @  r   )LLVMLD64DynamicLinkerzld64.lldNr   r   r   r   r   r  =  r   r  c                   @  s   e Zd ZdZdddZdS )GnuDynamicLinkerz)Representation of GNU ld.bfd and ld.gold.r$   r'   c                 C  r   )NTr   r+   r   r   r   r   F  r<   z GnuDynamicLinker.get_accepts_rspNre   )r   r   r   r   r   r   r   r   r   r  B  r   r  c                   @  r   )
GnuGoldDynamicLinkerzld.goldr   r   r$   r   c                 C  r   )Nz-Wl,-plugin-opt,cache-dir=r   r  r   r   r   r  N  r!   z+GnuGoldDynamicLinker.get_thinlto_cache_argsNr/  r   r   r   r   r  r   r   r   r   r  J  r   r  c                   @  r   )GnuBFDDynamicLinkerzld.bfdNr   r   r   r   r   r  R  r   r  c                   @  r   )
MoldDynamicLinkerzld.moldr   r   r$   r   c                 C  r   Nz-Wl,--thinlto-cache-dir=r   r  r   r   r   r  [  r!   z(MoldDynamicLinker.get_thinlto_cache_argsNr/  r  r   r   r   r   r  W  r   r  c                      sJ   e Zd ZdZdZddd fddZdddZdddZdddZ  Z	S )LLVMDynamicLinkerzRepresentation of LLVM's ld.lld linker.

    This is only the gnu-like linker, not the apple like or link.exe like
    linkers.
    zld.lldr   r   r   r   r   r   r   r   rw   r   r   c                  sL   t  j|||||d t| j| | d \}}}d|vo"d|v| _d S )Nr   rR  z)unknown argument: --allow-shlib-undefinedz+unknown argument: '--allow-shlib-undefined')r   r    r   r   r   r   has_allow_shlib_undefined)r   r   r   r   rw   r   _er   r   r   r    i  s    zLLVMDynamicLinker.__init__r$   c                 C  s   | j r| dS g S rQ  )r  r   r+   r   r   r   r  s  s   
z*LLVMDynamicLinker.get_allow_undefined_argsr   c                 C  r   r  r   r  r   r   r   r  x  r!   z(LLVMDynamicLinker.get_thinlto_cache_argsr  c                 C  s`   d }d|v r| dd\}}|| jv r'|d ur|d| 7 }| d| gS td| d)Nru  r   rg  rv  rw  z8 not handled in lld linker. This should not be possible.)rm  rx  r   r   rz  )r   r  r   r   r   r   r   {  s   
z(LLVMDynamicLinker.get_win_subsystem_argsr.  rg   r/  r0  )
r   r   r   r   r   r    r  r  r   r   r   r   r   r   r  _  s    


r  c                   @  sF   e Zd ZdZdZd ddZd ddZd!ddZd ddZd"ddZ	dS )#WASMDynamicLinkerzEmscripten's wasm-ld.zld.wasmr$   r   c                 C  r   )Nz-sERROR_ON_UNDEFINED_SYMBOLS=0r   r+   r   r   r   r    r   z*WASMDynamicLinker.get_allow_undefined_argsc                 C  r   )Nz-sERROR_ON_UNDEFINED_SYMBOLS=1r   r+   r   r   r   r    r   z#WASMDynamicLinker.no_undefined_argsr7   r8   r$  r   r%  r&  r'  r(  r)  c                 C     t | j dNz# does not support shared libraries.r   r   r*  r   r   r   r+       z!WASMDynamicLinker.get_soname_argsc                 C  r/   r   r   r+   r   r   r   r    r<   z#WASMDynamicLinker.get_asneeded_argsrD   rE   rF   rG   rH   rI   rJ   c                 C  rK   r   rL   rN   r   r   r   rO     rP   z"WASMDynamicLinker.build_rpath_argsNrg   r5  rk   )
r   r   r   r   r   r  r  r+  r  rO   r   r   r   r   r    s    



r  c                      sr   e Zd ZdZdZddd' fd	d
Zd(ddZd)ddZd*ddZd+ddZ	d,ddZ
d*ddZd-d%d&Z  ZS ).CcrxDynamicLinkerz!Linker for Renesas CCrx compiler.r   r   r   r   r   r   r   c                     t  jdg|dg |d d S )Nz	rlink.exer   r   r   r    r   r   r   r   r   r   r         
zCcrxDynamicLinker.__init__r$   r'   c                 C  r   r   r   r+   r   r   r   r     r<   z!CcrxDynamicLinker.get_accepts_rspc                 C  r   )Nz-lib=r   r+   r   r   r   r     r<   z CcrxDynamicLinker.get_lib_prefixr   c                 C  r/   r   r   r+   r   r   r   r    r<   z)CcrxDynamicLinker.get_std_shared_lib_args
outputnamec                 C  r   r   r   r   r  r   r   r   rB     r   z!CcrxDynamicLinker.get_output_argsr  'T.NoReturn'c                 C  r!  )Nz-rlink.exe does not have a search dir argumentOSErrorr  r   r   r   r    r   z!CcrxDynamicLinker.get_search_argsc                 C  r/   r   r   r+   r   r   r   r    r<   z*CcrxDynamicLinker.get_allow_undefined_argsr7   r8   r$  r%  r&  r'  r(  r)  c                 C  r/   r   r   r*  r   r   r   r+    r2   z!CcrxDynamicLinker.get_soname_argsr   r   r   r   re   r,  rg   r  r   r$   r   r  r   r$   r  r5  )r   r   r   r   r   r    r   r   r  rB   r  r  r+  r   r   r   r   r   r    s    





r  c                      s   e Zd ZdZdZddd3 fd	d
Zd4ddZd5ddZd6ddZd7ddZ	d8ddZ
d9ddZd7ddZd:d(d)Zd;d1d2Z  ZS )<Xc16DynamicLinkerz#Linker for Microchip XC16 compiler.xc16-gccr   r   r   r   r   r   c                  r  )Nr  r   r   r  r  r   r   r   r      r  zXc16DynamicLinker.__init__r"   r   r$   c                 C  rN  Nz--start-groupz--end-grouprH  r%   r   r   r   r    rP  z$Xc16DynamicLinker.get_link_whole_forr'   c                 C  r   r   r   r+   r   r   r   r     r<   z!Xc16DynamicLinker.get_accepts_rspc                 C  r   r   r   r+   r   r   r   r     r<   z Xc16DynamicLinker.get_lib_prefixc                 C  r/   r   r   r+   r   r   r   r    r<   z)Xc16DynamicLinker.get_std_shared_lib_argsr  c                 C  r   r   r   r  r   r   r   rB     r   z!Xc16DynamicLinker.get_output_argsr  r  c                 C  r!  )Nz,xc16-gcc does not have a search dir argumentr  r  r   r   r   r    r   z!Xc16DynamicLinker.get_search_argsc                 C  r/   r   r   r+   r   r   r   r    r<   z*Xc16DynamicLinker.get_allow_undefined_argsr7   r8   r$  r%  r&  r'  r(  r)  c                 C  r/   r   r   r*  r   r   r   r+    r2   z!Xc16DynamicLinker.get_soname_argsrD   rE   rF   rG   rH   rI   rJ   c                 C  rK   r   rL   rN   r   r   r   rO     rP   z"Xc16DynamicLinker.build_rpath_argsr  rm   re   r,  rg   r  r  r5  rk   r   r   r   r   r   r    r  r   r   r  rB   r  r  r+  rO   r   r   r   r   r   r        







r  c                      s   e Zd ZdZdZddd2 fd	d
Zd3ddZd4ddZd5ddZd6ddZ	d7ddZ
d8ddZd6ddZd9d'd(Zd:d0d1Z  ZS );CompCertDynamicLinkerzLinker for CompCert C compiler.r   r   r   r   r   r   r   c                  r  )Nr   r   r   r  r  r   r   r   r      r  zCompCertDynamicLinker.__init__r"   r   r$   c                 C  rN  )Nz-Wl,--whole-archivez-Wl,--no-whole-archiverH  r%   r   r   r   r    rP  z(CompCertDynamicLinker.get_link_whole_forr'   c                 C  r   r   r   r+   r   r   r   r     r<   z%CompCertDynamicLinker.get_accepts_rspc                 C  r   r   r   r+   r   r   r   r     r<   z$CompCertDynamicLinker.get_lib_prefixc                 C  r/   r   r   r+   r   r   r   r    r<   z-CompCertDynamicLinker.get_std_shared_lib_argsr  c                 C  r   r   r   r  r   r   r   rB     r   z%CompCertDynamicLinker.get_output_argsr  c                 C  r   r<  r   r  r   r   r   r  
  r   z%CompCertDynamicLinker.get_search_argsc                 C  r/   r   r   r+   r   r   r   r    r<   z.CompCertDynamicLinker.get_allow_undefined_argsr7   r8   r$  r%  r&  r'  r(  r)  c                 C  r  r  r  r*  r   r   r   r+    r  z%CompCertDynamicLinker.get_soname_argsrD   rE   rF   rG   rH   rI   rJ   c                 C  rK   r   rL   rN   r   r   r   rO     rP   z&CompCertDynamicLinker.build_rpath_argsr  rm   re   r,  rg   r  r2  r5  rk   r  r   r   r   r   r    r  r  c                      s|   e Zd ZdZdZddd# fddZd$ddZd%ddZd&ddZd'ddZ	d(ddZ
d)ddZd'dd Zd'd!d"Z  ZS )*TIDynamicLinkerz-Linker for Texas Instruments compiler family.Ztir   r   r   r   r   r   r   r   c                     t  j||dg |d d S Nr   r   r  r   r   r   r   r   r   r   r      s   
zTIDynamicLinker.__init__r"   r$   c                 C  rN  r  rH  r%   r   r   r   r  $  rP  z"TIDynamicLinker.get_link_whole_forr'   c                 C  r   r   r   r+   r   r   r   r   )  r<   zTIDynamicLinker.get_accepts_rspc                 C  r   )Nz-l=r   r+   r   r   r   r   ,  r<   zTIDynamicLinker.get_lib_prefixc                 C  r/   r   r   r+   r   r   r   r  /  r<   z'TIDynamicLinker.get_std_shared_lib_argsr  c                 C  s   dd| gS )N-zz--output_file=r   r  r   r   r   rB   2  r\  zTIDynamicLinker.get_output_argsr  r  c                 C  r!  )Nz.TI compilers do not have a search dir argumentr  r  r   r   r   r  5  r   zTIDynamicLinker.get_search_argsc                 C  r/   r   r   r+   r   r   r   r  8  r<   z(TIDynamicLinker.get_allow_undefined_argsc                 C  r/   r   r   r+   r   r   r   r`   ;  r<   zTIDynamicLinker.get_always_argsr   r   r   r   r   r   rm   re   r,  rg   r  r  )r   r   r   r   r   r    r  r   r   r  rB   r  r  r`   r   r   r   r   r   r    s    






r  c                   @  r   )C2000DynamicLinkerZcl2000Nr   r   r   r   r   r  ?  r   r  c                      sJ   e Zd ZdZdZddd fd	d
ZdddZdddZdddZ  Z	S )ArmDynamicLinkerzLinker for the ARM compiler.armlinkr   r   r   r   r   r   c                  r  )Nr  r   r   r  r  r   r   r   r    J  r  zArmDynamicLinker.__init__r$   r'   c                 C  r   r   r   r+   r   r   r   r   O  r<   z ArmDynamicLinker.get_accepts_rspr  c                 C  r!  )Nz/The Arm Linkers do not support shared librariesr"  r+   r   r   r   r  R  r   z(ArmDynamicLinker.get_std_shared_lib_argsr   c                 C  r/   r   r   r+   r   r   r   r  U  r<   z)ArmDynamicLinker.get_allow_undefined_argsr  re   )r$   r  rg   )
r   r   r   r   r   r    r   r  r  r   r   r   r   r   r  D  s    

r  c                   @  s$   e Zd ZdZdddZdd
dZdS )ArmClangDynamicLinkerzLinker used with ARM's clang fork.

    The interface is similar enough to the old ARM ld that it inherits and
    extends a few things as needed.
    r7   r8   r$   r   c                 C  r   )Nz--export_dynamicr   rQ   r   r   r   r  a  r   z)ArmClangDynamicLinker.export_dynamic_argsr  r   c                 C  r   )Nz
--symdefs=r   r  r   r   r   r  d  r!   z)ArmClangDynamicLinker.import_library_argsNrl   r3  )r   r   r   r   r  r  r   r   r   r   r  Y  s    
r  c                   @  s   e Zd ZdZdZdS )QualcommLLVMDynamicLinkerz-ARM Linker from Snapdragon LLVM ARM Compiler.zld.qcldN)r   r   r   r   r   r   r   r   r   r  g  s    r  c                   @  s2   e Zd ZdZdZdddZdddZdddZdS )NAGDynamicLinkera;  NAG Fortran linker, ld via gcc indirection.

    Using nagfor -Wl,foo passes option foo to a backend gcc invocation.
    (This linking gathers the correct objects needed from the nagfor runtime
    system.)
    To pass gcc -Wl,foo options (i.e., to ld) one must apply indirection
    again: nagfor -Wl,-Wl,,foo
    Znagr7   r8   rD   r   rE   rF   rG   rH   rI   r$   rJ   c                   r  )Nra  c                   rb  r   rc  r   rd  r   r   r     re  z5NAGDynamicLinker.build_rpath_args.<locals>.<listcomp>r   z-Wl,-Wl,,-rpath,,r  r  r   rd  r   rO   {  s   


z!NAGDynamicLinker.build_rpath_argsr   c                 C  r/   r   r   r+   r   r   r   r    r<   z)NAGDynamicLinker.get_allow_undefined_argsc                 C  s   ddl m} || jdg S )Nr   )NAGFortranCompilerz-Wl,-shared)Zcompilers.fortranr  Zget_nagfor_quietr   )r   r  r   r   r   r    s   z(NAGDynamicLinker.get_std_shared_lib_argsNrk   rg   )r   r   r   r   r   rO   r  r  r   r   r   r   r  n  s    	

r  c                   @  s<   e Zd ZdZdZdddZdddZdddZd ddZdS )!PGIDynamicLinkerzPGI linker.Zpgir$   r   c                 C  r/   r   r   r+   r   r   r   r    r<   z)PGIDynamicLinker.get_allow_undefined_argsr7   r8   r$  r   r%  r&  r'  r(  r)  c                 C  r/   r   r   r*  r   r   r   r+    r2   z PGIDynamicLinker.get_soname_argsc                 C  s"   t  rddgS t  rdgS g S )Nz	-Bdynamicz	-Mmakedllr;  )r   r*   Zis_linuxr+   r   r   r   r    s
   z(PGIDynamicLinker.get_std_shared_lib_argsrD   rE   rF   rG   rH   rI   rJ   c                   s2   |j | j  s fdd|D t fS g t fS )Nc                   s   g | ]}d t j | qS )z-Rrc  r   rD   r   r   r     s    z5PGIDynamicLinker.build_rpath_args.<locals>.<listcomp>)r   r   r*   rM   rN   r   r  r   rO     s   
z!PGIDynamicLinker.build_rpath_argsNrg   r5  rk   )	r   r   r   r   r   r  r+  r  rO   r   r   r   r   r    s    


r  c                      s2   e Zd Zd fddZdd
dZdddZ  ZS )PGIStaticLinkerr   r   c                   s   t  | d| _dg| _d S )Nr   r   )r   r    r   r   r   r   r   r   r      s   zPGIStaticLinker.__init__r7   r8   r9   r'   r$   c                 C  r   r   r   r:   r   r   r   r;     r   z!PGIStaticLinker.get_std_link_argsr@   r   c                 C  r   r   r   rA   r   r   r   rB     r   zPGIStaticLinker.get_output_argsrd   rh   rj   )r   r   r   r    r;   rB   r   r   r   r   r   r    s    
r  c                      s   e Zd ZdZejrejZdDddZ	g g g dgd	dgg d
Z
dddddE fddZdFddZdGddZdHd!d"ZdI fd#d$ZdJd&d'ZdId(d)ZdKd+d,ZdLd-d.ZdMd0d1ZdId2d3ZdNd<d=ZdOd?d@ZdPdBdCZ  ZS )QVisualStudioLikeLinkerMixinzCMixin class for dynamic linkers that act like Microsoft's link.exe.r   r   r$   r   c                 C  r\   r   r   r>  r   r   r   r     r?  z)VisualStudioLikeLinkerMixin._apply_prefixz/OPT:REFz/INCREMENTAL:NOr   r   Tx86)r   directrt   r   r   r   r   rw   r   r   r  r'   rt   c                  s&   t  j|||||d || _|| _d S )Nr   )r   r    rt   r  )r   r   r   r   rw   r   r  rt   r   r   r   r      s   
z$VisualStudioLikeLinkerMixin.__init__r=   c                   rF  )Nc                   rG  r   rH  rI  r+   r   r   r     r   zBVisualStudioLikeLinkerMixin.get_buildtype_args.<locals>.<listcomp>rK  r>   r   r+   r   r    r   z.VisualStudioLikeLinkerMixin.get_buildtype_argsc                 C  s   | j  S r   )r  r+   r   r   r   invoked_by_compiler  r   z/VisualStudioLikeLinkerMixin.invoked_by_compilerr  c                 C  s   |  d| j d| gS rx   )r   rt   r  r   r   r   rB        z+VisualStudioLikeLinkerMixin.get_output_argsc                   s    t   }| dtd| S )N/nologor   )r   r`   r   r   cast)r   parentr   r   r   r`     s   
z+VisualStudioLikeLinkerMixin.get_always_argsr  c                 C  r[  )Nz	/LIBPATH:rH  r  r   r   r   r    r\  z+VisualStudioLikeLinkerMixin.get_search_argsc                 C  rM  )Nz/DLLrH  r+   r   r   r   r    r!   z3VisualStudioLikeLinkerMixin.get_std_shared_lib_argsr[   c                 C  s   |j dddd }|d S )Nr_  r   maxsplitr   z.pdb)rsplit)r   r[   basenamer   r   r   r     s   z.VisualStudioLikeLinkerMixin.get_debugfile_namec                 C  s   |  dd| | gS )Nz/DEBUGz/PDB:)r   r   r]   r   r   r   r     r  z.VisualStudioLikeLinkerMixin.get_debugfile_argsr"   c                 C  s0   t |}g }|D ]}|| d|  q	|S )Nz/WHOLEARCHIVE:)r   rL  rn  r   )r   r"   lrJ  r   r   r   r    s
   
z.VisualStudioLikeLinkerMixin.get_link_whole_forc                 C  r/   r   r   r+   r   r   r   r    r<   z4VisualStudioLikeLinkerMixin.get_allow_undefined_argsr7   r8   r$  r%  r&  r'  r(  r)  c                 C  r/   r   r   r*  r   r   r   r+    r2   z+VisualStudioLikeLinkerMixin.get_soname_argsr  c                 C  s   |  d| gS )z+The command to generate the import library.z/IMPLIB:rH  r  r   r   r   r    r  z/VisualStudioLikeLinkerMixin.import_library_argsr   c                 C  r   r   r   r+   r   r   r   rc   	  r   z+VisualStudioLikeLinkerMixin.rsp_file_syntaxr-  )r   r   r   r   r   r   rw   r   r   r   r  r'   rt   r   ri   re   r  rg   r2  rn   ro   rm   r5  r3  rp   )r   r   r   r   r   r|  r   r}  r   r   r  r    r  r  rB   r`   r  r  r   r   r  r  r+  r  rc   r   r   r   r   r   r    s6    











r  c                      sV   e Zd ZdZdZddddddd  fddZd! fddZd"ddZd#ddZ  Z	S )$MSVCDynamicLinkerzMicrosoft's Link.exe.linkNr   r  r   Tr   r$  rt   r   r  r   r   rw   r   r   T.Optional[T.List[str]]r$  r   rt   r   r   r  r'   c             	     $   t  j|pdg||||||d d S )Nzlink.exert   r   r  r  r   r   rw   r   r$  rt   r   r  r   r   r   r         

zMSVCDynamicLinker.__init__r$   c                      |  ddgt   S )Nr  z/releaser   r   r`   r+   r   r   r   r`     r  z!MSVCDynamicLinker.get_always_argsr  c                 C     |  |rdS dS NrA  rB  r   r	  r   r   r   r       z"MSVCDynamicLinker.get_gui_app_argsc                 C     |  d|  gS Nz/SUBSYSTEM:r   upperr	  r   r   r   r   !  r   z(MSVCDynamicLinker.get_win_subsystem_argsr   r   rw   r   r   r  r$  r   rt   r   r   r   r  r'   rg   r4  r0  )
r   r   r   r   r   r    r`   r  r   r   r   r   r   r   r    s    
r  c                      s`   e Zd ZdZdZddddddd$ fddZd% fddZd&ddZd'dd Zd(d"d#Z	  Z
S ))ClangClDynamicLinkerzClang's lld-link.exe.zlld-linkNr   r  r   Tr  r   r   rw   r   r   r  r$  r   rt   r   r   r  r'   c             	     r  )Nzlld-link.exer  r  r  r   r   r   r    +  r  zClangClDynamicLinker.__init__r  r$   c                   s(   | j d u r| d| gS t |S )Nry   )rt   r   r   rB   r  r   r   r   rB   3  s   
z$ClangClDynamicLinker.get_output_argsr  c                 C  r  r  r  r	  r   r   r   r  ;  r  z%ClangClDynamicLinker.get_gui_app_argsc                 C  r  r  r  r	  r   r   r   r   >  r   z+ClangClDynamicLinker.get_win_subsystem_argsr   c                 C  r   )Nz/lldltocache:r   r  r   r   r   r  A  r!   z+ClangClDynamicLinker.get_thinlto_cache_argsr  r  r4  r0  r/  )r   r   r   r   r   r    rB   r  r   r  r   r   r   r   r   r  %  s    

r  c                      sH   e Zd ZdZdZddddddd fddZdddZd ddZ  ZS )!XilinkDynamicLinkerzIntel's Xilink.exe.ZxilinkNr   r  r   Tr  r   r   rw   r   r   r  r$  r   rt   r   r   r  r'   c                  s   t  jdg|d||d d S )Nz
xilink.exer   r   r  r  r   r   r   r    K  s   zXilinkDynamicLinker.__init__r  r$   c                 C  r  r  r  r	  r   r   r   r  R  r  z$XilinkDynamicLinker.get_gui_app_argsc                 C  r  r  r  r	  r   r   r   r   U  r   z*XilinkDynamicLinker.get_win_subsystem_argsr  r4  r0  )	r   r   r   r   r   r    r  r   r   r   r   r   r   r  E  s    
r  c                   @  sd   e Zd ZdZdZd'ddZd(dd	Zd(d
dZd(ddZd(ddZ	d(ddZ
d)ddZd*d$d%Zd&S )+SolarisDynamicLinkerz5Sys-V derived linker used on Solaris and OpenSolaris.z
ld.solarisr"   r   r$   c                 C  rN  rO  rH  r%   r   r   r   r  _  rP  z'SolarisDynamicLinker.get_link_whole_forc                 C  sV   t | j| d \}}}|| dD ]}d|v r(d|v r%ddg  S  g S qg S )Nz-zhelp
z-z typeZpier  ztype=pie)r   r   r   r   rm  )r   Zpcr   Zstdeliner   r   r   r  d  s   z!SolarisDynamicLinker.get_pie_argsc                 C  s   |  ddgS )Nr  ignorerH  r+   r   r   r   r  n  r\  z&SolarisDynamicLinker.get_asneeded_argsc                 C  r   )Nr  Zdefsr   r+   r   r   r   r  q  r   z&SolarisDynamicLinker.no_undefined_argsc                 C  r   )Nr  Znodefsr   r+   r   r   r   r  t  r   z-SolarisDynamicLinker.get_allow_undefined_argsc                 C  r   )Nr  zfatal-warningsr   r+   r   r   r   r  w  r   z#SolarisDynamicLinker.fatal_warningsr7   r8   rD   r   rE   rF   rG   rH   rI   rJ   c                 C  s   |s|s|sg t  fS t|||}tdd |D }t  }	|D ]
}
|	|
d q |dkrD|| |dD ]
}
|	|
d q9d|}t|t|k rfdt|t|  }|s`|}n|d | }| 	d| |	fS )Nc                 S  s   g | ]	}t jd |qS )ra  rc  r   r   r   r   r     re  z9SolarisDynamicLinker.build_rpath_args.<locals>.<listcomp>rf  r   rg  rh  ri  )
rM   r   r   rj  rk  rl  rm  r   ro  r   )r   r7   rD   rE   rF   rH   rI   rp  rq  rr  r   rs  rt  r   r   r   rO   z  s$   


z%SolarisDynamicLinker.build_rpath_argsr$  r%  r&  r'  r(  r)  c                 C  s2   |d u rdnd| }|  d| | d| | S r^  rH  )r   r7   r$  r%  r&  r'  r(  r`  r   r   r   r+    s   z$SolarisDynamicLinker.get_soname_argsNrm   rg   rk   r5  )r   r   r   r   r   r  r  r  r  r  r  rO   r+  r   r   r   r   r  Y  s    







r  c                      sX   e Zd ZdZdZd fddZdddZdd	d
ZdddZdddZ	dddZ
  ZS ) AIXDynamicLinkerz Sys-V derived linker used on AIXzld.aixr$   r   c                   r  )Nz	-bnoipathz-bbigtocr  r+   r   r   r   r`     r  z AIXDynamicLinker.get_always_argsc                 C     |  dgS )Nz	-bernotokrH  r+   r   r   r   r    r   z"AIXDynamicLinker.no_undefined_argsc                 C  r  )Nz-berokrH  r+   r   r   r   r    r   z)AIXDynamicLinker.get_allow_undefined_argsr"   c                 C  s   |S r   r   r%   r   r   r   r    s   z#AIXDynamicLinker.get_link_whole_forr7   r8   rD   r   rE   rF   rG   rH   rI   rJ   c           
      C  s   t  }|dkr|| |dkr|| |D ]}|tj|| q|| j}	t|	dkr9|	ddg n|	D ]}tj
|rH|| q;| dd| t fS )Nr   r   z/usr/libz/libz
-blibpath:rg  )r   rj  rk  r   r   r   Zget_compiler_system_dirsr   ro  updateisdirr   rM   )
r   r7   rD   rE   rF   rH   rI   rq  r   sys_pathr   r   r   rO     s   


z!AIXDynamicLinker.build_rpath_argsc                 C  r   r]  r   rQ   r   r   r   r    r   zAIXDynamicLinker.thread_flagsrg   rm   rk   rl   )r   r   r   r   r   r`   r  r  r  rO   r  r   r   r   r   r   r    s    



r  c                      sJ   e Zd ZdZdZddd fddZdddZdddZdddZ  Z	S )OptlinkDynamicLinkerz(Digital Mars dynamic linker for windows.Zoptlinkr   r   r   r   r   r   r   r   c                  r  r  r  r  r   r   r   r      s   zOptlinkDynamicLinker.__init__r$   c                 C  r/   r   r   r+   r   r   r   r    r<   z-OptlinkDynamicLinker.get_allow_undefined_argsr[   c                 C  r/   r   r   r]   r   r   r   r     r2   z'OptlinkDynamicLinker.get_debugfile_argsc                 C  r/   r   r   r+   r   r   r   r`     r<   z$OptlinkDynamicLinker.get_always_argsr  rg   ro   )
r   r   r   r   r   r    r  r   r`   r   r   r   r   r   r    s    

r  c                   @  sT   e Zd ZdZdZedddZddd	Zdd
dZdddZ	dddZ
dddZdS ) 
CudaLinkerzCuda linker (nvlink)nvlinkr$   r   c                  C  sH   ddg} z
t | \}}}W n
 ty   Y dS w | jdddd S )Nr  z	--versionr   Vr   r  )r   r   r  stripr  )Zversion_cmdr  outr   r   r   parse_version  s   zCudaLinker.parse_versionr'   c                 C  r   r   r   r+   r   r   r   r     r2   zCudaLinker.get_accepts_rspc                 C  s   ddl m} |jS )Nr   )CudaCompiler)Zcompilers.cudar  ZLINKER_PREFIX)r   r  r   r   r   r     s   zCudaLinker.get_lib_prefixr   c                 C  r   )Nz--warning-as-errorr   r+   r   r   r   r    r   zCudaLinker.fatal_warningsc                 C  r/   r   r   r+   r   r   r   r    r<   z#CudaLinker.get_allow_undefined_argsr7   r8   r$  r%  r&  r'  r(  r)  c                 C  r/   r   r   r*  r   r   r   r+    r2   zCudaLinker.get_soname_argsNr,  re   rg   r5  )r   r   r   r   r   staticmethodr  r   r   r  r  r+  r   r   r   r   r    s    



r  )r   rG   rD   r   rE   r   r$   r   )r   r   r$   r   )r   r   rD   r   rE   r   r$   r   )I
__future__r   r6  r   r   typingr   r   r   r   r   Zarglistr   r|  Zcoredatar	   environmentr
   r   uniqueEnumr   r   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ABCMetar   r:  r=  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ZNvidiaHPC_DynamicLinkerr  ZNvidiaHPC_StaticLinkerr  r  r  r  r  r  r  r  r   r   r   r   <module>   s   P!		!

	
 A 5O)"++&%L A2