3 MZ @snddlZddlZyeWnek r0eZYnXddZddZddZdd Zd d Z d d Z ddZ dS)NcCsddlm}||dS)Nr)DistutilsSetupError)Zdistutils.errorsr)msgrr&/usr/lib64/python3.6/setuptools_ext.pyerror s rc Cs@t|}|j}WdQRX|d7}t||d}t|||dS)N exec)openreadcompiler)filenameZglobfsrccoderrrexecfiles   rc Csddlm}t|ts*tdt|jft|}y|jd\}}Wn"t k rftd|fYnXt j j |sd}|j ddd }t j j |rd |d|f}td ||fd |d }t||y ||}Wn$tk rtd||fYnXt||s|}t||s0td|t|jft|dsJtd|f|j\} } } } |jrr| j} |j| | dkrt||| nt||| | | | dS)Nr)FFIzEargument to 'cffi_modules=...' must be a str or a list of str, not %r:z3%r must be of the form 'path/build.py:ffi_variable'./z.pyz (rewrite cffi_modules to [%r])z#%r does not name an existing file%sZ__cffi__)__name____file__z!%r: object %r not found in modulez"%r is not an FFI instance (got %r)_assigned_sourcez*%r: the set_source() method was not called)Zcffi.apir isinstance basestringrtyperstrsplit ValueErrorospathexistsreplacerKeyErrorhasattrrZ_windows_unicodecopyZ_apply_windows_unicode_add_py_module _add_c_module) distZmod_specrZbuild_file_nameZ ffi_var_nameextZ rewrittenZmod_varsffi module_namesourcesource_extensionkwdsrrradd_cffi_modulesL            r/c Cspd|krlttd rltjdkrlddl}y(t|jjdd}|dkrLd|d<Wntk rjd|d<YnX|S) a Add py_limited_api to kwds if setuptools >= 26 is in use. Do not alter the setting if it already exists. Setuptools takes care of ignoring the flag on Python 2 and PyPy. CPython itself should ignore the flag in a debugging version (by not listing .abi3.so in the extensions it supports), but it doesn't so far, creating troubles. That's why we check for "not hasattr(sys, 'gettotalrefcount')" (the 2.7 compatible equivalent of 'd' not in sys.abiflags). (http://bugs.python.org/issue28401) On Windows, it's better not to use py_limited_api until issue #355 can be resolved (by having virtualenv copy PYTHON3.DLL). See also the start of _cffi_include.h. Zpy_limited_apigettotalrefcountZwin32rNrT)r$sysplatform setuptoolsint __version__ partitionr) Extensionr.r4Zsetuptools_major_versionrrr_set_py_limited_apiIs  r9c sddlm}ddlm}ddlmddlmddlm dg}|j |j dgt ||}|f|d |d fd d |j dkrg|_ |j j|jjd |Gfd dd} | |jd <dS)Nr)r8) build_ext)mkpath)log) recompilerz $PLACEHOLDERsources)namer>cs\tjj|}jd|||dk r:|j|}|sXjd|S)Nzgenerating cffi module %rzalready up-to-date)rr joininfoZ make_c_source)Ztmpdirpre_runZc_fileupdated)r)r*r<r;r+r=r,r-rrmake_modts  z_add_c_module..make_modr:cseZdZfddZdS)z)_add_c_module..build_ext_make_modcs:jddkr,t|dd}|j|jd<j|dS)Nrz $PLACEHOLDERrB)r>getattrZ build_temprun)selfrB) base_classr)rDrrrFs z-_add_c_module..build_ext_make_mod.runN)r __module__ __qualname__rFr)rHr)rDrrbuild_ext_make_modsrK)N)Zdistutils.corer8setuptools.command.build_extr:distutils.dir_utilr; distutilsr<cffir=extendpopr9Z ext_modulesappendcmdclassget) r(r*r+r,r-r.r8r:Z allsourcesrKr) rHr)r*r<rDr;r+r=r,r-rr'gs         r'csddlmddlm}ddlm}ddlmddlm fdd|j j d |Gfd d d }||j d <|j dkrg|_ |j j |j j d |Gfd dd}||j d <dS)Nr)r;)build_py)r:)r<)r=cs>jd|tjj|j|}|s:jddS)Nzgenerating cffi module %rzalready up-to-date)rArr dirnameZmake_py_source)Zpy_filerC)r*r<r;r+r=rr generate_mods z$_add_py_module..generate_modrUcseZdZfddZdS)z)_add_py_module..build_py_make_modcs@j|jd}|dd7<tjj|jf|dS)Nrz.py)rFrrr r@Z build_lib)rG module_path)rHrWr+rrrFs  z-_add_py_module..build_py_make_mod.runN)rrIrJrFr)rHrWr+rrbuild_py_make_modsr[r:cseZdZfddZdS)z*_add_py_module..build_ext_make_modcsbj||jr^jd}dj|dd}|jd}|j|}|dd}tjj||dS)NrrXrUz.pyrYrY)rFZinplacerr@Zget_finalized_commandZget_package_dirrr )rGrZpackagerUZ package_dir file_name) base_class_2rWr+rrrFs     z._add_py_module..build_ext_make_mod.runN)rrIrJrFr)r^rWr+rrrKsrK)rMr;Zsetuptools.command.build_pyrUrLr:rNr<rOr=rSrTZ py_modulesrR)r(r*r+rUr:r[rKr)rHr^r*rWr<r;r+r=rr&s        r&cCs,t|tr|g}x|D]}t||qWdS)N)rrr/)r(attrvalueZ cffi_modulerrr cffi_moduless  ra) rr2r NameErrorrrrr/r9r'r&rarrrrs  -.1