U ل=^@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 /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 subprocessPopenPIPEEnvironmentErrorrstrstripZ 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..r/r1r 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..r/r1r r r get_librariesQsz+flags_from_pkgconfig..get_librariescsddfdd|DS)NcSs0|dd}d|kr$t|ddS|dfSdS)Nr(=r)tupler0)r-r r r _macroVs z8flags_from_pkgconfig..get_macros.._macrocsg|]}|dr|qS)-Dr)r+r:r r r.\s z.get_macros..r/r1r 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..r/r1r r r get_other_cflags^sz.flags_from_pkgconfig..get_other_cflagscSsdd|DS)NcSs$g|]}|ds|ds|qS)r4r6r)r+r r r r.cs  z@flags_from_pkgconfig..get_other_libs..r/r1r r r get_other_libsbsz,flags_from_pkgconfig..get_other_libscsFt}t|d}t|d}||||||dS)Nz--cflagsz--libs)Z include_dirsZ library_dirsZ librariesZ define_macrosZextra_compile_argsZextra_link_args)rgetfilesystemencodingr&)r!ZfseZ all_cflagsZall_libsr3r7r5r=r>r?r r kwargsgs  z$flags_from_pkgconfig..kwargs)r )ZlibsrBZretr!Z lib_flagsr rAr flags_from_pkgconfig<s  rC) rrrerrorrr r@r&rCr r r r s "