U ã€C^zã@sfdZddlmZmZmZddlZddlZddlZddlZddl Z ddl m Z ddl m Z mZddlmZddlmZmZddlmZdd lmZmZmZmZmZdd lmZdd lmZ d d „Z!Gd d„de j ƒZ"e #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%Z0dd„Z1dS)z Build swig and f2py sources. é)ÚdivisionÚabsolute_importÚprint_functionN)Ú 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ƒf}t|dƒP}|D]D}| |¡}|r`| | d| d¡|| d¡¡¡q&| |¡q&W5QRXW5QRXdS)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$úD/tmp/pip-install-6_kvzl1k/numpy/numpy/distutils/command/build_src.pyÚ subst_varss    (r&c @sÒeZdZdZdddddddd d d g Zd d dgZgZdd„Zdd„Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zgfd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5S)6Ú 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 outputr(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_optionsAs"zbuild_src.initialize_optionscCsÈ| dddd¡|jdkr$|jj|_|jj|_|jjp8g|_|jjpFg|_|jjpTg|_|j dkr”dj t ƒft j dd…žŽ}tj |jd|¡|_ i|_|jrÀ|jr²t d¡n|j|_d|_|jdkrÒg|_nt |j¡|_|jr|jrút d ¡n|j|_d|_|jdkrg|_nt |j¡|_| d ¡}|jdkrH|j|_|jdkr\|j|_d D]b}d | d d¡}t||dƒ}|r`t||ƒr¢t d|¡nt  d||f¡t!|||ƒq`dS)NÚbuild)r3r3)r2r2)r(r(z .{}-{}.{}éÚsrcz0ignoring --f2pyflags as --f2py-opts already usedz0ignoring --swigflags as --swig-opts already usedr)r:Zswig_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.Ú librariesr0Ú data_filesr'ÚformatrÚsysÚ version_infoÚosÚpathÚjoinr3r1r5r6r ÚwarnÚshlexÚsplitr7r8Úget_finalized_commandr*r9rÚgetattrÚinfoÚsetattr)r=Úplat_specifierrÚcÚoÚvr$r$r%Úfinalize_optionsTsXý             zbuild_src.finalize_optionscCs&t d¡|js|jsdS| ¡dS)Nr')r rUr.rHÚ build_sourcesr<r$r$r%ÚrunŽs  z build_src.runcCsn|jr| d¡j|_| ¡|jD]}|j|Žq"|jrZ| |j¡|jD]}| |¡qJ|  ¡|  ¡dS)NÚbuild_py) r*rSÚget_package_dirÚbuild_py_modules_sourcesrHÚbuild_library_sourcesr.Zcheck_extensions_listÚbuild_extension_sourcesÚbuild_data_files_sourcesÚbuild_npy_pkg_config)r=Z libname_infoÚextr$r$r%r\”s ÿ     zbuild_src.build_sourcesc CsJ|js dSt d¡ddlm}g}|jD] }t|tƒrF| |¡q*t|tƒr*|\}}|j rz|  d  |  t j¡¡¡}nt j  |j|¡}dd„|Dƒ}dd„|Dƒ}|D]b}|jjdkrÄ||ƒ} n|ƒ} | dk rªt| tƒrè| | ¡qªt| tƒr| | ¡qªtt| ƒƒ‚qª|||fƒ} | || f¡q*tt|ƒƒ‚q*||jdd…<dS) Nzbuilding data_files sourcesr)Úget_data_filesÚ.cSsg|]}t|dƒr|‘qS©Ú__call__©Úhasattr©Ú.0r)r$r$r%Ú ·s z6build_src.build_data_files_sources..cSsg|]}t|dƒs|‘qSrhrjrlr$r$r%rn¸s r)rIr rUÚnumpy.distutils.misc_utilrfÚ isinstanceÚstrÚappendÚtupler*r_rOrRrMÚseprNr'Ú__code__Ú co_argcountÚlistÚextendÚ TypeErrorÚrepr) r=rfZnew_data_filesÚdatarÚfilesÚ build_dirÚfuncsr)ÚsÚ filenamesr$r$r%rc¨s:             z"build_src.build_data_files_sourcesc Csº|\}}}tj |¡}| ¡D]\}}|||<q|jdkrJtj ||¡} ntj |j||¡} tj tj |¡d¡} tj | | ¡} tj  | ¡s˜t  | ¡t | ||ƒtj ||¡} | | fS)Nrr) rMrNÚdirnameÚitemsr*rOr'ÚbasenameÚsplitextÚexistsÚmakedirsr&) r=rUÚgdÚtemplateÚ install_dirZ subst_dictZ template_dirÚkrZZ generated_dirÚ generatedZgenerated_pathZfull_install_dirr$r$r%Ú_build_npy_pkg_configÌs      ÿ   zbuild_src._build_npy_pkg_configc CsÌt d¡t tdƒ¡}|jdks*| ¡d}|jdkrBd}d}nt|dƒrV|j}d}|rÈ|j j   ¡D]`\}}|j j |}t j t j |¡|¡}d|i}|D](} | | |¡\} } |j j | | gf¡qœqfdS) Nz(build_src: building npy-pkg config filesÚinstallrFrgTÚinstall_libbaseÚprefix)r rUÚcopyrÚ finalizedr[r*rkrŽrEZinstalled_pkg_configr‚r4rMrNrOÚabspathrŒrIrr) r=Z install_cmdZ build_npkgZ top_prefixÚpkgZinfosZpkg_pathrrrUr‰r‹r$r$r%rdâs*      ÿzbuild_src.build_npy_pkg_configcCsð|js dSt d¡g}|jD]¾}t|ƒrÒt|ƒdkrÒ|\}}}|jrR| |¡}ntj  |j tjj |  d¡Ž¡}t |dƒr”tj  ||d¡}||ƒ}|dkržq|||fg}||j kr¾g|j |<|j ||7<q| |¡q||jdd…<dS)Nzbuilding py_modules sourcesérgriú.py)r0r rUrÚlenr*r_rMrNrOr'rRrkr1rr)r=Znew_py_modulesrr/Z module_baser}rÚmodulesr$r$r%r`s.     ÿ     z"build_src.build_py_modules_sourcescCstt| dg¡ƒ}|sdSt d|¡| |||f¡}| |||f¡}| |¡\}}|rht d|j|¡||d<dS)NÚsourceszbuilding library "%s" sourcesú#%s - nothing done with h_files = %s)rwÚgetr rUÚgenerate_sourcesÚtemplate_sourcesÚfilter_h_filesr/)r=Zlib_nameÚ build_infor˜Úh_filesr$r$r%rasÿzbuild_src.build_library_sourcesc Cs&t|jƒ}t d|j¡| |j¡}| d¡}d |dd…¡}|jrT|  |¡|_ |  ||¡}|  ||¡}|  ||¡}| ||¡}| ||¡}| |¡\}}||jkr²g|j|<g}|D],}tj tj |¡¡d} | || |f¡qº|j||7<| |¡\}} | rt d|| ¡||_dS)Nzbuilding extension "%s" sourcesrgréÿÿÿÿr™)rwr˜r rUÚnameZget_ext_fullnamerRrOr*r_Úext_target_dirr›rœÚ swig_sourcesÚ f2py_sourcesÚ pyrex_sourcesÚfilter_py_filesr1rMrNr„rƒrrr) r=rer˜ÚfullnameÚmodpathr/Úpy_filesr—r)ÚmodulerŸr$r$r%rb2s6           ÿz!build_src.build_extension_sourcesc Csg}g}|D]"}t|ƒr$| |¡q | |¡q |s8|S|jrNt|ƒsN|j}n:t|ƒr`|d}n|j}tjj|j g|  d¡dd…Ž}|  |¡|j r t j}nt j}t  |¡} |D]P} | ||ƒ}|sÈq´t|ƒrêdd„|Dƒ| |¡q´t  d|f¡| |¡q´t  | ¡|S)Nrrgr cSsg|]}t d|f¡‘qS)ú adding '%s' to sources.)r rU)rmrr$r$r%rn€sz.build_src.generate_sources..r«)rrrr*rr¢r¡rMrNrOr'rRÚmkpathr;r ÚINFOÚWARNÚ set_thresholdrxrU) r=r˜Ú extensionÚ new_sourcesZ func_sourcesrr}r¡Z new_levelZ old_levelÚfuncr$r$r%r›Zs@    ÿ      zbuild_src.generate_sourcescCs| |dg¡S)Nr•©Ú filter_files©r=r˜r$r$r%r¦ˆszbuild_src.filter_py_filescCs| |dddg¡S)Nz.hz.hppz.incr³rµr$r$r%r‹szbuild_src.filter_h_filescCsHg}g}|D]2}tj |¡\}}||kr4| |¡q | |¡q ||fSr-)rMrNr„rr)r=r˜Úextsr±r|rÚbaserer$r$r%r´Žs  zbuild_src.filter_filesc Csdg}t|ƒr*|d d¡}|d d¡}n |j}|j}|D]"}tj |¡\}}|dkrT|jrntj |¡} nt |j tj |¡ƒ} |  | ¡tj  | tj  |¡¡} |jsºt|g|| ƒrt|ƒrÚt d| ¡t|ƒ} nt d| ¡t|ƒ} t| dƒ} |  | ¡W5QRXt| ƒrHtj | ¡} | |krHt d| ¡| | ¡| | ¡q:| |¡q:|S) NrÚdependsÚ include_dirsz.srczfrom_template:> %szconv_template:> %srú adding '%s' to include_dirs.)rršr¸r¹rMrNr„r*rr r'r¬rOrƒr(rÚ_f_pyf_ext_matchr rUÚprocess_f_fileÚprocess_c_filerrÚ_header_ext_matchrr)r=r˜r°r±r¸r¹rr·reÚ target_dirÚ target_fileZoutstrZfidrr$r$r%rœ™s<           zbuild_src.template_sourcesc Cs`g}|j d¡d}|D]B}tj |¡\}}|dkrP| ||||¡}| |¡q| |¡q|S)z@Pyrex not supported; this remains for Cython support (see below)rgr z.pyx)r¡rRrMrNr„Úgenerate_a_pyrex_sourcerr) 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_sourcecCsg}g}g}i}g}|j d¡d}d} |D]`} tj | ¡\} } | dkrn|jr`tj | ¡} nt|jtj | ¡ƒ} tj  | ¡r¶t | ƒ}||kr¢t d| ||fƒ‚tj  | |d¡}nt  d| ¡|}d} tj  | |d¡}tj  |¡sFt  d ||f¡tj | ¡} tj  | |d¡}tj  |¡s8t d |fƒ‚t  d |¡| | ¡| | ¡||| <| |¡q,t| ƒr„| | ¡q,| | ¡q,|s |s |S|D]}| |¡q¤|j|j}|jjrþ|jjD](\}}||jkrÔ| | d g¡¡qÔt  d |¡|r¶t|ƒdkr.t d|fƒ‚|d} || }tj |¡pNd} | g|j}|jsrt||dƒr¦| s¦t  d| ¡ddl}|j  |d| | g¡nt  d| ¡nÐt!|ƒrÊ|d}n|j}tjj |jg| d¡dd…Ž} tj  | |d¡}| |¡||j}|js.t||dƒrx| sxt  d|¡| | ¡ddl}|j  |dd| gd|g|¡nt  d|¡tj  |¡s¢t"d|fƒ‚tj  |j| ¡}tj  |d¡}tj  |d¡}t  d|¡| |¡||j#kr t  d|¡|j# |¡| sŽddl}tj |jj$¡}tj  |dd¡}tj  |dd¡}t%||ƒsbt%||ƒrÆ| tj |¡¡| &||¡| &||¡n8tj  |¡sªt d|fƒ‚tj  |¡sÆt d|fƒ‚dD]>}tj  | ||¡}tj  |¡rÊt  d|¡| |¡qÊ||S) Nrgr rz.pyfú;mismatch of extension names: %s provides %r but expected %rzmodule.cz. source %s does not exist: skipping f2py'ing.rzd target %s does not exist: Assuming %smodule.c was generated with "build_src --inplace" command.ú %r missingú& Yes! Using %r as up-to-date target.Ú f2py_optionszf2py options: %szConly one .pyf file is allowed per extension module but got more: %rrzf2py: %sz --build-dirz+ skipping '%s' f2py interface (up-to-date)z f2py:> %sz--lowerz-mz3 skipping f2py fortran files for '%s' (up-to-date)z!f2py target file %r not generatedzfortranobject.czfortranobject.hr«rºrAzf2py target_c file %r not foundzf2py target_h file %r not found)z-f2pywrappers.fz-f2pywrappers2.f90)'r¡rRrMrNr„r*rr r'ÚisfileÚget_f2py_modulenamer rOr ÚdebugrPrUrrr r¬rÆr6rErHrxršr–r¸r(rZ numpy.f2pyZf2pyÚrun_mainrr r¹Ú__file__rÚ copy_file)r=r˜r°r±r¤Z f_sourcesZ f2py_targetsÚ target_dirsrÂZ skip_f2pyrr·rer¿r¡rÀrrÆržr¸Znumpyr}Ztarget_cZtarget_hZsource_cZsource_hZname_extÚfilenamer$r$r%r¤Ôs   ÿÿÿý ÿ          ÿÿ ÿÿ   ÿ  ÿ  ÿþþÿ    zbuild_src.f2py_sourcesc CsŠg}g}i}g}g}d}d|jkr8d} d} |j d¡n|jrHd} d} nd} d} d} |j d¡d} |D]} tj | ¡\}}|d krp|jr¢tj  |¡}|j }nt |j tj  |¡ƒ}|}tj  | ¡r¤t| ƒ}|| d d…krútd | || d d…fƒ‚| dkrt| ƒ} | dk} nlt| ƒ}|dkrsource %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))!r8Úremover9r¡rRrMrNr„r*rr¢r r'rÇÚget_swig_modulenamer Úget_swig_targetr rPrOÚ_find_swig_targetrrr¬r:Z find_swigr¹r¸r(rrUrƒÚspawnrÉ)r=r˜r°r±r£Z swig_targetsrÍr©Z target_extÚtypZis_cppZ skip_swigrÂrr·rer¿Z py_target_dirr¡Ztyp2rÀrr:Zswig_cmdrr¸r$r$r%r£^sÒ    ÿÿ   ÿ ÿ   ÿÿ  ý  ÿ       ÿÿ  ÿÿ zbuild_src.swig_sourcesN)Ú__name__Ú __module__Ú __qualname__Ú descriptionÚ user_optionsÚboolean_optionsÚ help_optionsr>r[r]r\rcrŒrdr`rarbr›r¦rr´rœr¥rÁr¤r£r$r$r$r%r'(sDô :$(. $ 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*-[*]-c Cs>t|dƒ*}d}| ¡}t|ƒr$d}t|ƒr0d}W5QRX|S)NrrÐrX)rÚreadlineÚ_has_cpp_headerÚ _has_c_header)rr)ÚresultÚliner$r$r%rÖÙs rÖc CsBt|dƒ.}d}|D]}t|ƒ}|r| d¡}q4qW5QRX|S)Nrr¡)rÚ_swig_module_name_matchr)rr)r¡rår#r$r$r%rÕãs  rÕcCs4dD]*}tj |d||f¡}tj |¡rq0q|S)N)rÑrÏrÒ)rMrNrOrÇ)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_]*)c CsJd}t|ƒ4}|D](}t|ƒ}|rt|ƒr,q| d¡}qsL      -ÿ   ÿÿ