a b@sHddlZddlZddlZddlmZddZefddZdd ZdS) N)PkgConfigErrorcCsj|D]\\}}||vr"|||<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 5/tmp/pip-target-98j97qn4/lib/python/cffi/pkgconfig.py merge_flagss  r c Cs*ddg}||||ztj|tjtjd}Wn:tyn}z"tdt|fWYd}~n d}~00|\}}|j dkrz| |}Wnt yYn0t|t j dkrt|tsz| |}Wn&tytd||||fYn0tjd kr&d |vr&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 LzBflags_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/Or0zBflags_from_pkgconfig..get_library_dirs..r1r3r r r get_library_dirsNsz.flags_from_pkgconfig..get_library_dirscSsdd|DS)NcSs"g|]}|dr|ddqS)-lr)Nr*r,r r r r/Rr0z?flags_from_pkgconfig..get_libraries..r1r3r r r get_librariesQsz+flags_from_pkgconfig..get_librariescsddfdd|DS)NcSs0|dd}d|vr$t|ddS|dfSdS)Nr)=r)tupler2)r.r r r _macroVs z8flags_from_pkgconfig..get_macros.._macrocsg|]}|dr|qS)-Dr*r,r<r r r/\r0z.get_macros..r1r3r 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..r1r3r r r get_other_cflags^sz.flags_from_pkgconfig..get_other_cflagscSsdd|DS)NcSs$g|]}|ds|ds|qS)r6r8r*r,r r r r/cs z@flags_from_pkgconfig..get_other_libs..r1r3r 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_libsr5r9r7r?r@rAr r kwargsgs  z$flags_from_pkgconfig..kwargs)r )ZlibsrJretr"Z lib_flagsr rIr flags_from_pkgconfig<s  rL) rr rerrorrr rHr'rLr r r r s "