U 1_@sHddlZddlZddlZddlmZddZefddZdd ZdS) N)PkgConfigErrorcCsj|D]\\}}||kr"|||<qt||ts>td|ft|tsVtd|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 isinstancelist TypeErrorextend)Zcfg1Zcfg2keyvaluer 2/tmp/pip-unpacked-wheel-9t_xacz3/cffi/pkgconfig.py merge_flagss  r c Cs2ddg}||||ztj|tjtjd}Wn8tk rl}ztdt|fW5d}~XYnX|\}}|j dkrz| |}Wnt k rYnXt|t j dkrt|tsz| |}Wn*tk rtd||||fYnXtjd kr.d |kr.td |||f|S) z5Calls pkg-config and returns the output if found z pkg-configz--print-errors)stdoutstderrzcannot 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 subprocessPopenPIPEEnvironmentErrorrstrstrip communicate returncodedecode Exceptionsys version_inforUnicodeDecodeErrorosaltsep)libnameflagencodingaZpceZboutZberrr r r calls4  (    r'csjddddddddd d d d fd d}i}|D]}||}t||qN|S)aReturn 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. cSsdd|DS)NcSs"g|]}|dr|ddqS)-IN startswith.0xr r r Ls zBflags_from_pkgconfig..get_include_dirs..splitstringr r r get_include_dirsKsz.flags_from_pkgconfig..get_include_dirscSsdd|DS)NcSs"g|]}|dr|ddqS)-Lr)Nr*r,r r r r/Os zBflags_from_pkgconfig..get_library_dirs..r0r2r r r get_library_dirsNsz.flags_from_pkgconfig..get_library_dirscSsdd|DS)NcSs"g|]}|dr|ddqS)-lr)Nr*r,r r r r/Rs z?flags_from_pkgconfig..get_libraries..r0r2r r r get_librariesQsz+flags_from_pkgconfig..get_librariescsddfdd|DS)NcSs0|dd}d|kr$t|ddS|dfSdS)Nr)=r)tupler1)r.r r r _macroVs z8flags_from_pkgconfig..get_macros.._macrocsg|]}|dr|qS)-Dr*r,r;r r r/\s z.get_macros..r0r2r r=r get_macrosUsz(flags_from_pkgconfig..get_macroscSsdd|DS)NcSs$g|]}|ds|ds|qS)r(r<r*r,r r r r/_s  zBflags_from_pkgconfig..get_other_cflags..r0r2r r r get_other_cflags^sz.flags_from_pkgconfig..get_other_cflagscSsdd|DS)NcSs$g|]}|ds|ds|qS)r5r7r*r,r r r r/cs  z@flags_from_pkgconfig..get_other_libs..r0r2r r r get_other_libsbsz,flags_from_pkgconfig..get_other_libscsFt}t|d}t|d}||||||dS)Nz--cflagsz--libs) include_dirs library_dirs libraries define_macrosextra_compile_argsextra_link_args)rgetfilesystemencodingr')r"ZfseZ all_cflagsZall_libsr4r8r6r>r?r@r r kwargsgs  z$flags_from_pkgconfig..kwargs)r )ZlibsrIretr"Z lib_flagsr rHr flags_from_pkgconfig<s  rK) rr rerrorrr rGr'rKr r r r s "