U
    ڲg                     @   sH   d dl Z d dlZd dlZddlmZ dd Ze  fddZdd	 ZdS )
    N   )PkgConfigErrorc                 C   sj   |  D ]\\}}|| kr"|| |< qt| | ts>td|f t|tsVtd|f | | | q| S )zMerge values from cffi config flags cfg2 to cf1

    Example:
        merge_flags({"libraries": ["one"]}, {"libraries": ["two"]})
        {"libraries": ["one", "two"]}
    z$cfg1[%r] should be a list of stringsz$cfg2[%r] should be a list of strings)items
isinstancelist	TypeErrorextend)Zcfg1Zcfg2keyvalue r   2/tmp/pip-unpacked-wheel-lbi5ej3i/cffi/pkgconfig.pymerge_flags   s    

r   c              
   C   s2  ddg}| | | |  ztj|tjtjd}W n8 tk
rl } ztdt| f W 5 d}~X Y nX | \}}|j	dkrz|
|}W n tk
r   Y nX t| tjdkrt|tsz|
|}W n* tk
r   td|| ||f Y nX tjd	kr.d	|kr.td
|| |f |S )z5Calls pkg-config and returns the output if found
    z
pkg-configz--print-errors)stdoutstderrzcannot run pkg-config: %sNr   )   zKpkg-config %s %s returned bytes that cannot be decoded with encoding %r:
%r\zEpkg-config %s %s returned an unsupported backslash-escaped output:
%r)append
subprocessPopenPIPEEnvironmentErrorr   strstripcommunicate
returncodedecode	Exceptionsysversion_infor   UnicodeDecodeErrorosaltsep)libnameflagencodingaZpceZboutZberrr   r   r   call   s4    

(

r'   c                    sj   dd  dd dd dd d	d
 dd  fdd}i }| D ]}||}t || qN|S )a  Return compiler line flags for FFI.set_source based on pkg-config output

    Usage
        ...
        ffibuilder.set_source("_foo", pkgconfig = ["libfoo", "libbar >= 1.8.3"])

    If pkg-config is installed on build machine, then arguments include_dirs,
    library_dirs, libraries, define_macros, extra_compile_args and
    extra_link_args are extended with an output of pkg-config for libfoo and
    libbar.

    Raises PkgConfigError in case the pkg-config call fails.
    c                 S   s   dd |   D S )Nc                 S   s"   g | ]}| d r|dd qS )-I   N
startswith.0xr   r   r   
<listcomp>L   s     
 zBflags_from_pkgconfig.<locals>.get_include_dirs.<locals>.<listcomp>splitstringr   r   r   get_include_dirsK   s    z.flags_from_pkgconfig.<locals>.get_include_dirsc                 S   s   dd |   D S )Nc                 S   s"   g | ]}| d r|dd qS )-Lr)   Nr*   r,   r   r   r   r/   O   s     
 zBflags_from_pkgconfig.<locals>.get_library_dirs.<locals>.<listcomp>r0   r2   r   r   r   get_library_dirsN   s    z.flags_from_pkgconfig.<locals>.get_library_dirsc                 S   s   dd |   D S )Nc                 S   s"   g | ]}| d r|dd qS )-lr)   Nr*   r,   r   r   r   r/   R   s     
 z?flags_from_pkgconfig.<locals>.get_libraries.<locals>.<listcomp>r0   r2   r   r   r   get_librariesQ   s    z+flags_from_pkgconfig.<locals>.get_librariesc                    s   dd   fdd|   D S )Nc                 S   s0   | dd  } d| kr$t | ddS | d fS d S )Nr)   =r   )tupler1   )r.   r   r   r   _macroV   s    z8flags_from_pkgconfig.<locals>.get_macros.<locals>._macroc                    s   g | ]}| d r |qS )-Dr*   r,   r;   r   r   r/   \   s     
 z<flags_from_pkgconfig.<locals>.get_macros.<locals>.<listcomp>r0   r2   r   r=   r   
get_macrosU   s    z(flags_from_pkgconfig.<locals>.get_macrosc                 S   s   dd |   D S )Nc                 S   s$   g | ]}| d s| ds|qS )r(   r<   r*   r,   r   r   r   r/   _   s     

zBflags_from_pkgconfig.<locals>.get_other_cflags.<locals>.<listcomp>r0   r2   r   r   r   get_other_cflags^   s    z.flags_from_pkgconfig.<locals>.get_other_cflagsc                 S   s   dd |   D S )Nc                 S   s$   g | ]}| d s| ds|qS )r5   r7   r*   r,   r   r   r   r/   c   s     

z@flags_from_pkgconfig.<locals>.get_other_libs.<locals>.<listcomp>r0   r2   r   r   r   get_other_libsb   s    z,flags_from_pkgconfig.<locals>.get_other_libsc                    sF   t  }t| d}t| d} ||||||dS )Nz--cflagsz--libs)include_dirslibrary_dirs	librariesdefine_macrosextra_compile_argsextra_link_args)r   getfilesystemencodingr'   )r"   ZfseZ
all_cflagsZall_libsr4   r8   r6   r>   r?   r@   r   r   kwargsg   s    

z$flags_from_pkgconfig.<locals>.kwargs)r   )ZlibsrI   retr"   Z	lib_flagsr   rH   r   flags_from_pkgconfig<   s    	rK   )	r   r    r   errorr   r   rG   r'   rK   r   r   r   r   <module>   s   "