
][\~5                 @   s   d  Z  d d l Z d d l Z d d l Z d d l m Z d d l m Z d d l m	 Z	 m
 Z
 m Z d d l m Z m Z m Z m Z d d l m Z e j d k r d d l Z n  Gd	 d
   d
 e	  Z d S)a9  distutils.unixccompiler

Contains the UnixCCompiler class, a subclass of CCompiler that handles
the "typical" Unix-style command-line C compiler:
  * macros defined with -Dname[=value]
  * macros undefined with -Uname
  * include search directories specified with -Idir
  * libraries specified with -lllib
  * library search directories specified with -Ldir
  * compile handled by 'cc' (or similar) executable with -c option:
    compiles .c to .o
  * link static library handled by 'ar' command (possibly with 'ranlib')
  * link shared library handled by 'cc -shared'
    N)	sysconfig)newer)	CCompilergen_preprocess_optionsgen_lib_options)DistutilsExecErrorCompileErrorLibError	LinkError)logdarwinc               @   s  e  Z d  Z d Z i d d 6d g d 6d g d 6d g d 6d d g d	 6d g d
 6d d g d 6d d 6Z e j d d  d k r d g e d <n  d d d d d d g Z d Z d Z	 d Z
 d Z d Z Z Z e j d k r d Z n  d d d d d d d  Z d  d!   Z d d" d d# d$  Z d d d d d d" d d d d d% d& 
 Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d" d/ d0  Z d S)1UnixCCompilerZunixNpreprocessorZcccompilercompiler_socompiler_cxxz-shared	linker_so
linker_exeZarz-crarchiverranlib   r   z.cz.Cz.ccz.cxxz.cppz.mz.oz.az.soz.dylibzlib%s%scygwinz.exec             C   s*  |  j  d  | |  } | \ } } } t | |  }	 |  j |	 }
 | r\ |
 j d | g  n  | ru | |
 d  d  <n  | r |
 j |  n  |
 j |  |  j s | d  k s t | |  r&| r |  j t j	 j
 |   n  y |  j |
  Wq&t k
 r"} z t |   WYd  d  } ~ Xq&Xn  d  S)Nz-or   )Z_fix_compile_argsr   r   extendappendZforcer   mkpathospathdirnamespawnr   r   )selfsourceZoutput_fileZmacrosZinclude_dirsextra_preargsextra_postargs
fixed_argsignorepp_optsZpp_argsmsg r'   -/usr/lib/python3.4/distutils/unixccompiler.py
preprocessS   s$    $zUnixCCompiler.preprocessc       	      C   s   |  j  } t j d k r1 t j | | |  } n  y& |  j | | | d | g |  Wn1 t k
 r } z t |   WYd  d  } ~ Xn Xd  S)Nr   z-o)r   sysplatform_osx_supportcompiler_fixupr   r   r   )	r   objsrcZextZcc_argsr"   r%   r   r&   r'   r'   r(   _compilem   s    		zUnixCCompiler._compiler   c             C   s   |  j  | |  \ } } |  j | d | } |  j | |  r |  j t j j |   |  j |  j | g | |  j	  |  j
 r y |  j |  j
 | g  Wq t k
 r } z t |   WYd  d  } ~ Xq Xq n t j d |  d  S)N
output_dirzskipping %s (up-to-date))_fix_object_argslibrary_filename
_need_linkr   r   r   r   r   r   objectsr   r   r	   r   debug)r   r5   Zoutput_libnamer1   r6   target_langoutput_filenamer&   r'   r'   r(   create_static_libx   s    	%zUnixCCompiler.create_static_libc                s  |  j  | |  \ } } |  j | | |  } | \ } } } d d d d g   t j d  } | r   j d | d | g  n    f d d	   | D }   f d
 d	   | D } t |  | | |  } t | t t d   f  s t	 d   n  | d  k	 rt
 j j | |  } n  |  j | |  r| |  j | d | g } |	 r_d g | d  d  <n  |
 rx|
 | d  d  <n  | r| j |  n  |  j t
 j j |   y | t j k r|  j d  d   } n |  j d  d   } | d k rW|  j rWd } t
 j j | d  d k rCd } x! d | | k r?| d 7} q"Wn  |  j | | | <n  t j d k r{t j | |  } n  |  j | |  Wqt k
 r} z t |   WYd  d  } ~ XqXn t j d |  d  S)Nz/libz/lib64z/usr/libz
/usr/lib64Z	MULTIARCHz/lib/%sz/usr/lib/%sc                s"   g  |  ] } |   k r |  q Sr'   r'   ).0dir)system_libdirsr'   r(   
<listcomp>   s   	 z&UnixCCompiler.link.<locals>.<listcomp>c                s"   g  |  ] } |   k r |  q Sr'   r'   )r:   r;   )r<   r'   r(   r=      s   	 z%'output_dir' must be a string or Nonez-oz-gr   zc++env   =r   zskipping %s (up-to-date)) r2   Z_fix_lib_argsr   get_config_varr   r   
isinstancestrtype	TypeErrorr   r   joinr4   r5   r   r   r   Z
EXECUTABLEr   r   r   basenamer*   r+   r,   r-   r   r   r
   r   r6   )r   Ztarget_descr5   r8   r1   Z	librariesZlibrary_dirsZruntime_library_dirsZexport_symbolsr6   r!   r"   Z
build_tempr7   r#   Z	multiarchZlib_optsZld_argsZlinkerir&   r'   )r<   r(   link   sT    		"zUnixCCompiler.linkc             C   s   d | S)Nz-Lr'   )r   r;   r'   r'   r(   library_dir_option   s    z UnixCCompiler.library_dir_optionc             C   s   d | k p d | k S)NZgcczg++r'   )r   Zcompiler_namer'   r'   r(   _is_gcc   s    zUnixCCompiler._is_gccc             C   s   t  j j t j d   } t j d  d  d k r< d | St j d  d  d k r |  j |  rr d d | g Sd d | g St j d  d	  d
 k s t j d  d  d k r d | g S|  j |  r t j d  d k r d | Sd | Sn d | Sd  S)NZCCr   r   z-L   zhp-uxz-Wl,+sz+s   Zirix646Zosf1V5z-rpathZGNULDZyesz-Wl,--enable-new-dtags,-Rz-Wl,-Rz-R)r   r   rG   r   rA   r*   r+   rK   )r   r;   r   r'   r'   r(   runtime_library_dir_option   s    2
z(UnixCCompiler.runtime_library_dir_optionc             C   s   d | S)Nz-lr'   )r   libr'   r'   r(   library_option  s    zUnixCCompiler.library_optionc             C   s  |  j  | d d } |  j  | d d } |  j  | d d } t j d k r t j d  } t j d |  } | d  k r d }	 q | j d	  }	 n  x5| D]-}
 t j	 j
 |
 |  } t j	 j
 |
 |  } t j	 j
 |
 |  } t j d k r|
 j d
  s|
 j d  r|
 j d  rt j	 j
 |	 |
 d	 d   |  } t j	 j
 |	 |
 d	 d   |  } t j	 j
 |	 |
 d	 d   |  } n  t j	 j |  r| St j	 j |  r| St j	 j |  r | Sq Wd  S)NZlib_typeshareddylibstaticr   ZCFLAGSz-isysroot\s+(\S+)/r?   z/System/z/usr/z/usr/local/)r3   r*   r+   r   rA   researchgroupr   r   rF   
startswithexists)r   dirsrO   r6   Zshared_fZdylib_fZstatic_fZcflagsmZsysrootr;   rQ   rR   rS   r'   r'   r(   find_library_file
  s4    	""%zUnixCCompiler.find_library_file)__name__
__module____qualname__Zcompiler_typeZexecutablesr*   r+   Zsrc_extensionsZobj_extensionZstatic_lib_extensionZshared_lib_extensionZdylib_lib_extensionZstatic_lib_formatZshared_lib_formatZdylib_lib_formatZexe_extensionr)   r0   r9   rI   rJ   rK   rN   rP   r\   r'   r'   r'   r(   r   -   s@   





		A*r   )__doc__r   r*   rU   Z	distutilsr   Zdistutils.dep_utilr   Zdistutils.ccompilerr   r   r   Zdistutils.errorsr   r   r	   r
   r   r+   r,   r   r'   r'   r'   r(   <module>   s   $"