
    e                    z   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m	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  G d d      Z G d dej.                        Zej                   reZeZnexZZ G d de      Z G d dee      Z G d dee      Z G d dee      Z G d de      Z  G d dee      Z! G d de      Z" G d d e      Z# G d! d"e      Z$ G d# d$e      Z% G d% d&e      Z& G d' d(e&      Z' G d) d*ee      Z( G d+ d,e      Z) G d- d.e)      Z* G d/ d0e)      Z+dtd1Z,dud2Z-dvd3Z. G d4 d5e      Z/ G d6 d7e      Z0 G d8 d9e/e      Z1 G d: d;e1      Z2 G d< d=e0e/e      Z3 G d> d?e3      Z4 G d@ dAe3      Z5 G dB dCe3      Z6 G dD dEe0e/e      Z7 G dF dGe0e/e      Z8 G dH dIe      Z9 G dJ dKe      Z: G dL dMe      Z; G dN dOe      Z< G dP dQe<      Z= G dR dSe/e      Z> G dT dUe>      Z? G dV dWe7      Z@ G dX dYe/e      ZA G dZ d[e/e      ZBeBZC G d\ d]e      ZDeDZE G d^ d_e      ZF G d` daeFe      ZG G db dceFe      ZH G dd deeFe      ZI G df dge/e      ZJ G dh die/e      ZK G dj dkeFe      ZL G dl dme/e      ZM G dn doe      ZN G dp dqeN      ZO G dr dseN      ZPy)w    )annotationsN   )ArLikeLinkerRSPFileSyntax   )mesonlib)EnvironmentExceptionMesonExceptionCompilerArgs)KeyedOptionDictType)Environment)MachineChoicec                      e Zd ZU ded<   ddZdddZddZddZddZdd	Z	dd
Z
d dZddZ	 	 	 	 	 	 	 	 d!dZd"dZddZddZed#d       Zed#d       Zd$dZd%dZddZddZd&dZy)'StaticLinkerstridc                    || _         y N)exelist)selfr   s     </usr/lib/python3/dist-packages/mesonbuild/linkers/linkers.py__init__zStaticLinker.__init__$   	        Nc                    t        | |      S r   r   r   argss     r   compiler_argszStaticLinker.compiler_args'   s    D$''r   c                *    t        j                         S )z[
        Determines whether the linker can accept arguments using the @rsp syntax.
        r   
is_windowsr   s    r   can_linker_accept_rspz"StaticLinker.can_linker_accept_rsp*   s     ""$$r   c                    g S )z=Like compilers.get_base_link_args, but for the static linker. r   optionss     r   get_base_link_argszStaticLinker.get_base_link_args0       	r   c                6    | j                   j                         S r   r   copyr#   s    r   get_exelistzStaticLinker.get_exelist4       ||  ""r   c                    g S r   r&   r   envis_thins      r   get_std_link_argszStaticLinker.get_std_link_args7       	r   c                    g S r   r&   r   	buildtypes     r   get_buildtype_linker_argsz&StaticLinker.get_buildtype_linker_args:   r5   r   c                    g S r   r&   r   targets     r   get_output_argszStaticLinker.get_output_args=   r5   r   c                    g S r   r&   r#   s    r   get_coverage_link_argsz#StaticLinker.get_coverage_link_args@   r5   r   c                    g t               fS r   setr   r2   	build_dirfrom_dirrpath_pathsbuild_rpathinstall_rpaths          r   build_rpath_argszStaticLinker.build_rpath_argsC        CE{r   c                    g S r   r&   r   r2   s     r   thread_link_flagszStaticLinker.thread_link_flagsH   r5   r   c                    g S r   r&   r#   s    r   openmp_flagszStaticLinker.openmp_flagsK   r5   r   c                    g S r   r&   r'   s     r   get_option_link_argsz!StaticLinker.get_option_link_argsN   r5   r   c                    |d d  S r   r&   clsr   s     r   unix_args_to_nativez StaticLinker.unix_args_to_nativeQ       Awr   c                    |d d  S r   r&   rS   s     r   native_args_to_unixz StaticLinker.native_args_to_unixU   rV   r   c                     y r   r&   r   
targetfiles     r   get_link_debugfile_namez$StaticLinker.get_link_debugfile_nameY       r   c                    g S r   r&   rZ   s     r   get_link_debugfile_argsz$StaticLinker.get_link_debugfile_args\   r*   r   c                    g S r   r&   r#   s    r   get_always_argszStaticLinker.get_always_args`   r5   r   c                    g S r   r&   r#   s    r   get_linker_always_argsz#StaticLinker.get_linker_always_argsc   r5   r   c                z    | j                         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#   s    r   rsp_file_syntaxzStaticLinker.rsp_file_syntaxf   sJ     --/  	HDGG9  =G  2H  	H/"dggY.g#hiir   r   T.List[str]r   )r   zT.Optional[T.Iterable[str]]returnr   ri   boolr(   z'KeyedOptionDictType'ri   rh   ri   rh   r2   'Environment'r3   rk   ri   rh   r8   r   ri   rh   r<   r   ri   rh   r2   ro   rD   r   rE   r   rF   T.Tuple[str, ...]rG   r   rH   r   ri   z"T.Tuple[T.List[str], T.Set[bytes]]r2   ro   ri   rh   r   rh   ri   rh   r[   r   ri   zT.Optional[str]r[   r   ri   rh   ri   r   )__name__
__module____qualname____annotations__r   r   r$   r)   r.   r4   r9   r=   r?   rI   rM   rO   rQ   classmethodrU   rX   r\   r_   ra   rc   rf   r&   r   r   r   r       s    G(%#&7FI(+0R
    jr   r   c                     e Zd ZU dZg g g g g g dZded<   ej                  d0d       Zd1dZ	dd	 	 	 	 	 	 	 d2d	Z
d0d
Zd0dZd0dZd3dZd4dZd5dZd3dZd0dZd6dZd7dZd8dZd9dZd3dZd6dZd3dZd3dZd:dZd;dZd<dZd3dZd=dZd3dZ ejB                  d>d        Z"d3d!Z#ejB                  d?d"       Z$d@d#Z%dAd$Z&d@d%Z'd3d&Z(d3d'Z)d3d(Z*d;d)Z+d3d*Z,	 	 	 	 	 	 	 	 dBd+Z-	 	 	 	 	 	 	 	 dCd,Z.dDd-Z/d3d.Z0y/)EDynamicLinkerzBase class for dynamic linkers.plaindebugdebugoptimizedreleaseminsizecustomT.Dict[str, T.List[str]]_BUILDTYPE_ARGSc                     y r   r&   r#   s    r   r   zDynamicLinker.id}       r   c                    t        |t              r|gn|}| j                  |S t        | j                  t              r|D cg c]  }| j                  |z    c}S g }|D ]  }|| j                  |gz   z  } |S c c}w r   )
isinstancer   
prefix_arg)r   argr   rets       r   _apply_prefixzDynamicLinker._apply_prefix   s~    "3,u#??"K-59:cDOOc):: 	+C4??cU**C	+
	 ;s   A9unknown versionversionc               X    || _         || _        || _        || _        || _        d | _        y r   )r   for_machiner   r   always_argsmachine)r   r   r   r   r   r   s         r   r   zDynamicLinker.__init__   s0     &$&(,r   c                    dj                  t        |       j                  | j                  dj	                  | j
                              S )Nz<{}: v{} `{}`> )formattypery   r   joinr   r#   s    r   __repr__zDynamicLinker.__repr__   s5    &&tDz':':DLL#((SWS_S_J`aar   c                    | j                   S r   )r   r#   s    r   get_idzDynamicLinker.get_id   s    wwr   c                <    d| j                    d| j                   dS )N(r   ))r   r   r#   s    r   get_version_stringz DynamicLinker.get_version_string   s    477)1T\\N!,,r   c                6    | j                   j                         S r   r,   r#   s    r   r.   zDynamicLinker.get_exelist   r/   r   c                *    t        j                         S r   r!   r#   s    r   get_accepts_rspzDynamicLinker.get_accepts_rsp   s     ""$$r   c                "    t         j                  S )re   r   GCCr#   s    r   rf   zDynamicLinker.rsp_file_syntax   s        r   c                6    | j                   j                         S r   r   r-   r#   s    r   ra   zDynamicLinker.get_always_args       $$&&r   c                     yN r&   r#   s    r   get_lib_prefixzDynamicLinker.get_lib_prefix       r   c                    g S r   r&   r'   s     r   get_option_argszDynamicLinker.get_option_args   r5   r   c                4    t        d| j                   d      )Nz	Language z+ does not support has_multi_link_arguments.r	   r   )r   r   r2   s      r   has_multi_argumentsz!DynamicLinker.has_multi_arguments   s    "Ytwwi7b#cddr   c                     y)z*Name of debug file written out (see below)Nr&   rZ   s     r   get_debugfile_namez DynamicLinker.get_debugfile_name   s    r   c                    g S )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&   rZ   s     r   get_debugfile_argsz DynamicLinker.get_debugfile_args   s	     	r   c                    g S r   r&   r#   s    r   get_std_shared_lib_argsz%DynamicLinker.get_std_shared_lib_args   r5   r   c                "    | j                         S r   )r   r'   s     r   get_std_shared_module_argsz(DynamicLinker.get_std_shared_module_args   s    ++--r   c                4    t        d| j                   d      )NLinker z1 does not support position-independent executabler   r#   s    r   get_pie_argszDynamicLinker.get_pie_args   s     #WTWWI5f#ghhr   c                    g S r   r&   r#   s    r   get_lto_argszDynamicLinker.get_lto_args   r5   r   c                    g S r   r&   r   paths     r   get_thinlto_cache_argsz$DynamicLinker.get_thinlto_cache_args   r5   r   c                    g S r   r&   r   values     r   sanitizer_argszDynamicLinker.sanitizer_args   r5   r   c                     | j                   |   S r   )r   r7   s     r   get_buildtype_argsz DynamicLinker.get_buildtype_args   s     ##I..r   c                    g S r   r&   r#   s    r   get_asneeded_argszDynamicLinker.get_asneeded_args   r5   r   c                4    t        d| j                   d      )Nr   z does not support link_wholer   r   s     r   get_link_whole_forz DynamicLinker.get_link_whole_for   s     "dggY:;= 	=r   c                4    t        d| j                   d      )Nr   z! does not support allow undefinedr   r#   s    r   get_allow_undefined_argsz&DynamicLinker.get_allow_undefined_args   s"    "dggY?@B 	Br   c                     y r   r&   r   
outputnames     r   r=   zDynamicLinker.get_output_args   r   r   c                4    t        d| j                   d      )Nr   z, doesn't implement coverage data generation.r   r#   s    r   get_coverage_argszDynamicLinker.get_coverage_args   s    "WTWWI5a#bccr   c                     y r   r&   r   dirnames     r   get_search_argszDynamicLinker.get_search_args   r   r   c                    g S r   r&   rL   s     r   export_dynamic_argsz!DynamicLinker.export_dynamic_args   r5   r   c                    g S )zThe name of the outputted import library.

        This implementation is used only on Windows by compilers that use GNU ld
        r&   r   
implibnames     r   import_library_argsz!DynamicLinker.import_library_args   s	    
 	r   c                    g S r   r&   rL   s     r   thread_flagszDynamicLinker.thread_flags  r5   r   c                    g S )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#   s    r   no_undefined_argszDynamicLinker.no_undefined_args  	     	r   c                    g S )z&Arguments to make all warnings errors.r&   r#   s    r   fatal_warningszDynamicLinker.fatal_warnings  r*   r   c                    g S r   r&   r#   s    r   headerpad_argszDynamicLinker.headerpad_args  r*   r   c                    g S r   r&   r   s     r   get_win_subsystem_argsz$DynamicLinker.get_win_subsystem_args  s	     	r   c                    t        d      )Nz,This linker does not support bitcode bundlesr
   r#   s    r   bitcode_argszDynamicLinker.bitcode_args  s    KLLr   c                    g t               fS r   rA   rC   s          r   rI   zDynamicLinker.build_rpath_args"  rJ   r   c                    g S r   r&   r   r2   prefix
shlib_namesuffix	soversiondarwin_versionss          r   get_soname_argszDynamicLinker.get_soname_args'  r*   r   c                    t               S r   )r   r   filenames     r   get_archive_namezDynamicLinker.get_archive_name+  s	    ur   c                    g S r   r&   r#   s    r   get_command_to_archive_shlibz*DynamicLinker.get_command_to_archive_shlib/  r*   r   Nri   r   r   T.Union[str, T.List[str]]ri   rh   
r   rh   r   mesonlib.MachineChoicer   r  r   rh   r   r   rm   rj   rx   rl   )r   rh   r2   ro   ri   zT.Tuple[bool, bool]rv   rw   r   r   ri   rh   r   r   ri   rh   rp   ru   r   r   ri   rh   r   r   ri   rh   rt   r   r   ri   rh   rr   r2   ro   r   r   r   r   r   r   r   r   r   zT.Tuple[str, str]ri   rh   r   r   ri   r   )1ry   rz   r{   __doc__r   r|   abcabstractpropertyr   r   r   r   r   r   r.   r   rf   ra   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   abstractmethodr=   r   r   r   r   r   r   r   r   r   r   rI   r   r   r   r&   r   r   r   r   p   s   ) 1O-  	 	 >O-4-B[-)-7:-b-#%
!'
e.i/
=B 	 d 	 	
M&7FI(+0R
 #03FW\gr   r   )	metaclassc                  ^    e Zd ZdgZd
dZddZddZddZedd       Z	edd       Z
ddZy	)VisualStudioLikeLinkerz/NOLOGOc                    || _         y r   r   )r   r   s     r   r   zVisualStudioLikeLinker.__init__>  r   r   c                6    | j                   j                         S r   r   r#   s    r   ra   z&VisualStudioLikeLinker.get_always_argsA  r   r   c                6    | j                   j                         S r   r   r#   s    r   rc   z-VisualStudioLikeLinker.get_linker_always_argsD  r   r   c                Z    g }| j                   r|d| j                   z   gz  }|d|z   gz  }|S Nz	/MACHINE:/OUT:r  )r   r<   r   s      r   r=   z&VisualStudioLikeLinker.get_output_argsG  s;    <<[4<</00D6!""r   c                0    ddl m} |j                  |      S Nr   )VisualStudioCCompiler)compilers.cr  rU   rT   r   r  s      r   rU   z*VisualStudioLikeLinker.unix_args_to_nativeN      7$88>>r   c                0    ddl m} |j                  |      S r  )r  r  rX   r  s      r   rX   z*VisualStudioLikeLinker.native_args_to_unixS  r  r   c                "    t         j                  S r   r   MSVCr#   s    r   rf   z&VisualStudioLikeLinker.rsp_file_syntaxX      !!!r   N)r   r   rm   rq   ru   rx   )ry   rz   r{   r   r   ra   rc   r=   r}   rU   rX   rf   r&   r   r   r  r  ;  sJ    +K'' ? ? ? ?"r   r  c                      e Zd ZdZdZddZy)VisualStudioLinkerzMicrosoft's lib static linker.libc                \    t         j                  | |       t        j                  | |       y r   r   r   r  r   r   r   s      r   r   zVisualStudioLinker.__init__b  "    dG,''g6r   Nr   rh   r   r   ry   rz   r{   r  r   r   r&   r   r   r&  r&  \  s    (	B7r   r&  c                      e Zd ZdZdZddZy)IntelVisualStudioLinkerzIntel's xilib static linker.xilibc                \    t         j                  | |       t        j                  | |       y r   r)  r*  s      r   r   z IntelVisualStudioLinker.__init__m  r+  r   Nr,  r-  r&   r   r   r/  r/  g  s    &	B7r   r/  c                  4     e Zd ZdZd fdZddZddZ xZS )ArLinkerarc                    t         |   |       t        j                  | j                  dgz         d   }d}d}d|v r|dz  }d|v rd}|g| _        ||z   g| _        d	|v | _        || _        y )
Nz-hr   csrr   z[D]Dz[T]Tz@<)	superr   r   
Popen_safer   std_argsstd_thin_argscan_rspr   )r   r   r   stdostdargsthinargs	__class__s         r   r   zArLinker.__init__u  s    !""4<<4&#89!<D=sNGD=H 	%01t|&r   c                    | j                   S r   )r=  r#   s    r   r$   zArLinker.can_linker_accept_rsp  s    ||r   c                    |rZ|j                   | j                     j                         s3|j                   | j                     j                         s| j                  S | j
                  S r   )machinesr   	is_darwinis_sunosr<  r;  r1   s      r   r4   zArLinker.get_std_link_args  sR    
 3<<(8(89CCE,,t//099;%%%== r   )r   r  r   rh   rj   rn   )ry   rz   r{   r   r   r$   r4   __classcell__rA  s   @r   r3  r3  r  s    	B'	!r   r3  c                      e Zd ZdZy)AppleArLinkerapplearNry   rz   r{   r   r&   r   r   rJ  rJ    s	     
Br   rJ  c                      e Zd ZdZy)ArmarLinkerarmarNrL  r&   r   r   rN  rN    s    	Br   rN  c                  Z     e Zd Zej                  dd fdZddZd	dZd
dZddZ	 xZ
S )DLinker)
rsp_syntaxc               T    t         |   |       |d   | _        || _        || _        y )Nr   )r9  r   r   arch_DLinker__rsp_syntax)r   r   rT  rR  rA  s       r   r   zDLinker.__init__  s*    !!*	&r   c                    dgS )Nz-libr&   r1   s      r   r4   zDLinker.get_std_link_args  	    xr   c                    d|z   gS )Nz-of=r&   r;   s     r   r=   zDLinker.get_output_args  s      r   c                    t        j                         r6| 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-m64
x86_mscoffdmdz
-m32mscoffz-m32)r   r"   rT  r   r#   s    r   rc   zDLinker.get_linker_always_args  sL     yyH$xl*tww%/?$~%8O	r   c                    | j                   S r   )rU  r#   s    r   rf   zDLinker.rsp_file_syntax  s       r   )r   rh   rT  r   rR  r   rn   rq   rm   rx   )ry   rz   r{   r   r   r   r4   r=   rc   rf   rG  rH  s   @r   rQ  rQ    s%    WdWhWh '!!r   rQ  c                  8     e Zd Zd fdZddZddZddZ xZS )	
CcrxLinkerc                2    t         |   |       d| _        y )Nrlinkr9  r   r   r   r   rA  s     r   r   zCcrxLinker.__init__      !r   c                     yNFr&   r#   s    r   r$   z CcrxLinker.can_linker_accept_rsp      r   c                    d| gS Nz-output=r&   r;   s     r   r=   zCcrxLinker.get_output_args  s    6(#$$r   c                
    ddgS )Nz-nologoz-form=libraryr&   r#   s    r   rc   z!CcrxLinker.get_linker_always_args  s    ?++r   rg   rj   rq   rm   ry   rz   r{   r   r$   r=   rc   rG  rH  s   @r   r_  r_    s    %,r   r_  c                  8     e Zd Zd fdZddZddZddZ xZS )	
Xc16Linkerc                2    t         |   |       d| _        y )Nzxc16-arrb  rc  s     r   r   zXc16Linker.__init__  s    !r   c                     yrf  r&   r#   s    r   r$   z Xc16Linker.can_linker_accept_rsp  rg  r   c                
    | gS r   r&   r;   s     r   r=   zXc16Linker.get_output_args      (}r   c                    dgS )Nrcsr&   r#   s    r   rc   z!Xc16Linker.get_linker_always_args  s	    wr   rg   rj   rq   rm   rk  rH  s   @r   rm  rm    s    r   rm  c                  0     e Zd Zd fdZddZddZ xZS )CompCertLinkerc                2    t         |   |       d| _        y )Nccomprb  rc  s     r   r   zCompCertLinker.__init__  rd  r   c                     yrf  r&   r#   s    r   r$   z$CompCertLinker.can_linker_accept_rsp  rg  r   c                    d| gS Nz-or&   r;   s     r   r=   zCompCertLinker.get_output_args  s    VHr   rg   rj   rq   )ry   rz   r{   r   r$   r=   rG  rH  s   @r   ru  ru    s    r   ru  c                  8     e Zd Zd fdZddZddZddZ xZS )	TILinkerc                2    t         |   |       d| _        y )Nzti-arrb  rc  s     r   r   zTILinker.__init__  rd  r   c                     yrf  r&   r#   s    r   r$   zTILinker.can_linker_accept_rsp  rg  r   c                
    | gS r   r&   r;   s     r   r=   zTILinker.get_output_args  rq  r   c                    dgS )N-rr&   r#   s    r   rc   zTILinker.get_linker_always_args  s	    vr   rg   rj   rq   rm   rk  rH  s   @r   r|  r|    s    r   r|  c                      e Zd ZdZy)C2000Linkerar2000NrL  r&   r   r   r  r        	Br   r  c                      e Zd ZdZddgZy)AIXArLinkeraixarz-csrz-XanyN)ry   rz   r{   r   r;  r&   r   r   r  r    s    	B Hr   r  c                  ,    e Zd ZddZddZddZd	dZy)
MetrowerksStaticLinkerc                     yNTr&   r#   s    r   r$   z,MetrowerksStaticLinker.can_linker_accept_rsp   r]   r   c                    dgS )Nz-libraryr&   r#   s    r   rc   z-MetrowerksStaticLinker.get_linker_always_args  
    |r   c                
    d|gS rz  r&   r;   s     r   r=   z&MetrowerksStaticLinker.get_output_args      f~r   c                "    t         j                  S r   r   r#   s    r   rf   z&MetrowerksStaticLinker.rsp_file_syntax	         r   Nrj   rm   rq   rx   )ry   rz   r{   r$   rc   r=   rf   r&   r   r   r  r    s    !r   r  c                      e Zd ZdZy)MetrowerksStaticLinkerARMmwldarmNrL  r&   r   r   r  r        	Br   r  c                      e Zd ZdZy)%MetrowerksStaticLinkerEmbeddedPowerPCmwldeppcNrL  r&   r   r   r  r        	Br   r  c                Z    | D cg c]  }t        |||       }}t        |      }|S c c}w r   )evaluate_rpathorder_rpaths)
raw_rpathsrD   rE   pinternal_format_rpathsordered_rpathss         r   prepare_rpathsr    s:     OYYnQ	8DYY!"89N Zs   (c                L    t        | t        j                  j                        S )N)key)sortedosr   isabs)
rpath_lists    r   r  r    s     *"''--00r   c                   | |k(  ryt         j                  j                  |       r| S t         j                  j                  t         j                  j	                  ||       t         j                  j	                  ||            S r   )r  r   r  relpathr   )r  rD   rE   s      r   r  r  )  sU    H}	q	wwrww||Iq9277<<	S[;\]]r   c                  (    e Zd ZdZddZddZddZy)	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.
    c                
    d|gS rz  r&   r   s     r   r=   z'PosixDynamicLinkerMixin.get_output_args;      j!!r   c                    dgS )N-sharedr&   r#   s    r   r   z/PosixDynamicLinkerMixin.get_std_shared_lib_args>  s
    {r   c                    d|z   gS Nz-Lr&   r   s     r   r   z'PosixDynamicLinkerMixin.get_search_argsA  s    wr   Nr  rm   r  )ry   rz   r{   r  r=   r   r   r&   r   r   r  r  2  s    " r   r  c            
      *   e Zd ZU dZej
                  rej                  Zd$dZ	g g g dgg g dZ
ded<   ddd	d
dddddd	Zded<   d%dZd&dZd&dZd'dZd&dZd&dZd(dZd&dZd)dZd*dZd)dZd&dZd&dZ	 	 	 	 	 	 	 	 d+d Z	 	 	 	 	 	 	 	 d,d!Zd(d"Zy#)-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.
    c                     y r   r&   r   r   s     r   r   z'GnuLikeDynamicLinkerMixin._apply_prefixO      r   z-O1r   r   r   1windowsconsole71011121316)	nativer  r  posixefi_applicationefi_boot_service_driverefi_runtime_driverefi_romboot_applicationzT.Dict[str, str]_SUBSYSTEMSc                    t        j                  | j                  |   D cg c]  }| j                  |       c}      S c c}w r   r   listifyr   r   r   r8   as      r   r   z,GnuLikeDynamicLinkerMixin.get_buildtype_argsf  s:     @T@TU^@_ `1!3!3A!6 `aa `   A c                    dgS )Nz-pier&   r#   s    r   r   z&GnuLikeDynamicLinkerMixin.get_pie_argsk  rW  r   c                $    | j                  d      S )Nz--as-neededr   r#   s    r   r   z+GnuLikeDynamicLinkerMixin.get_asneeded_argsn  s    !!-00r   c                V    |s|S | j                  d      |z   | j                  d      z   S Nz--whole-archivez--no-whole-archiver  r   s     r   r   z,GnuLikeDynamicLinkerMixin.get_link_whole_forq  2    K!!"34t;d>P>PQe>fffr   c                $    | j                  d      S N--allow-shlib-undefinedr  r#   s    r   r   z2GnuLikeDynamicLinkerMixin.get_allow_undefined_argsv  s    !!";<<r   c                    dgS )Nz-fltor&   r#   s    r   r   z&GnuLikeDynamicLinkerMixin.get_lto_argsy  s
    yr   c                    |dk(  rg S d|z   gS Nnonez-fsanitize=r&   r   s     r   r   z(GnuLikeDynamicLinkerMixin.sanitizer_args|      F?I%&&r   c                    dgS Nz
--coverager&   r#   s    r   r   z+GnuLikeDynamicLinkerMixin.get_coverage_args  
    ~r   c                    |j                   | j                     }|j                         s|j                         r| j	                  d      S | j	                  d      S )Nz--export-all-symbolsz-export-dynamicrD  r   r"   	is_cygwinr   )r   r2   ms      r   r   z-GnuLikeDynamicLinkerMixin.export_dynamic_args  sK    LL))*<<>Q[[]%%&<==!!"344r   c                *    | j                  d|z         S )Nz--out-implib=r  r   s     r   r   z-GnuLikeDynamicLinkerMixin.import_library_args  s    !!/J">??r   c                Z    |j                   | j                     j                         rg S dgS Nz-pthread)rD  r   is_haikurL   s     r   r   z&GnuLikeDynamicLinkerMixin.thread_flags  s*    <<(()224I|r   c                $    | j                  d      S )Nz--no-undefinedr  r#   s    r   r   z+GnuLikeDynamicLinkerMixin.no_undefined_args  s    !!"233r   c                $    | j                  d      S )Nz--fatal-warningsr  r#   s    r   r   z(GnuLikeDynamicLinkerMixin.fatal_warnings  s    !!"455r   c                    |j                   | j                     }|j                         s|j                         rg S |dnd|z   }| j	                  d| | d| |       S Nr   .z-soname,r  )	r   r2   r   r   r   r   r   r  sostrs	            r   r   z)GnuLikeDynamicLinkerMixin.get_soname_args  sb    LL))*<<>Q[[]I'S9_!!HVHZL&%"QRRr   c           
        |j                   | j                     }|j                         s|j                         rg t	               fS |s|s|sg t	               fS g }d}	t        |||      }
t        j                  |
D cg c]"  }t        j                  j                  |	|      $ c}      }t	               }|D ]"  }|j                  |j                  d             $ |dk7  rG|j                  |       |j                  d      D ]"  }|j                  |j                  d             $ t        j                         st        j                         r |j!                  | j#                  d             dj                  |      }t%        |      t%        |      k  r'dt%        |      t%        |      z
  z  }|s|}n|dz   |z   }|j!                  | j#                  d|z                t        j&                         r||fS |D ]C  }|j!                  | j#                  dt        j                  j                  ||      z                E ||fS c c}w )	N$ORIGINutf8r   :z	-z,originX-rpath,z-rpath-link,)rD  r   r"   r  rB   r  r   
OrderedSetr  r   r   addencodesplitis_dragonflybsd
is_openbsdextendr   lenrF  )r   r2   rD   rE   rF   rG   rH   r  r   origin_placeholderprocessed_rpathsr  	all_pathsrpath_dirs_to_removepathspaddings                   r   rI   z*GnuLikeDynamicLinkerMixin.build_rpath_args  s    LL))*<<>Q[[];=;&)+y(K ''Vf(gQR6H!)L(gh	-0U 	7A $$QXXf%56	7 "MM+& &&s+ ;$((&)9:; ##%)<)<)> KK**;78 #u:M**S/#e*<=Gg-D&&y5'89: .//"  	YAKK**>BGGLLTU<V+VWX	Y *++i )hs   <'Ic                    d }d|v r|j                  dd      \  }}| j                  j                  |      }|||d| z  }d| g}nt        j                  d|d      | j                  |      S )N,r   r  --subsystem,win_subsystem: z: not handled in MinGW linker. This should not be possible.)r  r  getr   MesonBugExceptionr   )r   r   versionsuffixnewvaluer   s        r   r   z0GnuLikeDynamicLinkerMixin.get_win_subsystem_args  s     %<#(;;sA#6 E=##''.(a//"8*-.D,,ui  HB  .C  D  D!!$''r   Nr  rp   rm   ru   r  rt   r	  r
  rr   )ry   rz   r{   r  r8  TYPE_CHECKINGr   HOSTr   r   r   r|   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   rI   r   r&   r   r   r  r  E  s    	#((S 71O-  #'" 
%K! 
b
1g
='
5@
46S #S03SFWS\gSB,&7B,FIB,(+B,0RB,H(r   r  c                      e Zd ZdZdZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZddZddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZddZy)AppleDynamicLinkerzApple's ld implementation.ld64c                $    | j                  d      S )Nz-dead_strip_dylibsr  r#   s    r   r   z$AppleDynamicLinker.get_asneeded_args  s    !!"677r   c                $    | j                  d      S )N-undefined,dynamic_lookupr  r#   s    r   r   z+AppleDynamicLinker.get_allow_undefined_args  s    !!"=>>r   c                ,    dg| j                  d      z   S )Nz-bundler  r  r'   s     r   r   z-AppleDynamicLinker.get_std_shared_module_args  s    {T//0KLLLr   c                    g S r   r&   r#   s    r   r   zAppleDynamicLinker.get_pie_args  r5   r   c                z    g }|D ]3  }|j                  | j                  d             |j                  |       5 |S )Nz-force_load)r  r   append)r   r   resultr  s       r   r   z%AppleDynamicLinker.get_link_whole_for  s@      	AMM$,,];<MM!	 r   c                    dgS r  r&   r#   s    r   r   z$AppleDynamicLinker.get_coverage_args  r  r   c                    |dk(  rg S d|z   gS r  r&   r   s     r   r   z!AppleDynamicLinker.sanitizer_args  r  r   c                    g S r   r&   r#   s    r   r   z$AppleDynamicLinker.no_undefined_args  r   r   c                $    | j                  d      S )Nz-headerpad_max_install_namesr  r#   s    r   r   z!AppleDynamicLinker.headerpad_args%  s    !!"@AAr   c                $    | j                  d      S )Nz-bitcode_bundler  r#   s    r   r   zAppleDynamicLinker.bitcode_args(      !!"344r   c                $    | j                  d      S )Nz-fatal_warningsr  r#   s    r   r   z!AppleDynamicLinker.fatal_warnings+  r  r   c                    d||g}||j                  d|z          |j                  d       ddj                  |      g}|r|j                  d|d   d|d	   g       |S )
Nz@rpath/r  z.dylibz-install_namer   z-compatibility_versionr   z-current_versionr   )r  r   r  )	r   r2   r   r   r   r   r   install_namer   s	            r   r   z"AppleDynamicLinker.get_soname_args.  sv    !6:6 i0H%!67KK1?13E+_Q-?A Br   c           	     l   |s|s|sg t               fS g }d}t        |||      }	t        j                  |	D 
cg c]"  }
t        j
                  j                  ||
      $ c}
      }|dk7  r|j                  |       |D ]%  }|j                  | j                  d|z                ' |t               fS c c}
w )Nz@loader_pathr   r  
rB   r  r   r  r  r   r   r  r  r   r   r2   rD   rE   rF   rG   rH   r   r  r  r  r  rps                r   rI   z#AppleDynamicLinker.build_rpath_args:  s     =; ,)+y(K''Vf(gQR6H!)L(gh	"MM+& 	<BKK**9r>:;	< ce} )h   'B1c                    d|z   gS )Nz-Wl,-cache_path_lto,r&   r   s     r   r   z)AppleDynamicLinker.get_thinlto_cache_argsL  s    &-..r   Nrm   rl   ru   r  r
  rr   r  )ry   rz   r{   r  r   r   r   r   r   r   r   r   r   r   r   r   r   rI   r   r&   r   r   r  r    s    $	B8?M'
	B55
 #
03
FW
\g
&7FI(+0R$/r   r  c                      e Zd ZdZy)LLVMLD64DynamicLinkerzld64.lldNrL  r&   r   r   r'  r'  P  s    	Br   r'  c                      e Zd ZdZddZy)GnuDynamicLinkerz)Representation of GNU ld.bfd and ld.gold.c                     yr  r&   r#   s    r   r   z GnuDynamicLinker.get_accepts_rspY  r]   r   Nrj   )ry   rz   r{   r  r   r&   r   r   r)  r)  U  s
    3r   r)  c                      e Zd ZdZddZy)GnuGoldDynamicLinkerzld.goldc                    d|z   gS )Nz-Wl,-plugin-opt,cache-dir=r&   r   s     r   r   z+GnuGoldDynamicLinker.get_thinlto_cache_argsa  s    ,t344r   Nr  ry   rz   r{   r   r   r&   r   r   r,  r,  ]  s    	B5r   r,  c                      e Zd ZdZy)GnuBFDDynamicLinkerzld.bfdNrL  r&   r   r   r0  r0  e  r  r   r0  c                      e Zd ZdZddZy)MoldDynamicLinkerzld.moldc                    d|z   gS Nz-Wl,--thinlto-cache-dir=r&   r   s     r   r   z(MoldDynamicLinker.get_thinlto_cache_argsn      *T122r   Nr  r.  r&   r   r   r2  r2  j  s    	B3r   r2  c                  T     e Zd ZdZdZdd	 	 	 	 	 	 	 d	 fdZd
dZddZddZ x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   c                   t         |   |||||       t        j                  | j                  |z   | j                  d      z         \  }}}d|vxr d|v| _        y )Nr   r  z)unknown argument: --allow-shlib-undefinedz+unknown argument: '--allow-shlib-undefined')r9  r   r   r:  r   r   has_allow_shlib_undefined)	r   r   r   r   r   r   _erA  s	           r   r   zLLVMDynamicLinker.__init__|  sy     	+z;PWX %%dll[&@4CUCUVoCp&pq1a*U]^*^  *]  fS  [\  f\&r   c                @    | j                   r| j                  d      S g S r  )r9  r   r#   s    r   r   z*LLVMDynamicLinker.get_allow_undefined_args  s"    ))%%&?@@	r   c                    d|z   gS r4  r&   r   s     r   r   z(LLVMDynamicLinker.get_thinlto_cache_args  r5  r   c                    d }d|v r|j                  dd      \  }}|| j                  v r||d| z  }| j                  d| g      S t        j                  d| d      )Nr  r   r  r  r  z8 not handled in lld linker. This should not be possible.)r  r  r   r   r  )r   r   r   s      r   r   z(LLVMDynamicLinker.get_win_subsystem_args  s|    %<"[[a0NE7D$$$"1WI&%%eW'=&>??,,ugE}-~r   r  rm   r  r  )
ry   rz   r{   r  r   r   r   r   r   rG  rH  s   @r   r7  r7  r  sO     
B >O]4]B[])]7:]
3
@r   r7  c                  \    e Zd ZdZdZd	dZd	dZ	 	 	 	 	 	 	 	 d
dZd	dZ	 	 	 	 	 	 	 	 ddZ	y)WASMDynamicLinkerzEmscripten's wasm-ld.zld.wasmc                    dgS )Nz-sERROR_ON_UNDEFINED_SYMBOLS=0r&   r#   s    r   r   z*WASMDynamicLinker.get_allow_undefined_args      011r   c                    dgS )Nz-sERROR_ON_UNDEFINED_SYMBOLS=1r&   r#   s    r   r   z#WASMDynamicLinker.no_undefined_args  rB  r   c                2    t        | j                   d      Nz# does not support shared libraries.r
   r   r   s          r   r   z!WASMDynamicLinker.get_soname_args      y(KLMMr   c                    g S r   r&   r#   s    r   r   z#WASMDynamicLinker.get_asneeded_args  r5   r   c                    g t               fS r   rA   rC   s          r   rI   z"WASMDynamicLinker.build_rpath_args  rJ   r   Nrm   r
  rr   )
ry   rz   r{   r  r   r   r   r   r   rI   r&   r   r   r@  r@    sh    	B22N #N03NFWN\gN&7FI(+0Rr   r@  c                  x     e Zd ZdZdZdd	 d fdZddZddZddZdd	Z	dd
Z
ddZ	 	 	 	 	 	 	 	 ddZ xZS )CcrxDynamicLinkerz!Linker for Renesas CCrx compiler.ra  r   r   c               0    t         |   dg|dg |       y )Nz	rlink.exer   r   r9  r   r   r   r   rA  s      r   r   zCcrxDynamicLinker.__init__  s"    +R!( 	 	*r   c                     yrf  r&   r#   s    r   r   z!CcrxDynamicLinker.get_accepts_rsp  rg  r   c                     y)Nz-lib=r&   r#   s    r   r   z CcrxDynamicLinker.get_lib_prefix  s    r   c                    g S r   r&   r#   s    r   r   z)CcrxDynamicLinker.get_std_shared_lib_args  r5   r   c                    d| gS ri  r&   r   s     r   r=   z!CcrxDynamicLinker.get_output_args  s    :,'((r   c                    t        d      )Nz-rlink.exe does not have a search dir argumentOSErrorr   s     r   r   z!CcrxDynamicLinker.get_search_args  s    EFFr   c                    g S r   r&   r#   s    r   r   z*CcrxDynamicLinker.get_allow_undefined_args  r5   r   c                    g S r   r&   r   s          r   r   z!CcrxDynamicLinker.get_soname_args  r*   r   r   r  r   r   rj   r   rm   r  r   r   ri   'T.NoReturn'r
  )ry   rz   r{   r  r   r   r   r   r   r=   r   r   r   rG  rH  s   @r   rK  rK    sa    +	B $5* *
)G #03FW\gr   rK  c                       e Zd ZdZdZdd	 d fdZddZddZddZdd	Z	dd
Z
ddZddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZ xZS )Xc16DynamicLinkerz#Linker for Microchip XC16 compiler.xc16-gccr   r   c               0    t         |   dg|dg |       y )Nr]  r   r   rM  rN  s      r   r   zXc16DynamicLinker.__init__  s"    *{B!( 	 	*r   c                V    |s|S | j                  d      |z   | j                  d      z   S Nz--start-groupz--end-groupr  r   s     r   r   z$Xc16DynamicLinker.get_link_whole_for  0    K!!/2T9D<N<N}<]]]r   c                     yrf  r&   r#   s    r   r   z!Xc16DynamicLinker.get_accepts_rsp  rg  r   c                     yr   r&   r#   s    r   r   z Xc16DynamicLinker.get_lib_prefix  r   r   c                    g S r   r&   r#   s    r   r   z)Xc16DynamicLinker.get_std_shared_lib_args  r5   r   c                    d| gS rz  r&   r   s     r   r=   z!Xc16DynamicLinker.get_output_args      ZL!""r   c                    t        d      )Nz,xc16-gcc does not have a search dir argumentrT  r   s     r   r   z!Xc16DynamicLinker.get_search_args  s    DEEr   c                    g S r   r&   r#   s    r   r   z*Xc16DynamicLinker.get_allow_undefined_args  r5   r   c                    g S r   r&   r   s          r   r   z!Xc16DynamicLinker.get_soname_args  r*   r   c                    g t               fS r   rA   rC   s          r   rI   z"Xc16DynamicLinker.build_rpath_args  rJ   r   rX  ru   rj   r   rm   r  rY  r
  rr   ry   rz   r{   r  r   r   r   r   r   r   r=   r   r   r   rI   rG  rH  s   @r   r\  r\    s    -	B $5* *
^
#F #03FW\g&7FI(+0Rr   r\  c                       e Zd ZdZdZdd	 d fdZddZddZddZdd	Z	dd
Z
ddZddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZ xZS )CompCertDynamicLinkerzLinker for CompCert C compiler.rw  r   r   c               0    t         |   dg|dg |       y )Nrw  r   r   rM  rN  s      r   r   zCompCertDynamicLinker.__init__  s"    'KR!( 	 	*r   c                V    |s|S | j                  d      |z   | j                  d      z   S )Nz-Wl,--whole-archivez-Wl,--no-whole-archiver  r   s     r   r   z(CompCertDynamicLinker.get_link_whole_for  s2    K!!"784?$BTBTUmBnnnr   c                     yrf  r&   r#   s    r   r   z%CompCertDynamicLinker.get_accepts_rsp  rg  r   c                     yr   r&   r#   s    r   r   z$CompCertDynamicLinker.get_lib_prefix  r   r   c                    g S r   r&   r#   s    r   r   z-CompCertDynamicLinker.get_std_shared_lib_args  r5   r   c                    d| gS rz  r&   r   s     r   r=   z%CompCertDynamicLinker.get_output_args  rf  r   c                    d| gS r  r&   r   s     r   r   z%CompCertDynamicLinker.get_search_args  s    WIr   c                    g S r   r&   r#   s    r   r   z.CompCertDynamicLinker.get_allow_undefined_args   r5   r   c                2    t        | j                   d      rE  rF  r   s          r   r   z%CompCertDynamicLinker.get_soname_args#  rG  r   c                    g t               fS r   rA   rC   s          r   rI   z&CompCertDynamicLinker.build_rpath_args'  rJ   r   rX  ru   rj   r   rm   r  r  r
  rr   rk  rH  s   @r   rm  rm    s    )	B $5* *
o
# N #N03NFWN\gN&7FI(+0Rr   rm  c                  p     e Zd ZdZdZdd	 d fdZddZddZddZdd	Z	dd
Z
ddZddZddZ xZS )TIDynamicLinkerz-Linker for Texas Instruments compiler family.tir   r   c               .    t         |   ||dg |       y Nr   r   rM  r   r   r   r   rA  s       r   r   zTIDynamicLinker.__init__2       +r2!( 	 	*r   c                V    |s|S | j                  d      |z   | j                  d      z   S r`  r  r   s     r   r   z"TIDynamicLinker.get_link_whole_for7  ra  r   c                     yrf  r&   r#   s    r   r   zTIDynamicLinker.get_accepts_rsp<  rg  r   c                     y)Nz-l=r&   r#   s    r   r   zTIDynamicLinker.get_lib_prefix?  rg  r   c                    g S r   r&   r#   s    r   r   z'TIDynamicLinker.get_std_shared_lib_argsB  r5   r   c                    dd| gS )N-zz--output_file=r&   r   s     r   r=   zTIDynamicLinker.get_output_argsE  s    zl344r   c                    t        d      )Nz.TI compilers do not have a search dir argumentrT  r   s     r   r   zTIDynamicLinker.get_search_argsH  s    FGGr   c                    g S r   r&   r#   s    r   r   z(TIDynamicLinker.get_allow_undefined_argsK  r5   r   c                    g S r   r&   r#   s    r   ra   zTIDynamicLinker.get_always_argsN  r5   r   r   rh   r   r  r   r   ru   rj   r   rm   r  rY  )ry   rz   r{   r  r   r   r   r   r   r   r=   r   r   ra   rG  rH  s   @r   ry  ry  ,  sG    7	B $5* *
^
5Hr   ry  c                      e Zd ZdZy)C2000DynamicLinkercl2000NrL  r&   r   r   r  r  R  r  r   r  c                  H     e Zd ZdZdZdd	 d	 fdZd
dZddZddZ xZ	S )ArmDynamicLinkerzLinker for the ARM compiler.armlinkr   r   c               0    t         |   dg|dg |       y )Nr  r   r   rM  rN  s      r   r   zArmDynamicLinker.__init__]  s"    )k2r!( 	 	*r   c                     yrf  r&   r#   s    r   r   z ArmDynamicLinker.get_accepts_rspb  rg  r   c                    t        d      )Nz/The Arm Linkers do not support shared librariesr   r#   s    r   r   z(ArmDynamicLinker.get_std_shared_lib_argse  s    NOOr   c                    g S r   r&   r#   s    r   r   z)ArmDynamicLinker.get_allow_undefined_argsh  r5   r   rX  rj   )ri   rZ  rm   )
ry   rz   r{   r  r   r   r   r   r   rG  rH  s   @r   r  r  W  s-    &	B $5* *
Pr   r  c                       e Zd ZdZddZddZy)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.
    c                    dgS )Nz--export_dynamicr&   rL   s     r   r   z)ArmClangDynamicLinker.export_dynamic_argst  s    "##r   c                    d|z   gS )Nz
--symdefs=r&   r   s     r   r   z)ArmClangDynamicLinker.import_library_argsw  s    z)**r   Nrt   r	  )ry   rz   r{   r  r   r   r&   r   r   r  r  l  s    $+r   r  c                      e Zd ZdZdZy)QualcommLLVMDynamicLinkerz-ARM Linker from Snapdragon LLVM ARM Compiler.zld.qcldN)ry   rz   r{   r  r   r&   r   r   r  r  z  s
    7	Br   r  c                  <    e Zd ZdZdZ	 	 	 	 	 	 	 	 ddZddZddZy)	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
    nagc           	     l   |s|s|sg t               fS g }d}t        |||      }	t        j                  |	D 
cg c]"  }
t        j
                  j                  ||
      $ c}
      }|dk7  r|j                  |       |D ]%  }|j                  | j                  d|z                ' |t               fS c c}
w )Nr  r   z-Wl,-Wl,,-rpath,,r!  r"  s                r   rI   z!NAGDynamicLinker.build_rpath_args  s     =;&)+y(K''Vf(gQR6H!)L(gh	"MM+& 	FBKK**+>+CDE	F ce} )hr$  c                    g S r   r&   r#   s    r   r   z)NAGDynamicLinker.get_allow_undefined_args  r5   r   c                L    ddl m} |j                  | j                        dgz   S )Nr   )NAGFortranCompilerz-Wl,-shared)compilers.fortranr  get_nagfor_quietr   )r   r  s     r   r   z(NAGDynamicLinker.get_std_shared_lib_args  s!    :!224<<@M?RRr   Nrr   rm   )ry   rz   r{   r  r   rI   r   r   r&   r   r   r  r    s>     
B&7FI(+0R Sr   r  c                  T    e Zd ZdZdZddZ	 	 	 	 	 	 	 	 d	dZddZ	 	 	 	 	 	 	 	 d
dZy)PGIDynamicLinkerzPGI linker.pgic                    g S r   r&   r#   s    r   r   z)PGIDynamicLinker.get_allow_undefined_args  r5   r   c                    g S r   r&   r   s          r   r   z PGIDynamicLinker.get_soname_args  r*   r   c                d    t        j                         rddgS t        j                         rdgS g S )Nz	-Bdynamicz	-Mmakedllr  )r   r"   is_linuxr#   s    r   r   z(PGIDynamicLinker.get_std_shared_lib_args  s2     -- ;	r   c                    |j                   | j                     j                         s;|D cg c]%  }dt        j                  j                  ||      z   ' c}t               fS g t               fS c c}w )Nz-R)rD  r   r"   r  r   r   rB   )r   r2   rD   rE   rF   rG   rH   r  s           r   rI   z!PGIDynamicLinker.build_rpath_args  s]     ||D,,-88:@KL1TBGGLLA66LceTTCE{ Ms   *A/Nrm   r
  rr   )	ry   rz   r{   r  r   r   r   r   rI   r&   r   r   r  r    s^    	B #03FW\g&7FI(+0Rr   r  c                  0     e Zd Zd fdZddZddZ xZS )PGIStaticLinkerc                B    t         |   |       d| _        dg| _        y )Nr4  r  )r9  r   r   r;  rc  s     r   r   zPGIStaticLinker.__init__  s     !r   c                    | j                   S r   )r;  r1   s      r   r4   z!PGIStaticLinker.get_std_link_args  s    }}r   c                    |gS r   r&   r;   s     r   r=   zPGIStaticLinker.get_output_args  rW  r   rg   rn   rq   )ry   rz   r{   r   r4   r=   rG  rH  s   @r   r  r    s    
r   r  c                      e Zd ZU dZej
                  rej                  ZddZ	g g g dgddgg dZ
ded<   dd	d
d	 	 	 	 	 	 	 	 	 d fdZddZddZddZd fdZd dZddZd!dZd"dZd#dZddZ	 	 	 	 	 	 	 	 d$dZd%dZd&dZ xZS )'VisualStudioLikeLinkerMixinzCMixin class for dynamic linkers that act like Microsoft's link.exe.c                     y r   r&   r  s     r   r   z)VisualStudioLikeLinkerMixin._apply_prefix  r  r   z/OPT:REFz/INCREMENTAL:NOr   r   r   r   Tx86)r   directr   c               J    t         |   |||||       || _        || _        y )Nr   )r9  r   r   r  )	r   r   r   r   r   r   r  r   rA  s	           r   r   z$VisualStudioLikeLinkerMixin.__init__  s,     	+z;PWXr   c                    t        j                  | j                  |   D cg c]  }| j                  |       c}      S c c}w r   r  r  s      r   r   z.VisualStudioLikeLinkerMixin.get_buildtype_args  s8    @T@TU^@_ `1!3!3A!6 `aa `r  c                    | j                    S r   )r  r#   s    r   invoked_by_compilerz/VisualStudioLikeLinkerMixin.invoked_by_compiler  s    ;;r   c                H    | j                  d| j                  z   d|z   g      S r  )r   r   r   s     r   r=   z+VisualStudioLikeLinkerMixin.get_output_args  s&    !!;#=w?S"TUUr   c                H    t         |          }| j                  d      |z   S )Nz/nologo)r9  ra   r   )r   parentrA  s     r   ra   z+VisualStudioLikeLinkerMixin.get_always_args  s&    (*!!),v55r   c                *    | j                  d|z         S )Nz	/LIBPATH:r  r   s     r   r   z+VisualStudioLikeLinkerMixin.get_search_args  s    !!+"788r   c                $    | j                  d      S )Nz/DLLr  r#   s    r   r   z3VisualStudioLikeLinkerMixin.get_std_shared_lib_args  s    !!&))r   c                    |S r   r&   rZ   s     r   r   z.VisualStudioLikeLinkerMixin.get_debugfile_name  s    r   c                L    | j                  dd| j                  |      z   g      S )Nz/DEBUGz/PDB:)r   r   rZ   s     r   r   z.VisualStudioLikeLinkerMixin.get_debugfile_args  s(    !!8Wt7N7Nz7Z-Z"[\\r   c                    t        j                  |      }g }|D ]%  }|j                  | j                  d|z                ' |S )Nz/WHOLEARCHIVE:)r   r  r  r   )r   r   lr  s       r   r   z.VisualStudioLikeLinkerMixin.get_link_whole_for  sH    % 	?AHHT''(81(<=>	?r   c                    g S r   r&   r#   s    r   r   z4VisualStudioLikeLinkerMixin.get_allow_undefined_args  r5   r   c                    g S r   r&   r   s          r   r   z+VisualStudioLikeLinkerMixin.get_soname_args  r*   r   c                ,    | j                  d|z   g      S )z+The command to generate the import library.z/IMPLIB:r  r   s     r   r   z/VisualStudioLikeLinkerMixin.import_library_args  s    !!:
#:";<<r   c                "    t         j                  S r   r"  r#   s    r   rf   z+VisualStudioLikeLinkerMixin.rsp_file_syntax  r$  r   r  )r   rh   r   r  r   r  r   rh   r   r   r  rk   r   r   rp   rj   r  rm   r  )r[   r   ri   r   rw   ru   r
  r	  rx   )ry   rz   r{   r  r8  r
  r   r  r   r   r   r|   r   r   r  r=   ra   r   r   r   r   r   r   r   r   rf   rG  rH  s   @r   r  r    s    M#((S  <%z2	1O- 	 !2$W\6EP;?QTbV69*] #03FW\g="r   r  c                  \     e Zd ZdZdZdddddd	 	 	 	 	 	 	 	 	 d fd	Zd fd
ZddZ xZS )MSVCDynamicLinkerzMicrosoft's Link.exe.linkNr   r  r   Tr   r   r   r   r  c          	     <    t         |   |xs dg||||||       y )Nzlink.exer   r   r  rM  	r   r   r   r   r   r   r   r  rA  s	           r   r   zMSVCDynamicLinker.__init__%  s/    
 	0ZL+gwW] 	 	_r   c                F    | j                  dg      t        | 	         z   S )Nz/releaser   r9  ra   r   rA  s    r   ra   z!MSVCDynamicLinker.get_always_args-  s#    !!:,/%'2I2KKKr   c                H    | j                  d|j                          g      S Nz/SUBSYSTEM:r   upperr   s     r   r   z(MSVCDynamicLinker.get_win_subsystem_args0  #    !![#@"ABBr   r   r  r   rh   r   zT.Optional[T.List[str]]r   r  r   r   r   r   r  rk   rm   r  )	ry   rz   r{   r  r   r   ra   r   rG  rH  s   @r   r  r    sa    	B 5957 %6G $	_1_2_ _ 14_ 	_LCr   r  c                  d     e Zd ZdZdZdddddd	 	 	 	 	 	 	 	 	 d fd	Zd fd
ZddZddZ xZ	S )ClangClDynamicLinkerzClang's lld-link.exe.zlld-linkNr   r  r   Tr  c          	     <    t         |   |xs dg||||||       y )Nzlld-link.exer  rM  r  s	           r   r   zClangClDynamicLinker.__init__:  s0    
 	4^$4kgwW] 	 	_r   c                d    | j                   | j                  d| g      S t        |   |      S )Nr  )r   r   r9  r=   )r   r   rA  s     r   r=   z$ClangClDynamicLinker.get_output_argsB  s:     <<%%zl';&<==w&z22r   c                H    | j                  d|j                          g      S r  r  r   s     r   r   z+ClangClDynamicLinker.get_win_subsystem_argsJ  r  r   c                    d|z   gS )Nz/lldltocache:r&   r   s     r   r   z+ClangClDynamicLinker.get_thinlto_cache_argsM  s    $&''r   r  r  r  r  )
ry   rz   r{   r  r   r   r=   r   r   rG  rH  s   @r   r  r  4  se    	B 5957 %6G $	_1_2_ _ 14_ 	_3C(r   r  c                  P     e Zd ZdZdZdddddd	 	 	 	 	 	 	 	 	 d fd	Zdd
Z xZS )XilinkDynamicLinkerzIntel's Xilink.exe.xilinkNr   r  r   Tr  c               0    t         |   dg|d||       y )Nz
xilink.exer   r   rM  r  s	           r   r   zXilinkDynamicLinker.__init__W  s    
 	,b+wWr   c                H    | j                  d|j                          g      S r  r  r   s     r   r   z*XilinkDynamicLinker.get_win_subsystem_args^  r  r   r  r  )ry   rz   r{   r  r   r   r   rG  rH  s   @r   r  r  Q  s[    	B 5957 %6G $	X1X2X X 14X 	XCr   r  c                  t    e Zd ZdZdZddZddZddZddZddZ	ddZ
	 	 	 	 	 	 	 	 dd	Z	 	 	 	 	 	 	 	 dd
Zy)SolarisDynamicLinkerz5Sys-V derived linker used on Solaris and OpenSolaris.z
ld.solarisc                V    |s|S | j                  d      |z   | j                  d      z   S r  r  r   s     r   r   z'SolarisDynamicLinker.get_link_whole_forh  r  r   c                    t        j                  | j                  | j                  d      z         \  }}}||z   j	                  d      D ]  }d|v sd|v rddgc S  g S  g S )Nz-zhelp
z-z typepier  ztype=pie)r   r:  r   r   r  )r   pcr>  stdelines        r   r   z!SolarisDynamicLinker.get_pie_argsm  ss    !,,T\\D<N<Nx<X-XYD$D[''- 	DD D= *--		
 	r   c                (    | j                  ddg      S )Nr  ignorer  r#   s    r   r   z&SolarisDynamicLinker.get_asneeded_argsw  s    !!4"233r   c                
    ddgS )Nr  defsr&   r#   s    r   r   z&SolarisDynamicLinker.no_undefined_argsz  r  r   c                
    ddgS )Nr  nodefsr&   r#   s    r   r   z-SolarisDynamicLinker.get_allow_undefined_args}  s    hr   c                
    ddgS )Nr  zfatal-warningsr&   r#   s    r   r   z#SolarisDynamicLinker.fatal_warnings  s    &''r   c           	        |s|s|sg t               fS t        |||      }t        j                  |D cg c]"  }t        j
                  j                  d|      $ c}      }	t               }
|	D ]"  }|
j                  |j                  d             $ |dk7  rG|	j                  |       |j                  d      D ]"  }|
j                  |j                  d             $ dj                  |	      }t        |      t        |      k  r'dt        |      t        |      z
  z  }|s|}n|dz   |z   }| j                  d|       |
fS c c}w )Nr  r  r   r  r  r  )rB   r  r   r  r  r   r   r  r  r  r  r   )r   r2   rD   rE   rF   rG   rH   r  r  r  r  r   r  s                r   rI   z%SolarisDynamicLinker.build_rpath_args  s7    =;)+y(K''M](^i)C(^_	-0U 	7A $$QXXf%56	7"MM+& &&s+ ;$((&)9:;
 #u:M**S/#e*<=Gg-""WUG#457KLL% )_s   'Ec                J    |dnd|z   }| j                  d| | d| |       S r  r  )r   r2   r   r   r   r   r   r  s           r   r   z$SolarisDynamicLinker.get_soname_args  s8    'S9_!!HVHZL&%"QRRr   Nru   rm   rr   r
  )ry   rz   r{   r  r   r   r   r   r   r   r   rI   r   r&   r   r   r  r  b  s}    ?	Bg
4 (M&7MFIM(+M0RM4S #S03SFWS\gSr   r  c                  p     e Zd ZdZdZd fdZddZddZddZddZ	ddZ
	 	 	 	 	 	 	 	 dd	Zdd
Z xZS )AIXDynamicLinkerz Sys-V derived linker used on AIXzld.aixc                H    | j                  ddg      t        | 	         z   S )Nz	-bnoipathz-bbigtocr  r  s    r   ra   z AIXDynamicLinker.get_always_args  s&    !!;
";<uw?V?XXXr   c                &    | j                  dg      S )Nz	-bernotokr  r#   s    r   r   z"AIXDynamicLinker.no_undefined_args  s    !!;-00r   c                &    | j                  dg      S )Nz-berokr  r#   s    r   r   z)AIXDynamicLinker.get_allow_undefined_args  s    !!8*--r   c                T    t        j                  dd|j                  dd            }|S )Nz$[.][a]([.]?([0-9]+))*([.]?([a-z]+))*z.az.so)resubreplacer   s     r   r   z!AIXDynamicLinker.get_archive_name  s+     66@$HXHXY^`dHefr   c                    g d}|S )N)	r4  z-qz-vz$out$inz&&rmz-fr  r&   )r   commands     r   r   z-AIXDynamicLinker.get_command_to_archive_shlib  s     Mr   c                    |S r   r&   r   s     r   r   z#AIXDynamicLinker.get_link_whole_for  s	     r   c                2   t        j                         }|dk7  r|j                  |       |dk7  r|j                  |       |D ]1  }|j                  t        j                  j                  ||             3 |j                  | j                        }	t        |	      dk(  r|j                  ddg       n8|	D ]3  }t        j                  j                  |      s#|j                  |       5 | j                  ddj                  |      z         t               fS )Nr   r   z/usr/libz/libz
-blibpath:r  )r   r  r  r  r   r   get_compiler_system_lib_dirsr   r  updateisdirr   rB   )
r   r2   rD   rE   rF   rG   rH   r  r  sys_paths
             r   rI   z!AIXDynamicLinker.build_rpath_args  s     /7.A.A.C	BMM-("MM+& 	6AMM"'',,y!45	6 33D4D4DEx=A j&12  %77==#MM!$% ""<#((92E#EFNNr   c                    dgS r  r&   rL   s     r   r   zAIXDynamicLinker.thread_flags  r  r   rm   r  ru   rr   rt   )ry   rz   r{   r  r   ra   r   r   r   r   r   rI   r   rG  rH  s   @r   r  r    sY    *	BY1.O&7OFIO(+O0RO2r   r  c                  H     e Zd ZdZdZdd	 d	 fdZd
dZddZd
dZ xZ	S )OptlinkDynamicLinkerz(Digital Mars dynamic linker for windows.optlinkr   r   c               .    t         |   ||dg |       y r|  rM  r}  s       r   r   zOptlinkDynamicLinker.__init__  s     	+r2wGr   c                    g S r   r&   r#   s    r   r   z-OptlinkDynamicLinker.get_allow_undefined_args  r5   r   c                    g S r   r&   rZ   s     r   r   z'OptlinkDynamicLinker.get_debugfile_args  r*   r   c                    g S r   r&   r#   s    r   ra   z$OptlinkDynamicLinker.get_always_args  r5   r   r  rm   rw   )
ry   rz   r{   r  r   r   r   r   ra   rG  rH  s   @r   r  r    s.    2	B $5H Hr   r  c                  ^    e Zd ZdZdZed
d       ZddZd
dZddZ	ddZ
	 	 	 	 	 	 	 	 ddZy	)
CudaLinkerzCuda linker (nvlink)nvlinkc                     ddg} 	 t        j                  |       \  }}}|j                         j	                  dd      d   S # t        $ r Y yw xY w)Nr  z	--versionr   Vr   )maxsplit)r   r:  rU  striprsplit)version_cmdr:  outs      r   parse_versionzCudaLinker.parse_version   s^    -	% ++K8IAsA yy{!!#!2266  	%$	%s   A 	AAc                     yrf  r&   r#   s    r   r   zCudaLinker.get_accepts_rsp  s    r   c                &    ddl m} |j                  S )Nr   )CudaCompiler)compilers.cudar  LINKER_PREFIX)r   r  s     r   r   zCudaLinker.get_lib_prefix  s     	2)))r   c                    dgS )Nz--warning-as-errorr&   r#   s    r   r   zCudaLinker.fatal_warnings$  s    $%%r   c                    g S r   r&   r#   s    r   r   z#CudaLinker.get_allow_undefined_args'  r5   r   c                    g S r   r&   r   s          r   r   zCudaLinker.get_soname_args*  r*   r   Nr   rj   rm   r
  )ry   rz   r{   r  r   staticmethodr  r   r   r   r   r   r&   r   r   r  r    sU    	B7 7*"& #03FW\gr   r  c                  p     e Zd Zdd	 d fdZddZddZddZddZddZdd	Z	dd
Z
ddZddZ xZS )MetrowerksLinkerr   r   c               .    t         |   ||dg |       y r|  rM  r}  s       r   r   zMetrowerksLinker.__init__1  r~  r   c                
    ddgS )Nz-werrorr&   r#   s    r   r   zMetrowerksLinker.fatal_warnings6  s    gr   c                    g S r   r&   r#   s    r   r   z)MetrowerksLinker.get_allow_undefined_args9  r5   r   c                     yr  r&   r#   s    r   r   z MetrowerksLinker.get_accepts_rsp<  r]   r   c                     yr   r&   r#   s    r   r   zMetrowerksLinker.get_lib_prefix?  r   r   c                    g S r   r&   r#   s    r   rc   z'MetrowerksLinker.get_linker_always_argsB  r5   r   c                
    d|gS rz  r&   r   s     r   r=   z MetrowerksLinker.get_output_argsE  r  r   c                *    | j                  d|z         S r  r  r   s     r   r   z MetrowerksLinker.get_search_argsH  s    !!$.11r   c                     yrf  r&   r#   s    r   r  z$MetrowerksLinker.invoked_by_compilerK  rg  r   c                "    t         j                  S r   r   r#   s    r   rf   z MetrowerksLinker.rsp_file_syntaxN  r  r   r  rm   rj   r   r  r  rx   )ry   rz   r{   r   r   r   r   r   rc   r=   r   r  rf   rG  rH  s   @r   r#  r#  /  sB     $5* *
"2!r   r#  c                      e Zd ZdZy)MetrowerksLinkerARMr  NrL  r&   r   r   r0  r0  R  r  r   r0  c                      e Zd ZdZy)MetrowerksLinkerEmbeddedPowerPCr  NrL  r&   r   r   r2  r2  V  r  r   r2  )r  rs   rD   r   rE   r   ri   rh   )r  rh   ri   rh   )r  r   rD   r   rE   r   ri   r   )Q
__future__r   r  r  typingr8  r  baser   r   r   r   r	   r
   arglistr   r
  coredatar   environmentr   r   r   ABCMetar   StaticLinkerBaseDynamicLinkerBaseobjectr  r&  r/  r3  rJ  rN  rQ  r_  rm  ru  r|  r  r  r  r  r  r  r  r  r  r  r  r'  r)  r,  r0  r2  r7  r@  rK  r\  rm  ry  r  r  r  r  r  r  NvidiaHPC_DynamicLinkerr  NvidiaHPC_StaticLinkerr  r  r  r  r  r  r  r  r#  r0  r2  r&   r   r   <module>r?     sA   # 
 	  	 -  ; "??.)(Mj Mj`Ackk AH ??#%+11("- "B7/ 774l 7!|\ !BH , !l !4, ,  
\ 
|  ( 
!, !
!\ ! 6 ,B 	1^ /  &q( 1 q(hT/0- T/n. 
02I= 5+ 5* 
3( 3&@13JM &@R13JM 2 D) )V)M )V#m #L 
. *+, + 1 "S. "SJ. 8 + 
l 
 ) H""3 H"VC3] C*(6 (:C5} C">S2M >SB>. >B6 .1(- 1h !}  !F* &6 r   