B
     ¯]  ã               @   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   sn   xh|  ¡ D ]\\}}|| kr$|| |< q
t| | tƒs@td|f ƒ‚t|tƒsXtd|f ƒ‚| |  |¡ q
W | S )z¬Merge 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   ú-lib/python3.7/site-packages/cffi/pkgconfig.pyÚmerge_flags   s    

r   c          
   C   s2  ddg}|  |¡ |  | ¡ ytj|tjtjd}W n8 tk
rl } ztdt|ƒ ¡ f ƒ‚W dd}~X Y nX | ¡ \}}|j	dkr´y| 
|¡}W n tk
r¦   Y nX t| ¡ ƒ‚tjdkrt|tƒsy| 
|¡}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ÚstripZcommunicateÚ
returncodeÚdecodeÚ	ExceptionÚsysÚversion_infor   ÚUnicodeDecodeErrorÚosÚaltsep)ÚlibnameÚflagÚencodingÚaZpcÚeZboutZberrr   r   r   Úcall   s0    

(
r&   c                sn   dd„ ‰ dd„ ‰dd„ ‰dd„ ‰d	d
„ ‰dd„ ‰‡ ‡‡‡‡‡fdd„}i }x| D ]}||ƒ}t ||ƒ qPW |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 )z-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 )z-Lr'   N)r(   )r)   r*   r   r   r   r+   O   s    zBflags_from_pkgconfig.<locals>.get_library_dirs.<locals>.<listcomp>)r,   )r-   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 )z-lr'   N)r(   )r)   r*   r   r   r   r+   R   s    z?flags_from_pkgconfig.<locals>.get_libraries.<locals>.<listcomp>)r,   )r-   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   )Útupler,   )r*   r   r   r   Ú_macroV   s    z8flags_from_pkgconfig.<locals>.get_macros.<locals>._macroc                s   g | ]}|  d ¡rˆ |ƒ‘qS )z-D)r(   )r)   r*   )r3   r   r   r+   \   s    z<flags_from_pkgconfig.<locals>.get_macros.<locals>.<listcomp>)r,   )r-   r   )r3   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 )z-Iz-D)r(   )r)   r*   r   r   r   r+   _   s    zBflags_from_pkgconfig.<locals>.get_other_cflags.<locals>.<listcomp>)r,   )r-   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 )z-Lz-l)r(   )r)   r*   r   r   r   r+   c   s    z@flags_from_pkgconfig.<locals>.get_other_libs.<locals>.<listcomp>)r,   )r-   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)Zinclude_dirsZlibrary_dirsZ	librariesZdefine_macrosZextra_compile_argsZextra_link_args)r   Úgetfilesystemencodingr&   )r!   ZfseZ
all_cflagsZall_libs)r.   r0   r/   r4   r5   r6   r   r   Úkwargsg   s    

z$flags_from_pkgconfig.<locals>.kwargs)r   )Zlibsr8   Zretr!   Z	lib_flagsr   )r.   r0   r/   r4   r5   r6   r   Úflags_from_pkgconfig<   s    	
r9   )	r   r   r   Úerrorr   r   r7   r&   r9   r   r   r   r   Ú<module>   s   "