o 6˜¿aÄyã@sRdZddlZddlZddlZddlZddlZddlmZddlm Z m Z ddl m Z ddl mZmZddlmZddlmZmZmZmZmZdd lmZdd lmZd d „ZGd d „d ejƒZe dej ¡j!Z"e dej ¡j!Z#e dej ¡j!Z$e dej ¡j%Z&e dej ¡j%Z'dd„Z(dd„Z)dd„Z*e dej ¡j!Z+e dej ¡j!Z,dd„Z-dS)z Build swig and f2py sources. éN)Ú build_ext)Ú newer_groupÚnewer)Ú get_platform)ÚDistutilsErrorÚDistutilsSetupError)Úlog)Úfortran_ext_matchÚ appendpathÚ is_stringÚ is_sequenceÚget_cmd)Ú process_filec Cs¾t d¡}t|dƒK}t|dƒ-}|D]"}| |¡}|r0| | d| d¡|| d¡¡¡q| |¡qWdƒn1s@wYWdƒdSWdƒdS1sXwYdS)zPSubstitute any occurrence of @foo@ by d['foo'] from source file into target.z@([a-zA-Z_]+)@ÚrÚwz@%s@éN)ÚreÚcompileÚopenÚsearchÚwriteÚreplaceÚgroup)ÚtargetÚsourceÚdÚvarÚfsÚftÚlÚm©r!úC/usr/lib/python3/dist-packages/numpy/distutils/command/build_src.pyÚ subst_varss    ( ûÿÿ"ÿr#c@sÀeZdZdZgd¢Zgd¢ZgZdd„Zdd„Zdd „Z d d „Z d d „Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zgfdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*S)+Ú build_srcz1build sources from SWIG, F2PY files or a function) )z build-src=rzdirectory to "build" sources to)z f2py-opts=Nz!list of f2py command line options)zswig=Nzpath to the SWIG executable)z swig-opts=Nz!list of SWIG command line options)zswig-cppNzAmake SWIG create C++ files (default is autodetected from sources))z f2pyflags=Nz3additional flags to f2py (use --f2py-opts= instead))z swigflags=Nz3additional flags to swig (use --swig-opts= instead))ÚforceÚfz2forcibly build everything (ignore file timestamps))ÚinplaceÚiziignore build-lib and put compiled extensions into the source directory alongside your pure Python modules)ú verbose-cfgNzJchange logging level from WARN to INFO which will show all compiler output)r%r'r)cCsjd|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_dS©N)Ú extensionsÚpackageÚ py_modulesÚpy_modules_dictr$Ú build_libÚ build_baser%r'Ú package_dirÚ f2pyflagsÚ f2py_optsÚ swigflagsÚ swig_optsÚswig_cppÚswigÚ verbose_cfg©Úselfr!r!r"Úinitialize_options?s" zbuild_src.initialize_optionscCs¼| dddd¡|jdur|jj|_|jj|_|jjpg|_|jjp#g|_|jjp*g|_|j durKdj t ƒgt j dd…¢RŽ}tj |jd|¡|_ i|_|jra|jrZt d¡n|j|_d|_|jdurjg|_nt |j¡|_|jr„|jr}t d ¡n|j|_d|_|jdurg|_nt |j¡|_| d ¡}|jdur¢|j|_|jdur«|j|_d D].}d | d d¡}t||dƒ}|rÛt||ƒrÌt d|¡q­t  d||f¡t!|||ƒq­dS)NÚbuild)r0r0)r/r/)r%r%z .{}-{}.{}éÚsrcz0ignoring --f2pyflags as --f2py-opts already usedz0ignoring --swigflags as --swig-opts already usedr)r7Úswig_optz--Ú_ú-z-both build_src and build_ext define %s optionz+using "%s=%s" option from build_ext command)"Úset_undefined_optionsr,Ú distributionÚ ext_packageÚ ext_modulesr+Ú librariesr-Ú data_filesr$ÚformatrÚsysÚ version_infoÚosÚpathÚjoinr0r.r2r3rÚwarnÚshlexÚsplitr4r5Úget_finalized_commandr'r6rÚgetattrÚinfoÚsetattr)r:Úplat_specifierrÚcÚoÚvr!r!r"Úfinalize_optionsRs\ý              €øzbuild_src.finalize_optionscCs&t d¡|js |js dS| ¡dS)Nr$)rrSr+rFÚ build_sourcesr9r!r!r"ÚrunŒs   z build_src.runcCsn|jr | d¡j|_| ¡|jD]}|j|Žq|jr-| |j¡|jD]}| |¡q%|  ¡|  ¡dS)NÚbuild_py) r'rQÚget_package_dirÚbuild_py_modules_sourcesrFÚbuild_library_sourcesr+Úcheck_extensions_listÚbuild_extension_sourcesÚbuild_data_files_sourcesÚbuild_npy_pkg_config)r:Ú libname_infoÚextr!r!r"rZ’s ÿ      zbuild_src.build_sourcesc CsB|jsdSt d¡ddlm}g}|jD]‚}t|tƒr"| |¡qt|tƒr’|\}}|j r;|  d  |  t j¡¡¡}nt j  |j|¡}dd„|Dƒ}dd„|Dƒ}|D]0}|jjdkr`||ƒ} n|ƒ} | durƒt| tƒrr| | ¡qSt| tƒr}| | ¡qStt| ƒƒ‚qS|||fƒ} | || f¡qtt|ƒƒ‚||jdd…<dS) Nzbuilding data_files sourcesr)Úget_data_filesÚ.cSsg|] }t|dƒr|‘qS©Ú__call__©Úhasattr©Ú.0r&r!r!r"Ú µóz6build_src.build_data_files_sources..cSsg|] }t|dƒs|‘qSrhrjrlr!r!r"rn¶ror)rGrrSÚnumpy.distutils.misc_utilrfÚ isinstanceÚstrÚappendÚtupler'r]rMrPrKÚseprLr$Ú__code__Ú co_argcountÚlistÚextendÚ TypeErrorÚrepr) r:rfÚnew_data_filesÚdatarÚfilesÚ build_dirÚfuncsr&ÚsÚ filenamesr!r!r"rb¦s<             ú  z"build_src.build_data_files_sourcesc Csº|\}}}tj |¡}| ¡D]\}}|||<q|jdkr%tj ||¡} n tj |j||¡} tj tj |¡d¡} tj | | ¡} tj  | ¡sLt  | ¡t | ||ƒtj ||¡} | | fS)Nrr) rKrLÚdirnameÚitemsr'rMr$ÚbasenameÚsplitextÚexistsÚmakedirsr#) r:rSÚgdÚtemplateÚ install_dirÚ subst_dictÚ template_dirÚkrXÚ generated_dirÚ generatedÚgenerated_pathÚfull_install_dirr!r!r"Ú_build_npy_pkg_configÊs     ÿ   zbuild_src._build_npy_pkg_configc CsÐt d¡t tdƒ¡}|jdks| ¡d}|jdkr!d}d}n t|dƒr+|j}d}|rd|j j   ¡D]2\}}|j j |}t j t j |¡|¡}d|i}|D]} | | |¡\} } |j j | | gf¡qNq3dSdS) Nz(build_src: building npy-pkg config filesÚinstallrFrgTÚinstall_libbaseÚprefix)rrSÚcopyr Ú finalizedrYr'rkr•rCÚinstalled_pkg_configr„r1rKrLrMÚabspathr“rGrs) r:Ú install_cmdÚ build_npkgÚ top_prefixÚpkgÚinfosÚpkg_pathr–rrSr‹rr!r!r"rcàs0      ÿþûzbuild_src.build_npy_pkg_configcCsð|jsdSt d¡g}|jD]_}t|ƒrit|ƒdkri|\}}}|jr)| |¡}ntj  |j tjj |  d¡Ž¡}t |dƒrJtj  ||d¡}||ƒ}|durOq|||fg}||j vr_g|j |<|j ||7<q| |¡q||jdd…<dS)Nzbuilding py_modules sourcesérgriú.py)r-rrSr Úlenr'r]rKrLrMr$rPrkr.rs)r:Únew_py_modulesrr,Ú module_baserrÚmodulesr!r!r"r^þs.     ÿ     z"build_src.build_py_modules_sourcescCstt| dg¡ƒ}|s dSt d|¡| |||f¡}| |||f¡}| |¡\}}|r4t d|j|¡||d<dS)NÚsourceszbuilding library "%s" sourcesú#%s - nothing done with h_files = %s)rxÚgetrrSÚgenerate_sourcesÚtemplate_sourcesÚfilter_h_filesr,)r:Úlib_nameÚ build_infor§Úh_filesr!r!r"r_sÿzbuild_src.build_library_sourcesc Cs$t|jƒ}t d|j¡| |j¡}| d¡}d |dd…¡}|jr*|  |¡|_ |  ||¡}|  ||¡}|  ||¡}| ||¡}| ||¡}| |¡\}}||jvrYg|j|<g}|D]}tj tj |¡¡d} | || |f¡q]|j||7<| |¡\}} | rt d|| ¡||_dS)Nzbuilding extension "%s" sourcesrgréÿÿÿÿr¨)rxr§rrSÚnameÚget_ext_fullnamerPrMr'r]Úext_target_dirrªr«Ú swig_sourcesÚ f2py_sourcesÚ pyrex_sourcesÚfilter_py_filesr.rKrLr†r…rsr¬) r:rer§ÚfullnameÚmodpathr,Úpy_filesr¦r&Úmoduler¯r!r!r"ra0s4           ÿ z!build_src.build_extension_sourcesc Csg}g}|D]}t|ƒr| |¡q| |¡q|s|S|jr't|ƒs'|j}nt|ƒr0|d}n|j}tjj|j g|  d¡dd…Ž}|  |¡|j rPt j}nt j}t  |¡} |D](} | ||ƒ}|sdqZt|ƒrudd„|Dƒ| |¡qZt  d|f¡| |¡qZt  | ¡|S)Nrrgr°cSsg|] }t d|f¡‘qS)ú adding '%s' to sources.)rrS)rmrr!r!r"rn~sz.build_src.generate_sources..r¼)r rsr'r r³r±rKrLrMr$rPÚmkpathr8rÚINFOÚWARNÚ set_thresholdryrS) r:r§Ú extensionÚ new_sourcesÚ func_sourcesrrr±Ú new_levelÚ old_levelÚfuncr!r!r"rªXs@    ÿ      zbuild_src.generate_sourcescCs| |dg¡S)Nr¢©Ú filter_files©r:r§r!r!r"r·†szbuild_src.filter_py_filescCs| |gd¢¡S)N)z.hz.hppz.incrÇrÉr!r!r"r¬‰szbuild_src.filter_h_filescCsHg}g}|D]}tj |¡\}}||vr| |¡q| |¡q||fSr*)rKrLr†rs)r:r§ÚextsrÂr~rÚbaserer!r!r"rÈŒs  zbuild_src.filter_filesc Csng}t|ƒr|d d¡}|d d¡}n|j}|j}|D]—}tj |¡\}}|dkr¯|jr5tj |¡} n t |j tj |¡ƒ} |  | ¡tj  | tj  |¡¡} |jsZt|g|| ƒrt|ƒrjt d| ¡t|ƒ} n t d| ¡t|ƒ} t| dƒ } |  | ¡Wdƒn1sŠwYt| ƒr©tj | ¡} | |vr©t d| ¡| | ¡| | ¡q| |¡q|S) NrÚdependsÚ include_dirsz.srczfrom_template:> %szconv_template:> %srú adding '%s' to include_dirs.)r r©rÌrÍrKrLr†r'rƒr r$r½rMr…r%rÚ_f_pyf_ext_matchrrSÚprocess_f_fileÚprocess_c_filerrÚ_header_ext_matchrs)r:r§rÁrÂrÌrÍrrËreÚ target_dirÚ target_fileÚoutstrÚfidrr!r!r"r«—s>    ÿ    zbuild_src.template_sourcesc Cs`g}|j d¡d}|D]!}tj |¡\}}|dkr(| ||||¡}| |¡q | |¡q |S)z@Pyrex not supported; this remains for Cython support (see below)rgr°z.pyx)r±rPrKrLr†Úgenerate_a_pyrex_sourcers) r:r§rÁrÂÚext_namerrËrerÔr!r!r"r¶»sþ  zbuild_src.pyrex_sourcescCsgS)zÄPyrex is not supported, but some projects monkeypatch this method. That allows compiling Cython code, see gh-6955. This method will remain here for compatibility reasons. r!)r:rËrØrrÁr!r!r"r×Êsz!build_src.generate_a_pyrex_sourcecCsüg}g}g}i}g}|j d¡d}d} |D]¬} tj | ¡\} } | dkr³|jr.tj | ¡} n t|jtj | ¡ƒ} tj  | ¡rYt | ƒ}||krOt d| ||fƒ‚tj  | |d¡}nFt  d| ¡|}d} tj  | |d¡}tj  |¡sŸt  d ||f¡tj | ¡} tj  | |d¡}tj  |¡s˜t d |fƒ‚t  d |¡| | ¡| | ¡||| <| |¡qt| ƒr½| | ¡q| | ¡q|sÉ|sÉ|S|D]}| |¡qË|j|j}|jjrô|jjD]\}}||jvró| | d g¡¡qát  d |¡|rPt|ƒdkr t d|fƒ‚|d} || }tj |¡pd} | g|j}|js.t||dƒrH| sHt  d| ¡ddl}|j  |d| | g¡npt  d| ¡nht!|ƒrZ|d}n|j}tjj |jg| d¡dd…Ž} tj  | |d¡}| |¡||j}|jsŒt||dƒr±| s±t  d|¡| | ¡ddl}|j  |dd| gd|g|¡nt  d|¡tj  |¡sÆt"d|fƒ‚tj  |j| ¡}tj  |d¡}tj  |d¡}t  d|¡| |¡||j#vrût  d|¡|j# |¡| s %sz--lowerz-mz3 skipping f2py fortran files for '%s' (up-to-date)z!f2py target file %r not generatedzfortranobject.czfortranobject.hr¼rÎr>zf2py target_c file %r not foundzf2py target_h file %r not found)z-f2pywrappers.fz-f2pywrappers2.f90)'r±rPrKrLr†r'rƒr r$ÚisfileÚget_f2py_modulenamerrMrÚdebugrNrSrsr r½rÜr3rCrFryr©r£rÌr%rÚ numpy.f2pyÚf2pyÚrun_mainr rrÍÚ__file__rÚ copy_file)r:r§rÁrÂrµÚ f_sourcesÚ f2py_targetsÚ target_dirsrØÚ skip_f2pyrrËrerÓr±rÔrrÜr®rÌÚnumpyrÚtarget_cÚtarget_hÚsource_cÚsource_hÚname_extÚfilenamer!r!r"rµÒs ÿÿÿ ý  ÿ        €ÿÿ ÿÿ   ÿ  ÿ  ÿþþÿ     € €zbuild_src.f2py_sourcesc Cs€g}g}i}g}g}d}d|jvrd} d} |j d¡n |jr$d} d} nd} d} d} |j d¡d} |D]} tj | ¡\}}|d kr2|jrQtj  |¡}|j }n t |j tj  |¡ƒ}|}tj  | ¡rÌt| ƒ}|| d d…kr|td | || d d…fƒ‚| dur‰t| ƒ} | dk} n3t| ƒ}|dur›t d | | f¡n!| |kr¼t d | | |f¡|dkrµt d¡d} nt d| ¡| rÀd}tj |d||f¡}nDt d| ¡| d d…}d } t||ƒ}tj  |¡st d||f¡tj  |¡}t||ƒ}tj  |¡s td|fƒ‚t d|¡| |¡| |¡| tj ||d¡¡| | ¡|d|| <q4| | ¡q4|s=|S| rD||S|D]}| |¡qF|jpV| ¡}|dg|j}| rf| d¡|jD] }| d|¡qi|D]E} || }| g|j}|jst||dƒr³t dtj |¡| r›dpœd| f¡| ||jd|d|| g¡qvt  d| ¡qv||S) Nú.cz-c++úc++TFrrgr°z.irrÙz>source %r does not define swig target, assuming %s swig targetz0expected %r but source %r defines %r swig targetzAresetting swig target to c++ (some targets may have .c extension)z$assuming that %r has c++ swig targetú.cppú %s_wrap%sz. source %s does not exist: skipping swig'ing.zi target %s does not exist: Assuming %s_wrap.{c,cpp} was generated with "build_src --inplace" command.rÚrÛr¢z-pythonz-Irz%s: %sz++Úz-oz-outdirz+ skipping '%s' swig interface (up-to-date))!r5Úremover6r±rPrKrLr†r'rƒr³r r$rÝÚget_swig_modulenamerÚget_swig_targetrrNrMÚ_find_swig_targetrsr½r7Ú find_swigrÍrÌr%rrSr…Úspawnrß)r:r§rÁrÂr´Ú swig_targetsrçrºÚ target_extÚtypÚis_cppÚ skip_swigrØrrËrerÓÚ py_target_dirr±Útyp2rÔrr7Úswig_cmdrrÌr!r!r"r´\sÒ     ÿÿ ÿÿ  ÿÿ  ý  ÿ       ÿÿ   ÿ ÿzbuild_src.swig_sourcesN)Ú__name__Ú __module__Ú __qualname__Ú descriptionÚ user_optionsÚboolean_optionsÚ help_optionsr;rYr[rZrbr“rcr^r_rarªr·r¬rÈr«r¶r×rµr´r!r!r!r"r$&s2:$(.  $ r$z!.*\.(f90|f95|f77|for|ftn|f|pyf)\Zz.*\.(inc|h|hpp)\ZzQ\s*%module\s*(.*\(\s*package\s*=\s*"(?P[\w_]+)".*\)|)\s*(?P[\w_]+)z-\*-\s*c\s*-\*-z-\*-\s*c\+\+\s*-\*-cCsdt|dƒ#}d}| ¡}t|ƒrd}t|ƒr d}Wdƒ|SWdƒ|S1s+wY|S)NrrñrV)rÚreadlineÚ_has_cpp_headerÚ _has_c_header)rr&ÚresultÚliner!r!r"r÷×s  úþ ûùr÷cCsht|dƒ%}d}|D]}t|ƒ}|r| d¡}n q Wdƒ|SWdƒ|S1s-wY|S)Nrr±)rÚ_swig_module_name_matchr)rr&r±rr r!r!r"röás  þþ þÿ úùröcCs6dD]}tj |d||f¡}tj |¡r|Sq|S)N)ròrðró)rKrLrMrÝ)rÓr±rerr!r!r"røës þrøz%\s*python\s*module\s*(?P[\w_]+)z4\s*python\s*module\s*(?P[\w_]*?__user__[\w_]*)cCspd}t|ƒ(}|D]}t|ƒ}|rt|ƒrq | d¡}n q Wdƒ|SWdƒ|S1s1wY|S)Nr±)rÚ_f2py_module_name_matchÚ_f2py_user_module_name_matchr)rr±r&rr r!r!r"rÞùs$  üþ ÿÿ ùørÞ).Ú__doc__rKrrIrOr—Údistutils.commandrÚdistutils.dep_utilrrÚdistutils.utilrÚdistutils.errorsrrÚnumpy.distutilsrrpr r r r r Únumpy.distutils.from_templaterrÐÚnumpy.distutils.conv_templaterÑr#r$rÚIÚmatchrÏrÒrrr r r÷rörørrrÞr!r!r!r"ÚsX      -ÿÿ   ÿÿÿÿ