
bc           @   s/  d  Z  d Z d d l Z d d l Z d d l Z d d l Z d d l Td d l m Z m	 Z	 d d l
 m Z d d l Td d l m Z m Z d d l m Z d d	 l m Z d d
 l m Z d d l m Z e j d k r d d l m Z e e    Z n  e j d  Z d   Z d e f d     YZ  d S(   s   distutils.command.build_ext

Implements the Distutils 'build_ext' command, for building extension
modules (currently limited to C extensions, should accommodate C++
extensions ASAP).s   $Id$iN(   t   *(   t	   USER_BASEt	   USER_SITE(   t   Command(   t   customize_compilert   get_python_version(   t   newer_group(   t	   Extension(   t   get_platform(   t   logt   nt(   t   get_build_versions3   ^[a-zA-Z_][a-zA-Z_0-9]*(\.[a-zA-Z_][a-zA-Z_0-9]*)*$c          C   s   d d l  m }  |    d  S(   Ni(   t   show_compilers(   t   distutils.ccompilerR   (   R   (    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR       s    t	   build_extc           B   s?  e  Z d  Z d e j Z dF dG d d	 d
 e   f d d d d f d d d e f dH dI dJ d d d e f dK dL dM dN dO dQ dR dS dT g Z d d$ d' d- d3 g Z	 d5 dP d6 e
 f g Z d7   Z d8   Z d9   Z d:   Z d;   Z d<   Z d=   Z d>   Z d?   Z d@   Z dA   Z dB   Z dC   Z dD   Z dE   Z RS(U   s8   build C/C++ extensions (compile/link to build directory)s    (separated by '%s')s
   build-lib=t   bs(   directory for compiled extension moduless   build-temp=t   ts1   directory for temporary files (build by-products)s
   plat-name=t   ps>   platform name to cross-compile for, if supported (default: %s)t   inplacet   is=   ignore build-lib and put compiled extensions into the source s,   directory alongside your pure Python moduless   include-dirs=t   Is.   list of directories to search for header filess   define=t   Ds   C preprocessor macros to defines   undef=t   Us!   C preprocessor macros to undefines
   libraries=t   ls!   external C libraries to link withs   library-dirs=t   Ls.   directories to search for external C librariess   rpath=t   Rs7   directories to search for shared C libraries at runtimes   link-objects=t   Os2   extra explicit link objects to include in the linkt   debugt   gs'   compile/link with debugging informationt   forcet   fs2   forcibly build everything (ignore file timestamps)s	   compiler=t   cs   specify the compiler types   swig-cpps)   make SWIG create C++ files (default is C)s
   swig-opts=s!   list of SWIG command line optionss   swig=s   path to the SWIG executablet   users#   add user include, library and rpaths   help-compilers   list available compilersc         C   s   d  |  _ d  |  _ d  |  _ d  |  _ d |  _ d  |  _ d  |  _ d  |  _ d  |  _	 d  |  _
 d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  S(   Ni    (   t   Nonet
   extensionst	   build_libt	   plat_namet
   build_tempR   t   packaget   include_dirst   definet   undeft	   librariest   library_dirst   rpatht   link_objectsR   R   t   compilert   swigt   swig_cppt	   swig_optsR    (   t   self(    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyt   initialize_optionsl   s(    																			c   
   	   C   s  d d l  m } |  j d d. d/ d0 d1 d2 d3  |  j d  k rP |  j j |  _ n  |  j j |  _ | j	   } | j	 d
 d  } |  j
 d  k r |  j j
 p g  |  _
 n  t |  j
 t  r |  j
 j t j  |  _
 n  |  j
 j |  | | k r |  j
 j |  n  |  j d  |  j d  |  j d  k r5g  |  _ n  |  j d  k rPg  |  _ n3 t |  j  t k rt j |  j t j  |  _ n  |  j d  k rg  |  _ n3 t |  j  t k rt j |  j t j  |  _ n  t j d k r|  j j t j j t j d   |  j r)t j j |  j d  |  _ n t j j |  j d  |  _ |  j
 j t j j t j d   t d k r|  j  d k rd } n |  j  d } x d4 d5 f D]L } t j j t j |  } | rt j j | |  } n  |  j j |  qWqt d k r+|  j j t j j t j d d   qt d k r_|  j j t j j t j d d   q|  j j t j j t j d d   n  t j d k r|  j j t j j t j d   n  t j! d   d! k st j! d   d" k rJt j" j# t j j t j d#   r7|  j j t j j t j$ d$ d% t%   d&   qJ|  j j d'  n  t& r| j' d(  r| j( s|  j j | j' d)   q|  j j d'  n  |  j) r|  j) j d*  } t* d+   |  |  _) n  |  j+ r|  j+ j d*  |  _+ n  |  j, d  k rg  |  _, n |  j, j d,  |  _, |  j- rt j j t. d-  } t j j t. d$  }	 t j j/ |  rs|  j
 j |  n  t j j/ |	  r|  j j |	  |  j j |	  qn  d  S(6   Ni(   t	   sysconfigt   buildR#   R%   R.   R   R   R$   t   plat_specifici   R*   R-   R
   t   libst   Debugt   Releaset   PCi	   t   win32t    i   t   PCbuilds   VS9.0i   s   VS8.0i   s   VS7.1t   VC6t   os2t   Configi   t   cygwint   atheost   bint   libt   pythont   configt   .t   Py_ENABLE_SHAREDt   LIBDIRt   ,c         S   s
   |  d f S(   Nt   1(    (   t   symbol(    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyt   <lambda>   R<   t    t   include(   R#   R#   (   R%   R%   (   R.   R.   (   R   R   (   R   R   (   R$   R$   (   R=   (   R:   s   VS9.0(0   t	   distutilsR4   t   set_undefined_optionsR&   R!   t   distributiont   ext_packaget   ext_modulesR"   t   get_python_incR'   t
   isinstancet   strt   splitt   ost   pathsept   appendt   ensure_string_listR*   R+   t   typet
   StringTypet   stringR,   t   namet   patht   joint   syst   exec_prefixR   R%   t   MSVC_VERSIONR$   t   platformt
   executablet
   startswitht   prefixR   t   Falset   get_config_vart   python_buildR(   t   mapR)   R1   R    R   t   isdir(
   R2   R4   t
   py_includet   plat_py_includet   suffixt   dt   new_libt   definest   user_includet   user_lib(    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyt   finalize_options   s    	"	"	%&$
				c      	   C   s  d d l  m } |  j s d  S|  j j   rm |  j d  } |  j j | j   pS g   |  j	 j
 | j  n  | d |  j d |  j d |  j d |  j  |  _ t |  j  t j d k r |  j t   k r |  j j |  j  n  |  j d  k	 r|  j j |  j  n  |  j d  k	 rEx- |  j D] \ } } |  j j | |  qWn  |  j d  k	 r{x$ |  j D] } |  j j |  q^Wn  |  j d  k	 r|  j j |  j  n  |  j	 d  k	 r|  j j |  j	  n  |  j d  k	 r|  j j  |  j  n  |  j! d  k	 r|  j j" |  j!  n  |  j#   d  S(	   Ni(   t   new_compilert
   build_clibR.   t   verboset   dry_runR   R
   ($   R   Rx   R"   RR   t   has_c_librariest   get_finalized_commandR*   t   extendt   get_library_namesR+   R[   Ry   R.   Rz   R{   R   R   RY   R`   R$   R   t
   initializeR'   R!   t   set_include_dirsR(   t   define_macroR)   t   undefine_macrot   set_librariest   set_library_dirsR,   t   set_runtime_library_dirsR-   t   set_link_objectst   build_extensions(   R2   Rx   Ry   R`   t   valuet   macro(    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyt   run  s>    			!c   
      C   s!  t  | t  s t d  n  xt |  D]\ } } t  | t  rI q( n  t  | t  sk t |  d k rw t d  n  | \ } } t j d |  t  | t	  o t
 j |  s t d  n  t  | t  s t d  n  t | | d  } x< d D]4 } | j |  } | d k	 r t | | |  q q W| j d  | _ d | k rYt j d  n  | j d  } | rg  | _ g  | _ x | D] }	 t  |	 t  ot |	  d k st d  n  t |	  d k r| j j |	 d  qt |	  d k r| j j |	  qqWn  | | | <q( Wd S(   s  Ensure that the list of extensions (presumably provided as a
        command option 'extensions') is valid, i.e. it is a list of
        Extension objects.  We also support the old-style list of 2-tuples,
        where the tuples are (ext_name, build_info), which are converted to
        Extension instances here.

        Raise DistutilsSetupError if the structure is invalid anywhere;
        just returns otherwise.
        s:   'ext_modules' option must be a list of Extension instancesi   sM   each element of 'ext_modules' option must be an Extension instance or 2-tuplesv   old-style (ext_name, build_info) tuple found in ext_modules for extension '%s' -- please convert to Extension instancesR   first element of each tuple in 'ext_modules' must be the extension name (a string)sO   second element of each tuple in 'ext_modules' must be a dictionary (build info)t   sourcesR'   R+   R*   t   extra_objectst   extra_compile_argst   extra_link_argsR,   t   def_files9   'def_file' element of build info dict no longer supportedt   macrosi   s9   'macros' element of build info dict must be 1- or 2-tuplei    N(   R'   R+   R*   R   R   R   (   i   i   (   RV   t   listt   DistutilsSetupErrort	   enumerateR   t   tuplet   lenR	   t   warnRW   t   extension_name_ret   matcht   dictt   getR!   t   setattrt   runtime_library_dirst   define_macrost   undef_macrosR[   (
   R2   R"   R   t   extt   ext_namet
   build_infot   keyt   valR   R   (    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyt   check_extensions_listV  sT    
	"				 
		!	c         C   s>   |  j  |  j  g  } x! |  j D] } | j | j  q  W| S(   N(   R   R"   R~   R   (   R2   t	   filenamesR   (    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyt   get_source_files  s
    c         C   sG   |  j  |  j  g  } x* |  j D] } | j |  j | j   q  W| S(   N(   R   R"   R[   t   get_ext_fullpathR`   (   R2   t   outputsR   (    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyt   get_outputs  s
    c         C   s5   |  j  |  j  x |  j D] } |  j |  q Wd  S(   N(   R   R"   t   build_extension(   R2   R   (    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR     s    c   
      C   s  | j  } | d  k s- t |  t t f k rH t d d d | j  n  t |  } |  j | j  } | | j	 } |  j
 p t | | d  s t j d | j  d  St j d | j  |  j | |  } | j p g  } | j } x! | j D] } | j | f  q W|  j j | d |  j d | d	 | j d
 |  j d | d | j	 } | |  _ | j ro| j | j  n  | j p{g  } | j p|  j j |  }	 |  j j | | d |  j |  d | j  d | j! d | d |  j" |  d
 |  j d |  j d |	 d  S(   Ns*   in 'ext_modules' option (extension '%s'), s&   'sources' must be present and must be s   a list of source filenamest   newers$   skipping '%s' extension (up-to-date)s   building '%s' extensiont
   output_dirR   R'   R   t   extra_postargst   dependsR*   R+   R   t   export_symbolsR%   t   target_lang(#   R   R!   R]   t   ListTypet	   TupleTypeR   R`   R   R   R   R   R   R	   R   t   infot   swig_sourcesR   R   R   R[   R.   t   compileR%   R'   t   _built_objectsR   R~   R   t   languaget   detect_languaget   link_shared_objectt   get_librariesR+   R   t   get_export_symbols(
   R2   R   R   t   ext_pathR   t
   extra_argsR   R)   t   objectsR   (    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR     sN    	$
			
							c         C   s  g  } g  } i  } |  j  r+ t j d  n  |  j  sR d |  j k sR d | j k r[ d } n d } xr | D]j } t j j |  \ } }	 |	 d k r | j | d |  | j |  | d | | <qh | j |  qh W| s | S|  j p |  j	   }
 |
 d g } | j
 |  j  |  j  r*| j d  n  |  j sWx! | j D] } | j |  q=Wn  xE | D]= } | | } t j d	 | |  |  j | d
 | | g  q^W| S(   s   Walk the list of source files in 'sources', looking for SWIG
        interface (.i) files.  Run SWIG on all that are found, and
        return a modified 'sources' list with SWIG source files replaced
        by the generated C (or C++) files.
        s/   --swig-cpp is deprecated - use --swig-opts=-c++s   -c++s   .cpps   .cs   .it   _wrapis   -pythons   swigging %s to %ss   -o(   R0   R	   R   R1   RY   Ra   t   splitextR[   R/   t	   find_swigR~   R   t   spawn(   R2   R   t	   extensiont   new_sourcesR   t   swig_targetst
   target_extt   sourcet   baseR   R/   t   swig_cmdt   ot   target(    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR     s>    				
c         C   s   t  j d k r d St  j d k ri xg d D]5 } t  j j d | d  } t  j j |  r) | Sq) Wd Sn# t  j d	 k r| d St d
 t  j  d S(   s   Return the name of the SWIG executable.  On Unix, this is
        just "swig" -- it should be in the PATH.  Tries a bit harder on
        Windows.
        t   posixR/   R
   s   1.3s   1.2s   1.1s	   c:\swig%ss   swig.exeR?   s>   I don't know how to find (much less run) SWIG on platform '%s'N(   s   1.3s   1.2s   1.1(   RY   R`   Ra   Rb   t   isfilet   DistutilsPlatformError(   R2   t   verst   fn(    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR   P  s    c   	      C   s   t  j d t j d  } | j |  } |  j |  } | j d  } |  j |  } t j j |  d } |  j	 s t j j
 | d  | g   } t j j
 |  j |  Sd j
 | d d ! } |  j d  } t j j | j |   } t j j
 | |  S(   s   Returns the path of the filename for a given extension.

        The file is located in `build_lib` or directly in the package
        (inplace option).
        t   /s   ..RG   ii    t   build_py(   R_   t	   maketransRY   t   sept	   translatet   get_ext_fullnameRX   t   get_ext_filenameRa   R   Rb   R#   R}   t   abspatht   get_package_dir(	   R2   R   t   all_dotst   fullnamet   modpatht   filenameR&   R   t   package_dir(    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR   q  s    	c         C   s&   |  j  d k r | S|  j  d | Sd S(   sS   Returns the fullname of a given extension name.

        Adds the `package.` prefixRG   N(   R&   R!   (   R2   R   (    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR     s    c         C   s   d d l  m } t j | d  } t j d k rZ | t |  d d  | t |  d <n  | d  } t j d k r |  j r t j j	 |   d	 | St j j	 |   | S(
   s   Convert the name of an extension (eg. "foo.bar") into the name
        of the file from which it will be loaded (eg. "foo/bar.so", or
        "foo\bar.pyd").
        i(   Rk   RG   R?   i   i   t   SOR
   t   _d(
   t   distutils.sysconfigRk   R_   RX   RY   R`   R   R   Ra   Rb   (   R2   R   Rk   R   t   so_ext(    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR     s    )c         C   sC   d | j  j d  d } | | j k r< | j j |  n  | j S(   s  Return the list of symbols that a shared extension has to
        export.  This either uses 'ext.export_symbols' or, if it's not
        provided, "init" + module_name.  Only relevant on Windows, where
        the .pyd file (DLL) must export the module "init" function.
        t   initRG   i(   R`   RX   R   R[   (   R2   R   t   initfunc_name(    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR     s    c         C   sa  t  j d k r d d l m } t |  j |  s} d } |  j rM | d } n  | t  j d ?t  j d ?d @f } | j | g S| j Snt  j d	 k r d } | t  j d ?t  j d ?d @f } | j | g St  j d
  d k rd } | t  j d ?t  j d ?d @f } | j | g St  j d
  d k rd d l	 m
 } d } | t  j d ?t  j d ?d @f } g  } xM | j d  j   D]6 } | j d  r| j | d  q|| j |  q|W| j | d g | St  j d k r| j St  j d  d k r| j Sd d l	 m
 } t rV| j d  rVd } | t  j d ?t  j d ?d @f } | j | g S| j Sd S(   s   Return the list of libraries to link against when building a
        shared extension.  On most platforms, this is just 'ext.libraries';
        on Windows and OS/2, we add the Python library (eg. python20.dll).
        R;   i(   t   MSVCCompilers
   python%d%dR   i   i   i   t   os2emxi   RA   s   python%d.%dRB   (   R4   t   SHLIBSs   -li   t   mt   darwini   t   aixRH   N(   Rc   Rf   t   distutils.msvccompilerR   RV   R.   R   t
   hexversionR*   RP   R4   Rk   RX   Rh   R[   Rj   (   R2   R   R   t   templatet	   pythonlibR4   t   extraRD   (    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR     sT    
	
(   s
   build-lib=R   s(   directory for compiled extension modules(   s   build-temp=R   s1   directory for temporary files (build by-products)(   s   define=R   s   C preprocessor macros to define(   s   undef=R   s!   C preprocessor macros to undefine(   s
   libraries=R   s!   external C libraries to link with(   s   rpath=R   s7   directories to search for shared C libraries at runtime(   s   link-objects=R   s2   extra explicit link objects to include in the link(   R   R   s'   compile/link with debugging information(   R   R   s2   forcibly build everything (ignore file timestamps)(   s	   compiler=R   s   specify the compiler typeN(   s   swig-cppNs)   make SWIG create C++ files (default is C)(   s
   swig-opts=Ns!   list of SWIG command line options(   s   swig=Ns   path to the SWIG executable(   R    Ns#   add user include, library and rpath(   t   __name__t
   __module__t   descriptionRY   RZ   t   sep_byR   R!   t   user_optionst   boolean_optionsR   t   help_optionsR3   Rw   R   R   R   R   R   R   R   R   R   R   R   R   R   (    (    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyR   %   st     

   
         				@	N	
			S	:	!	 				(!   t   __doc__t   __revision__Rc   RY   R_   t   ret   typest   siteR   R   t   distutils.coreR   t   distutils.errorsR   R   R   t   distutils.dep_utilR   t   distutils.extensionR   t   distutils.utilR   RP   R	   R`   R   R   t   intRe   R   R   R   R   (    (    (    s1   /usr/lib/python2.7/distutils/command/build_ext.pyt   <module>   s$   0

		