o c4 @sb dZddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z ddl m ZddlmZddlmZddlZdd lmZdd lmZdd lmZmZdd lmZmZmZdd lm Z!ddlm"Z#ddlm$Z$ddl%Z&ddl'Z'ddl(Z(dgZ)ddl*Z*dddZ+e+e*,dZ-da.ddZ"ddZ/ddZ0ej*dkr8dej12e3ddga4gZ5ga6dgZ7gZ8gZ9dd gZ:d!gZ;d"d#e:DZ:d$d#e;DZ;d%d&Ze>rej1?e>Z@e*,dd(krd)ZAnd*ZAej12e@d+ZBej12eBeAd,ej12eBeAd-fD]ZCeZPWn eQefyYn'weRePSdTUZVePjWdkre8ej12d?eVg7Z8t4ej12d?eVg7a4Wdn 1swYej12ejXd!t4vrt4Ydej12ejXd!t6Zej12ejXde7Zej12ejXd@dAd#t4Da4dBd#e5DZ5dCd#t6Da6dDd#e7DZ7eZ[dEdFZ\dGdHZ]ddIdJZ^GdKdLdLeZ_GdMdNdNeZ`GdOdPdPe_ZaGdQdRdRe_ZbGdSdTdTe_ZcGdUdVdVecZdGdWdXdXe_ZeGdYdZdZe_ZfGd[d\d\e_ZgGd]d^d^e_ZhGd_d`d`egZiGdadbdbe_ZjGdcdddde_ZkGdedfdfe_ZlGdgdhdhe_ZmGdidjdje_ZnGdkddZoGdldmdmeoZpGdndodoeoZqGdpdqdqeqZrGdrdsdseqZsGdtdudueqZtGdvdwdweqZuGdxdydyeqZvGdzd{d{eqZwGd|d}d}eqZxGd~ddeoZyGdddeoZzGdddezZ{GdddezZ|GdddeoZ}Gddde}Z~Gddde}ZGddde~ZGddde}ZGdddeZGddde}ZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeoZGdddeoZdZiZddZGdddeoZGdddZGdddeeZGdddeZGdddeZGdddeoZGdddeeZGdddeZGdddeZGdddeoZGdddeoZGdddeZGdddeZGdddeZGdd„deZGddĄdeZGddƄdeZGddȄdeeZGddʄdeZGdd̄deoZGdd΄deoZGddЄdeoZGdd҄deoZGddԄdeoZGddքdeZGdd؄deZGddڄdeZGdd܄deoZGddބdeoZGdddeoZGdddeoZGdddeoZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeoZGdddeoZddZdddddZdddddZdd Zdd d Zd d dZedkr/edSdS(aZ This file defines a set of system_info classes for getting information about various resources (libraries, library directories, include directories, etc.) in the system. Usage: info_dict = get_info() where is a string 'atlas','x11','fftw','lapack','blas', 'lapack_src', 'blas_src', etc. For a complete list of allowed names, see the definition of get_info() function below. Returned info_dict is a dictionary which is compatible with distutils.setup keyword arguments. If info_dict == {}, then the asked resource is not available (system_info could not find it). Several *_info classes specify an environment variable to specify the locations of software. When setting the corresponding environment variable to 'None' then the software will be ignored, even when it is available in system. Global parameters: system_info.search_static_first - search static libraries (.a) in precedence to shared ones (.so, .sl) if enabled. system_info.verbosity - output the results to stdout if enabled. The file 'site.cfg' is looked for in 1) Directory of main setup.py file being run. 2) Home directory of user running the setup.py file as ~/.numpy-site.cfg 3) System wide directory (location of this file...) The first one found is used to get system configuration options The format is that used by ConfigParser (i.e., Windows .INI style). The section ALL is not intended for general use. Appropriate defaults are used if nothing is specified. The order of finding the locations of resources is the following: 1. environment variable 2. section in site.cfg 3. DEFAULT section in site.cfg 4. System default search paths (see ``default_*`` variables below). Only the first complete match is returned. Currently, the following classes are available, along with their section names: Numeric_info:Numeric _numpy_info:Numeric _pkg_config_info:None accelerate_info:accelerate agg2_info:agg2 amd_info:amd atlas_3_10_blas_info:atlas atlas_3_10_blas_threads_info:atlas atlas_3_10_info:atlas atlas_3_10_threads_info:atlas atlas_blas_info:atlas atlas_blas_threads_info:atlas atlas_info:atlas atlas_threads_info:atlas blas64__opt_info:ALL # usage recommended (general ILP64 BLAS, 64_ symbol suffix) blas_ilp64_opt_info:ALL # usage recommended (general ILP64 BLAS) blas_ilp64_plain_opt_info:ALL # usage recommended (general ILP64 BLAS, no symbol suffix) blas_info:blas blas_mkl_info:mkl blas_opt_info:ALL # usage recommended blas_src_info:blas_src blis_info:blis boost_python_info:boost_python dfftw_info:fftw dfftw_threads_info:fftw djbfft_info:djbfft f2py_info:ALL fft_opt_info:ALL fftw2_info:fftw fftw3_info:fftw3 fftw_info:fftw fftw_threads_info:fftw flame_info:flame freetype2_info:freetype2 gdk_2_info:gdk_2 gdk_info:gdk gdk_pixbuf_2_info:gdk_pixbuf_2 gdk_pixbuf_xlib_2_info:gdk_pixbuf_xlib_2 gdk_x11_2_info:gdk_x11_2 gtkp_2_info:gtkp_2 gtkp_x11_2_info:gtkp_x11_2 lapack64__opt_info:ALL # usage recommended (general ILP64 LAPACK, 64_ symbol suffix) lapack_atlas_3_10_info:atlas lapack_atlas_3_10_threads_info:atlas lapack_atlas_info:atlas lapack_atlas_threads_info:atlas lapack_ilp64_opt_info:ALL # usage recommended (general ILP64 LAPACK) lapack_ilp64_plain_opt_info:ALL # usage recommended (general ILP64 LAPACK, no symbol suffix) lapack_info:lapack lapack_mkl_info:mkl lapack_opt_info:ALL # usage recommended lapack_src_info:lapack_src mkl_info:mkl numarray_info:numarray numerix_info:numerix numpy_info:numpy openblas64__info:openblas64_ openblas64__lapack_info:openblas64_ openblas_clapack_info:openblas openblas_ilp64_info:openblas_ilp64 openblas_ilp64_lapack_info:openblas_ilp64 openblas_info:openblas openblas_lapack_info:openblas sfftw_info:fftw sfftw_threads_info:fftw system_info:ALL umfpack_info:umfpack wx_info:wx x11_info:x11 xft_info:xft Note that blas_opt_info and lapack_opt_info honor the NPY_BLAS_ORDER and NPY_LAPACK_ORDER environment variables to determine the order in which specific BLAS and LAPACK libraries are searched for. This search (or autodetection) can be bypassed by defining the environment variables NPY_BLAS_LIBS and NPY_LAPACK_LIBS, which should then contain the exact linker flags to use (language will be set to F77). Building against Netlib BLAS/LAPACK or stub files, in order to be able to switch BLAS and LAPACK implementations at runtime. If using this to build NumPy itself, it is recommended to also define NPY_CBLAS_LIBS (assuming your BLAS library has a CBLAS interface) to enable CBLAS usage for matrix multiplication (unoptimized otherwise). Example: ---------- [DEFAULT] # default section library_dirs = /usr/lib:/usr/local/lib:/opt/lib include_dirs = /usr/include:/usr/local/include:/opt/include src_dirs = /usr/local/src:/opt/src # search static libraries (.a) in preference to shared ones (.so) search_static_first = 0 [fftw] libraries = rfftw, fftw [atlas] library_dirs = /usr/lib/3dnow:/usr/lib/3dnow/atlas # for overriding the names of the atlas libraries libraries = lapack, f77blas, cblas, atlas [x11] library_dirs = /usr/X11R6/lib include_dirs = /usr/X11R6/include ---------- Note that the ``libraries`` key is the default setting for libraries. Authors: Pearu Peterson , February 2002 David M. Cooke , April 2002 Copyright 2002 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the NumPy (BSD style) license. See LICENSE.txt that came with this distribution for specifics. NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. N)glob)reduce) NoOptionError)RawConfigParser)DistutilsError) Distribution)log) get_platform)find_executablefilepath_from_subprocess_output) is_sequence is_stringget_shared_lib_extension)config)customized_ccompiler) _shell_utils system_info @)32bit64bitcCststatSN)global_compiler_customized_ccompilerrr=/usr/lib/python3/dist-packages/numpy/distutils/system_info.pyrsrcCs.|dd}|dd}|dd}d|S)zS Convert a python string into a literal suitable for inclusion into C code \z\\"z\" z\nz"{}")replaceformat)srrr_c_string_literals    r"cCs@|dvrtd|dkr|Sg}|D] }||d|gq|S)aReturn a list of library paths valid on 32 or 64 bit systems. Inputs: paths : sequence A sequence of strings (typically paths) bits : int An integer, the only valid values are 32 or 64. A ValueError exception is raised otherwise. Examples: Consider a list of directories >>> paths = ['/usr/X11R6/lib','/usr/X11/lib','/usr/lib'] For a 32-bit platform, this is already valid: >>> np.distutils.system_info.libpaths(paths,32) ['/usr/X11R6/lib', '/usr/X11/lib', '/usr/lib'] On 64 bits, we prepend the '64' postfix >>> np.distutils.system_info.libpaths(paths,64) ['/usr/X11R6/lib64', '/usr/X11R6/lib', '/usr/X11/lib64', '/usr/X11/lib', '/usr/lib64', '/usr/lib'] )rrz+Invalid bit size in libpaths: 32 or 64 onlyr64) ValueErrorextend)pathsbitsoutprrrlibpathssr*win32zC:\ exec_prefixlibs.includezinclude/suitesparselibcCg|] }|dtjqS/rossep.0drrr r:cCr1r2r4r7rrrr: r;cs@tjtfddtDtfddtDdS)z5Add a package manager root to the include directoriesc3|] }tj|VqdSrr5pathjoinr7 library_rootrr ( z"add_system_root..c3r<rr=r7r@rrrB*rCN)r5r>normpathdefault_lib_dirsr% _lib_dirsdefault_include_dirs _include_dirsr@rr@radd_system_root!s  rIvcpkgrx86x64 installedz-windowsz-windows-staticconda..Library)z/usr/local/libz/opt/lib/usr/libz/opt/local/libz/sw/lib)z/usr/local/includez /opt/includez /usr/includez/opt/local/include/ufsparsez/opt/local/includez /sw/includez/usr/include/suitesparse)r.z/usr/local/srcz/opt/srcz/sw/src)z/usr/X11R6/libz /usr/X11/librQz/usr/X11R6/includez/usr/X11/include/usr/includez /usr/lib/X11z/usr/lib/*/libX11.soz/usr/lib/X11/includez/usr/include/X11wgccz-print-multiarch)stdoutstderrz /usr/lib/srccCg|] }tj|r|qSrr5r>isdirr8_mrrrr:scCrWrrXrZrrrr:tr\cCrWrrXrZrrrr:ur\cCrWrrXrZrrrr:vr\cCsg}zt}Wntytjd}Ynwtjtjtj|d|}tj |r1| |ztj d}Wn t yBYnwtj||}tj |rU| |tj |rd| tj||S)zReturns a list of files named 'fname' from 1) System-wide directory (directory-location of this module) 2) Users HOME directory (os.environ['HOME']) 3) Local directory r~) __file__ NameErrorsysargvr5r>r?splitabspathisfileappend expanduserKeyError)fname filenamesfsysfile user_filerrrget_standard_file{s,       rmc CsDtj|d}dd|D}|dur|gfS|dp|d}t|}|d|d}|rE|dkr>td|d||dd}n|d krStd|d ||d }g}|r| }|D]} | siqd| |vrs| | qd| |vr|| | qd||fSg}|D]} | sq| |vr| | q| |vr| | q||fS) aE Parse an environment variable `env` by splitting with "," and only returning elements from `base_order` This method will sequence the environment variable and check for their invidual elements in `base_order`. The items in the environment variable may be negated via '^item' or '!itema,itemb'. It must start with ^/! to negate all options. Raises ------ ValueError: for mixed negated and non-negated orders or multiple negated orders Parameters ---------- base_order : list of str the base list of orders env : str the environment variable to be parsed, if none is found, `base_order` is returned Returns ------- allow_order : list of str allowed orders in lower-case unknown_order : list of str for values not overlapping with `base_order` NcSg|]}|qSr)lower)r8orderrrrr:z$_parse_env_order..^!zEnvironment variable 'z1' may only contain a single (prefixed) negation: rz,' may not mix negated an non-negated items: ,) r5environget startswithlistcountr$rorbcopyreremove) base_orderenv order_strneg order_str_lsum_negorders unknown_order allow_orderrprrr_parse_env_ordersL    rcCsidtdtdtdtdtdtdtdtd td t d t d t d t dt dtdtdtidtdtdtdtdtdtdtdtdtdtdtdtdtdtd td!t d"t!id#t"d$t#d%t$d&t%d't&d(t'd)t(d*t)d+t*d,t*d-t+d.t,d/t-d0t.d1t/d2t0d3t1id4t2d5t3d6t4d7t5d8t6d9t7d:t8d;t8dt:d?t;d@t;dAt<dBt<dCt=dDt=t>t>t?t@tAtBdEC|DtE}|F|S)Fzg notfound_action: 0 - do nothing 1 - display warning message 2 - raise error atlas atlas_threads atlas_blasatlas_blas_threads lapack_atlaslapack_atlas_threads atlas_3_10atlas_3_10_threadsatlas_3_10_blasatlas_3_10_blas_threadslapack_atlas_3_10lapack_atlas_3_10_threadsflamemklopenblasopenblas_lapackopenblas_clapackblis lapack_mklblas_mkl accelerate openblas64_openblas64__lapackopenblas_ilp64openblas_ilp64_lapackx11fft_optfftwfftw2fftw3dfftwsfftw fftw_threads dfftw_threads sfftw_threadsdjbfftblaslapack lapack_srcblas_srcnumpyf2pyNumericnumericnumarraynumerix lapack_optlapack_ilp64_optlapack_ilp64_plain_opt lapack64__optblas_optblas_ilp64_optblas_ilp64_plain_opt blas64__opt boost_pythonagg2wxgdk_pixbuf_xlib_2gdk-pixbuf-xlib-2.0 gdk_pixbuf_2gdk-pixbuf-2.0gdkgdk_2gdk-2.0 gdk_x11_2 gdk-x11-2.0 gtkp_x11_2 gtk+-x11-2.0)gtkp_2gtk+-2.0xft freetype2umfpackamd)G atlas_infoatlas_threads_infoatlas_blas_infoatlas_blas_threads_infolapack_atlas_infolapack_atlas_threads_infoatlas_3_10_infoatlas_3_10_threads_infoatlas_3_10_blas_infoatlas_3_10_blas_threads_infolapack_atlas_3_10_infolapack_atlas_3_10_threads_info flame_infomkl_info openblas_infoopenblas_lapack_infoopenblas_clapack_info blis_infolapack_mkl_info blas_mkl_infoaccelerate_infoopenblas64__infoopenblas64__lapack_infoopenblas_ilp64_infoopenblas_ilp64_lapack_infox11_info fft_opt_info fftw_info fftw2_info fftw3_info dfftw_info sfftw_infofftw_threads_infodfftw_threads_infosfftw_threads_info djbfft_info blas_info lapack_infolapack_src_info blas_src_info numpy_info f2py_info Numeric_info numarray_info numerix_infolapack_opt_infolapack_ilp64_opt_infolapack_ilp64_plain_opt_infolapack64__opt_info blas_opt_infoblas_ilp64_opt_infoblas_ilp64_plain_opt_infoblas64__opt_infoboost_python_info agg2_infowx_infogdk_pixbuf_xlib_2_infogdk_pixbuf_2_infogdk_info gdk_2_infogdk_x11_2_infogtkp_x11_2_info gtkp_2_infoxft_infofreetype2_info umfpack_infoamd_inforwrorget_info)namenotfound_actionclrrrrs"      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEF L Mrc@eZdZdZdS) NotFoundErrorz1Some third-party program or library is not found.N__name__ __module__ __qualname____doc__rrrrrIrc@r)AliasedOptionErrorz Aliases entries in config files should not be existing. In section '{section}' we found multiple appearances of options {options}.Nrrrrrr Mrr c@r)AtlasNotFoundErrorz Atlas (http://github.com/math-atlas/math-atlas) libraries not found. Directories to search for the libraries can be specified in the numpy/distutils/site.cfg file (section [atlas]) or by setting the ATLAS environment variable.Nrrrrrr!Srr!c@r)FlameNotFoundErrorz FLAME (http://www.cs.utexas.edu/~flame/web/) libraries not found. Directories to search for the libraries can be specified in the numpy/distutils/site.cfg file (section [flame]).Nrrrrrr"[rr"c@r)LapackNotFoundErrorz Lapack (http://www.netlib.org/lapack/) libraries not found. Directories to search for the libraries can be specified in the numpy/distutils/site.cfg file (section [lapack]) or by setting the LAPACK environment variable.Nrrrrrr#brr#c@r)LapackSrcNotFoundErrorz Lapack (http://www.netlib.org/lapack/) sources not found. Directories to search for the sources can be specified in the numpy/distutils/site.cfg file (section [lapack_src]) or by setting the LAPACK_SRC environment variable.Nrrrrrr$jrr$c@r)LapackILP64NotFoundErrorz 64-bit Lapack libraries not found. Known libraries in numpy/distutils/site.cfg file are: openblas64_, openblas_ilp64 Nrrrrrr%rrr%c@r)BlasOptNotFoundErrorz Optimized (vendor) Blas libraries are not found. Falls back to netlib Blas library which has worse performance. A better performance should be easily gained by switching Blas library.Nrrrrrr&yrr&c@r)BlasNotFoundErrorz Blas (http://www.netlib.org/blas/) libraries not found. Directories to search for the libraries can be specified in the numpy/distutils/site.cfg file (section [blas]) or by setting the BLAS environment variable.Nrrrrrr'rr'c@r)BlasILP64NotFoundErrorz 64-bit Blas libraries not found. Known libraries in numpy/distutils/site.cfg file are: openblas64_, openblas_ilp64 Nrrrrrr(rr(c@r)BlasSrcNotFoundErrorz Blas (http://www.netlib.org/blas/) sources not found. Directories to search for the sources can be specified in the numpy/distutils/site.cfg file (section [blas_src]) or by setting the BLAS_SRC environment variable.Nrrrrrr)rr)c@r)FFTWNotFoundErrorz FFTW (http://www.fftw.org/) libraries not found. Directories to search for the libraries can be specified in the numpy/distutils/site.cfg file (section [fftw]) or by setting the FFTW environment variable.Nrrrrrr*rr*c@r)DJBFFTNotFoundErrorz DJBFFT (https://cr.yp.to/djbfft.html) libraries not found. Directories to search for the libraries can be specified in the numpy/distutils/site.cfg file (section [djbfft]) or by setting the DJBFFT environment variable.Nrrrrrr+rr+c@r)NumericNotFoundErrorzw Numeric (https://www.numpy.org/) module not found. Get it from above location, install it, and retry setup.py.Nrrrrrr,rr,c@r)X11NotFoundErrorzX11 libraries not found.Nrrrrrr-rr-c@r)UmfpackNotFoundErrora UMFPACK sparse solver (https://www.cise.ufl.edu/research/sparse/umfpack/) not found. Directories to search for the libraries can be specified in the numpy/distutils/site.cfg file (section [umfpack]) or by setting the UMFPACK environment variable.Nrrrrrr.rr.c@seZdZdZdZdZdZiZeZ e e fddZ ddZ d d Zd d Zd dZddZddZd6ddZddZd7ddZd8ddZd9ddZd:d!d"Zd#d$Zd;d&d'Zd(d)Zgfd*d+Zgfd,d-Zd.d/Zd0d1Zd2d3Z d4d5Z!dS).rtTrNz[{}]z, )rDoptions)sumindexr rr rDr?)rHrbfoundrrNrget_option_singles   zsystem_info.get_option_singlecCs|jj|jvSr)r9rr\rNrrrhas_info.zsystem_info.has_infocCsJi}dD]}|j|j|}tj|}|r"||i}t|fi|q|S)z Updates the information in the current information with respect to these flags: extra_compile_args extra_link_args )r7r8)rArwrDr NativeParserrbrU)rHr:rOratmprrrr[1s zsystem_info.calc_extra_infocCs2d}|sRd}t|jjdt|dr||r?|s?|dkr.tj|j j ddn|dkr9| |j j t t ||sMtd| ntd|j|jj}ttjkr|r|D]'\}}t|}|d vrt|d kr|d d d |dd }td||qgtdt|S)zv Return a dictionary with items that are compatible with numpy.distutils.setup keyword arguments. rrt: calc_info stacklevelz NOT AVAILABLEz FOUND:)sourcesrPiNxz ... ... ...iz %s = %sr0)rgrr:r9rhasattrrlwarningswarn notfounderrorrr$reprr_r\rw get_thresholdINFOitemsr?lenr{deepcopy)rHrflagreskvrrrrAs4       zsystem_info.get_infocCs6|j||tj}|j}|r9t|r9|d}|D] }|tjvr%|}nq|d|ks7t d|d|f|}|r|tjvrtj|}|dkrWt d|j j d|fgStj |rtj |g|}t|dg}t|dkrtj |} tj | d} | dd d krt d |jd| d df| d d|jd<n3|tj} g} | D]$}tj |r| |d D]} tj || } tj | r| | qq| |}|j|j|tj}||g}|D]$}t|dkrtj |stjd |ddq||vr||qtd|d||S)Nrz Setting %s=%sNonezDisabled %s: %sz (%s is None) _lib_namesrtr0z#Replacing _lib_names[0]==%r with %r)r/r0zSpecified path %s is invalid.rmrnz ( %s = %s )rk)rArwrbr5r< dir_env_varr rvrr:r9rr>rddirnamegetattrrzbasenamesplitextrrYrer?rDr%rsrtdebug)rHrDrOrWenv_vare0er9lbdsds2ddd1 default_dirsretrrr get_pathsesr               zsystem_info.get_pathsr1cC||j|SrrrDrHrOrrrrRrhzsystem_info.get_lib_dirsr3cCs ||j|}|dgkrg}|S)Nr0r)rHrOr>rrrrSs z system_info.get_runtime_lib_dirsr2cCrrrrrrrget_include_dirsrhzsystem_info.get_include_dirsr5cCrrrrrrr get_src_dirsrhzsystem_info.get_src_dirscCshz |j|j|}Wnty$|sgYSt|r |gYS|YSwdddd|dDDS)NcSsg|]}|r|qSrr)r8rrrrr:rqz(system_info.get_libs..cSrnr)strip)r8arrrr:rqru)rArwrDrr rb)rHrOdefaultr-rrrget_libss  zsystem_info.get_libsrPcCs&t|dr |j||jdS||dS)Nr)rr0)rrrrrrrrrQs  zsystem_info.get_librariescCszt}g}|jdkr|dtjdkr|d|jr"|tg}ntg|}tjdkr1|dtjdkr;|d|S) Nmsvc.ar+.libcygwin.dll.adarwinz.dylib)r compiler_typerer`platformr6so_ext)rHc static_extsextsrrrlibrary_extensionss          zsystem_info.library_extensionscCsP|}d}|D]}|||||g}|durnq|s&tdd|||S)zIf static or shared libraries are available then return their info dictionary. Checks for all libraries as shared libraries first, then static (or vice versa if self.search_static_first is True). N libraries %s not found in %srur _check_libsrr:r?)rHlib_dirsr-opt_libsrr:extrrrrTszsystem_info.check_libscCs4|}|||||}|stdd|||S)zIf static or shared libraries are available then return their info dictionary. Checks each library for shared or static. rrur)rHrr-rrr:rrr check_libs2szsystem_info.check_libs2cCst|sJtjdkrddg}ndg}|D]3}|D]}|||||}|r)nq|rHt|dks4J|dkr<|d7}|dkrD||}|SqdS) Nr+r0r0rtrz.dllrF)r r`r combine_pathsrz)rHlib_dirr0r lib_prefixesrprefixr)rrr _find_libs&    zsystem_info._find_libc CsXgg}}|D] }|D]}||||}|r&||||vr$||nq q||fSr)rre) rHrr-r found_dirs found_libsr0r found_librrr _find_libss   zsystem_info._find_libsc Cst|s|g}||||\}}t|dkrAt|t|krA||||\}}|||D] } | |vr9|| q.||d} | SdS)zxFind mandatory and optional libs in expected paths. Missing optional libraries are silently forgotten. rrPr1N)r rrzr%re) rHrr-rrrropt_found_dirsopt_found_libsrr:rrrrs   zsystem_info._check_libscGst|S)zjReturn a list of existing paths composed by all combinations of items from the arguments. )r)rHargsrrrr)szsystem_info.combine_pathsrr1)r3r2)r5rP)"rrrrrr6rDr\rrurErGrJrCrZr_rfrgr[rrrRrSrrrrQrrTrrrrrrrrrrs>    $ 7       c@eZdZddZdS)rcCsdi}tdp tdp td}td}|r0t|fi||r&t|fi||jdi|dSdS)Nrrrrr)rrUr_)rHr:rrrrrrl2szfft_opt_info.calc_infoNrrrrlrrrrr0s rc@sTeZdZdZdZeZddgdgdgddddgd d gd gdgZd d ZddZ dS)rrFFTWrfftw3.h SCIPY_FFTW3_HNrr-includesmacrosrrfftwfftw.hrfftw.h SCIPY_FFTW_HNc Cs|}|}||jdd}|||d}|||}|durRd}|D]}t|||dt|dkrDt||gdd}nq'|rPt||d d nd}|dur`|j di|d St d |d dS)z8Returns True on successful version detection, else False_libsrPr-Nrrrrtr define_macrosTz %s not foundrFr) rRrrfrDrrTrzrrUr_rr:) rH ver_paramr incl_dirsrar-r:r|r9rrr calc_ver_infoLs.  zfftw_info.calc_ver_infocCs |jD] }||r dSqdSr)ver_infor)rHrYrrrrlgs  zfftw_info.calc_infoN) rrrrDrr*rurrrlrrrrr>s" rc@s2eZdZdZdZeZdddgddgdgdgZd S) rrrrrrrrrNrrrrDrr*rurrrrrrms rc@s.eZdZdZdZeZddgdgdgdgZdS)rrFFTW3rrrNrrrrrrys rc@.eZdZdZdZdddgddgdgdgZd S) rrrrdrfftwzdfftw.hzdrfftw.h) SCIPY_DFFTW_HNrNrrrrDrrrrrrr rc@r) rrrrsrfftwzsfftw.hzsrfftw.h) SCIPY_SFFTW_HNrNrrrrrrrrc@.eZdZdZdZdddgddgdgd gZd S) rrrz fftw threads rfftw_threadsrzfftw_threads.hzrfftw_threads.h)SCIPY_FFTW_THREADS_HNrNrrrrrrrrc@r) rrrz dfftw threadsdrfftw_threadsrzdfftw_threads.hzdrfftw_threads.h)SCIPY_DFFTW_THREADS_HNrNrrrrrrrrc@r) rrrz sfftw threadssrfftw_threadsrzsfftw_threads.hzsrfftw_threads.h)SCIPY_SFFTW_THREADS_HNrNrrrrrrrrc@(eZdZdZdZeZddZddZdS)rrDJBFFTcCsDt|||}g}|D]}|||dg|gq dd|DS)NrcSrWrrXr7rrrr:r\z)djbfft_info.get_paths..rrr%rrHrDrOpre_dirsrWr9rrrr zdjbfft_info.get_pathscCs|}|}d}|D]&}||dg}|rd|i}n||ddtg}|r2dg|gd}nq |dur9dS|D]"}t||ddgd kr]t||gd gd |jd i|dSq;dS) Nzdjbfft.a extra_objectsz libdjbfft.a libdjbfftrrzfftc8.hz fftfreq.hrm)SCIPY_DJBFFT_HN)r2rr)rRrrrrzrUr_)rHrrr:r9r)rrrrls0zdjbfft_info.calc_infoN) rrrrDrr+rurrlrrrrrs  rc@s2eZdZdZdZdgZddZddZdd Zd S) rrMKLROOTmkl_rtc CsHtjdd}|dur |Stjddtj}d}tj|rEt|d}|D] }|}|r5| |q(Wdn1s@wYg}|D](}|tj }|D]} | drptj |d| | d}| |nqSqI|D]-}ttj |dd} | ttj |d 7} | D]} tjtj | d r| SqqtdS) NrLD_LIBRARY_PATHr0z/etc/ld.so.confrrrm*zmkl*r0)r5rvrwrbr<r>rdopenrrer6rxr?rdrrY) rHmklrootr& ld_so_confrjr9intel_mkl_dirsr> path_atomsmrWsub_dirrrrget_mkl_rootdirsB       zmkl_info.get_mkl_rootdircCs|}|durt|dSddlm}|rd}n |r'|r'd}nd}tj|tj |d|gtj |dgddS) Nrt)cpur#intel6432r0r/rErG) rrrJcpuinfor is_Itaniumis_Intelis_64bitr5r>r?)rHrrpltrrrrJs  zmkl_info.__init__cCs|}|}|dd}|||j}|||}|dur!dSt|ddg|dtjdkr0nt|dgd|j d i|dS) Nmkl_libsrP) SCIPY_MKL_HN HAVE_CBLASN)rr2r+pthreadrr) rRrrfr_lib_mklrrUr`rr_)rHrrrarr:rrrrls"   zmkl_info.calc_infoN) rrrrDrr rrJrlrrrrrs rc@ eZdZdS)rNrrrrrrrrrc@r)rNrrrrrrrrc@s\eZdZdZdZddgZejdddkrdgZd gZ ndgZd gZ e Z d d Z d dZ dS)rrATLASf77blascblasNfreebsdatlas_r alapack_rrcCsFt|||}g}|D]}|||gd|gq dd|DS)N)atlas*ATLAS*sse3dnowsse2cSrWrrXr7rrrr:6r\z(atlas_info.get_paths..rrrrrr0szatlas_info.get_pathscCs|}i}|dd}|||j|j}|d|j}d}d}d}|D]1} || dgg} || |g}|durR| g|| ddg} || |g}|durRn|rV|}q%t |j |durc|}|duridS| } ||| dpwdg} | d} | rt j | } t|| gd d |d <|durt|fi|t|fi|nDd|dvrt|fi|t|d gd |jdi|dSt|fi|t|dgd td}tj|dd|jdi|dS|dd}|dd}d}dg}tjdkr|d|D]$}|D]}t j ||||}t j |r$|}nq |r+nq|durUt |d}|dkrQtd||df}tj|ddnd|d <tdi|\}}t|fi||jdi|dS)N atlas_libsrP lapack_libsrrrcblas.hrrrlanguageATLAS_WITH_LAPACK_ATLASNrATLAS_WITHOUT_LAPACKNa ********************************************************************* Could not find lapack library within the ATLAS installation. ********************************************************************* rmrnr1r0r+r0i>a ********************************************************************* Lapack library (from ATLAS) is probably incomplete: size of %s is %sk (expected >4000k) Follow the instructions in the KNOWN PROBLEMS section of the file numpy/INSTALL.txt. ********************************************************************* if77r)rRrfrr _lib_atlas _lib_lapackrrrr:r9rr5r>rrUr_textwrapdedentrsrtr`rrerr?existsstatget_atlas_version)rHrr:rarrrratlas_1r9r lib_dirs2r2hmessage lapack_dir lapack_name lapack_librrrfnsz atlas_versionatlas_extra_inforrrrl8s              zatlas_info.calc_info)rrrrDrrr`rr'r(r!rurrlrrrrr#s rc@seZdZddgZddZdS)rrrc Cs|}i}|dd}|||j|j}|||g}|dur#dS|}|||dp1dg}|d}|rEtj |}t ||gdd|d<dg|d <t d i|\}} t |fi| t |fi||j d i|dS) NrrPrrrrr r rr)rRrfrrr'rrrr5r>rrUr-r_ rHrr:rarrr2r0r7r8rrrrls(   zatlas_blas_info.calc_infoNrrrrrlrrrrrs rc@eZdZddgZddgZdS)rPTATLASr ptf77blasptcblasNrrrrrrrrrr rc@r;)rr<rr=r>Nr?rrrrrr@rc@eZdZdgejZdS)rrN)rrrrrrrrrrrc@rA)rrN)rrrrrrrrrrrBrc@seZdZdgZeZeZdS)rsatlasN)rrrrr'r(rrrrrsrc@seZdZdgZddZdS)rrCc Cs|}i}|dd}|||j}|||g}|dur dS|}|||dp.dg}|d}|rBtj |}t ||gdd|d<dg|d <t d i|\}} t |fi| t |fi||j d i|dS) N atlas_librPrrrrr r rr) rRrfrrrrrr5r>rrUr-r_r9rrrrls(   zatlas_3_10_blas_info.calc_infoNr:rrrrrs rc@s"eZdZddgZdgZeZeZdS)rr<rtatlasN)rrrrrr'r(rrrrrs rc@seZdZddgZdgZdS)rr<rrENr?rrrrrs rc@r)rNrrrrrrrrc@r)rNrrrrrrrrc@&eZdZdZdZdgZeZddZdS)rrLAPACKcCsX|}|dd}|||j}|||g}|durdSd|d<|jdi|dS)NrrPr&r r)rRrfrrrTr_)rHrrarr:rrrrls zlapack_info.calc_infoN) rrrrDrrr#rurlrrrrr  rc@r)rr LAPACK_SRCc CsFt|||}g}|D]}||g||ddgq dd|DS)Nz LAPACK*/SRCSRCcSrWrrXr7rrrr:r\z-lapack_src_info.get_paths..rrrrrrs zlapack_src_info.get_pathscs|}d|D]}tjtj|dr|nqsdSd}d}d}d}d}|d}|d } ||} ||} ||d } ||d } d }d }dd|| Ddd| | Ddd| Ddd| Ddd|||D}fdd|D}tjdd|fdddD7}|fdddD7}|fdddD7}|fdddD7}dd|D}|dd}|jdi|dS) Nr0zdgesv.fzB ilaenv ieeeck lsame lsamen xerbla iparmq a bdsdc bdsqr disna labad lacpy ladiv lae2 laebz laed0 laed1 laed2 laed3 laed4 laed5 laed6 laed7 laed8 laed9 laeda laev2 lagtf lagts lamch lamrg lanst lapy2 lapy3 larnv larrb larre larrf lartg laruv las2 lascl lasd0 lasd1 lasd2 lasd3 lasd4 lasd5 lasd6 lasd7 lasd8 lasd9 lasda lasdq lasdt laset lasq1 lasq2 lasq3 lasq4 lasq5 lasq6 lasr lasrt lassq lasv2 pttrf stebz stedc steqr sterf larra larrc larrd larr larrk larrj larrr laneg laisnan isnan lazq3 lazq4 a gbbrd gbcon gbequ gbrfs gbsv gbsvx gbtf2 gbtrf gbtrs gebak gebal gebd2 gebrd gecon geequ gees geesx geev geevx gegs gegv gehd2 gehrd gelq2 gelqf gels gelsd gelss gelsx gelsy geql2 geqlf geqp3 geqpf geqr2 geqrf gerfs gerq2 gerqf gesc2 gesdd gesv gesvd gesvx getc2 getf2 getrf getri getrs ggbak ggbal gges ggesx ggev ggevx ggglm gghrd gglse ggqrf ggrqf ggsvd ggsvp gtcon gtrfs gtsv gtsvx gttrf gttrs gtts2 hgeqz hsein hseqr labrd lacon laein lags2 lagtm lahqr lahrd laic1 lals0 lalsa lalsd langb lange langt lanhs lansb lansp lansy lantb lantp lantr lapll lapmt laqgb laqge laqp2 laqps laqsb laqsp laqsy lar1v lar2v larf larfb larfg larft larfx largv larrv lartv larz larzb larzt laswp lasyf latbs latdf latps latrd latrs latrz latzm lauu2 lauum pbcon pbequ pbrfs pbstf pbsv pbsvx pbtf2 pbtrf pbtrs pocon poequ porfs posv posvx potf2 potrf potri potrs ppcon ppequ pprfs ppsv ppsvx pptrf pptri pptrs ptcon pteqr ptrfs ptsv ptsvx pttrs ptts2 spcon sprfs spsv spsvx sptrf sptri sptrs stegr stein sycon syrfs sysv sysvx sytf2 sytrf sytri sytrs tbcon tbrfs tbtrs tgevc tgex2 tgexc tgsen tgsja tgsna tgsy2 tgsyl tpcon tprfs tptri tptrs trcon trevc trexc trrfs trsen trsna trsyl trti2 trtri trtrs tzrqf tzrzf lacn2 lahr2 stemr laqr0 laqr1 laqr2 laqr3 laqr4 laqr5 a laexc lag2 lagv2 laln2 lanv2 laqtr lasy2 opgtr opmtr org2l org2r orgbr orghr orgl2 orglq orgql orgqr orgr2 orgrq orgtr orm2l orm2r ormbr ormhr orml2 ormlq ormql ormqr ormr2 ormr3 ormrq ormrz ormtr rscl sbev sbevd sbevx sbgst sbgv sbgvd sbgvx sbtrd spev spevd spevx spgst spgv spgvd spgvx sptrd stev stevd stevr stevx syev syevd syevr syevx sygs2 sygst sygv sygvd sygvx sytd2 sytrd a bdsqr hbev hbevd hbevx hbgst hbgv hbgvd hbgvx hbtrd hecon heev heevd heevr heevx hegs2 hegst hegv hegvd hegvx herfs hesv hesvx hetd2 hetf2 hetrd hetrf hetri hetrs hpcon hpev hpevd hpevx hpgst hpgv hpgvd hpgvx hprfs hpsv hpsvx hptrd hptrf hptri hptrs lacgv lacp2 lacpy lacrm lacrt ladiv laed0 laed7 laed8 laesy laev2 lahef lanhb lanhe lanhp lanht laqhb laqhe laqhp larcm larnv lartg lascl laset lasr lassq pttrf rot spmv spr stedc steqr symv syr ung2l ung2r ungbr unghr ungl2 unglq ungql ungqr ungr2 ungrq ungtr unm2l unm2r unmbr unmhr unml2 unmlq unmql unmqr unmr2 unmr3 unmrq unmrz unmtr upgtr upmtr z econd z secnd z srot srscl z drot drscl z icmax1 scsum1 z izmax1 dzsum1 cSg|]}d|qS)zs%s.frr8rjrrrr:mrqz-lapack_src_info.calc_info..cSrK)zd%s.frrLrrrr:nrqcSrK)zc%s.frrLrrrr:orqcSrK)zz%s.frrLrrrr:prqcSrK)z%s.frrLrrrr:qrqcsg|] }tj|qSrr=rLsrc_dirrrr:rr;rOINSTALLcg|] }tj|dqS)zlamch.fr=r8r))src_dir2rrr:usdczcrP)zlarfp.fr=rQrMrrr:wrSc"g|] }tjd|dqS)ilazlr.fr=rQrMrrr:x"crU)rVzlc.fr=rQrMrrr:yrWcSrWrr5r>rdrLrrrr:}r\r&rpr rrr5r>rdr?rbr_)rHr5r9allauxlauxlasrcsd_lasrccz_lasrcsclauxdzlauxslasrcdlasrcclasrczlasrcoclasrcozlasrcrpr:r)rNrRrrlsP      zlapack_src_info.calc_infoN) rrrrDrr$rurrlrrrrr   rz /* This file is generated from numpy/distutils/system_info.py */ void ATL_buildinfo(void); int main(void) { ATL_buildinfo(); return 0; } c Ks|dg}|dg}t|t|f}|tvrt|Stt}d}i}z7|jt||d\}}|r[td|tj r[|jt|dg|d\}}|s[t j t dddt|d d gd WnGty|D]}td |} | rt| d }|durznqe|durtjdd}|rt|dt|fgdnt|dgd|pd|fYSw|std|} | r| d }|durtd|tj rd}n$td|td|n|dkrt|dgdn t|dt|fgd||f} t|<| S)NrPr1rz!undefined reference to `_gfortrangfortrana ***************************************************** Linkage with ATLAS requires gfortran. Use python setup.py config_fc --fcompiler=gnu95 ... when building extension libraries that use ATLAS. Make sure that -lgfortran is used for C++ extensions. ***************************************************** rmrnf90)ATLAS_REQUIRES_GFORTRANN)r rz#ATLAS_(?P\d+[.]\d+[.]\d+)_version ATLAS_VERSION ATLAS_INFOr) NO_ATLAS_INFOrz?.?.?z*ATLAS version (?P\d+[.]\d+[.]\d+)zundefined symbol: ATL_buildinfoz3.2.1_pre3.3.6z Status: %dz Output: %s)ro)rwtuple_cached_atlas_version cmd_configr get_outputatlas_version_c_textresearchMrsrtr)r*rU Exceptiongroupr5rvr"rr:) rrPr1rOrr7r:r!orresultrrrr-st                r-c@steZdZeZgdZdZddZddZddZ d d Z d d Z d dZ ddZ ddZddZddZddZdS)r)rrrrrrNPY_LAPACK_ORDERcC$td}|r|jdi|dSdS)NrTFrrr_rHr:rrr_calc_info_mkl zlapack_opt_info._calc_info_mklcCsDtd}|r|jdi|dStd}|r |jdi|dSdS)NrTrFrrrrrr_calc_info_openblassz#lapack_opt_info._calc_info_openblascCr~)NrTFrrrrrr_calc_info_flamerz lapack_opt_info._calc_info_flamecCstd}|s td}|std}|std}|r@|dg}d|vs&d|vr6|}|s.dSt|fi||jd i|d SdS) Nrrrrrr!r#FTr)rrw_get_info_lapackrUr_)rHr:rrrrr_calc_info_atlass$ z lapack_opt_info._calc_info_atlascCr~NrTFrrrrrr_calc_info_acceleraterz%lapack_opt_info._calc_info_acceleratecCZtd}|s+tjtjp dddtd}|s"tjtjpdddiSt|d|fgd|S)Nrr0rrnr fblas_srcr)rrsrtr'rr)rUrHr:info_srcrrr_get_info_blasszlapack_opt_info._get_info_blascCr)Nrr0rrnr flapack_srcr)rrsrtr#rr$rUrrrrr#sz lapack_opt_info._get_info_lapackcCsJ|}|r#|}t|fi|t|dgd|jdi|dSdS)NrortrTFr)rrrUr_)rHr: info_blasrrr_calc_info_lapack.sz!lapack_opt_info._calc_info_lapackcCsJi}d|d<g|d<g|d<g|d<tjd|d<|jd i|dS) Nr&r rPr2rNPY_LAPACK_LIBSr8Tr)r5rvrbr_rrrr_calc_info_from_envvar8sz&lapack_opt_info._calc_info_from_envvarcCt|d|SNz _calc_info_{}rr rHrrrr _calc_infoBzlapack_opt_info._calc_infocCt|j|j\}}t|dkrtd|dtjvr!|dS|D] }| |r-dSq#d|vrHt j t j p8dddt j tj pBddddSdS)NrzElapack_opt_info user defined LAPACK order has unacceptable values: {}rrr0rmrn)r lapack_orderorder_env_var_namerzr$r r5rvrrrsrtr#rr$)rHrrrrrrrlEs    zlapack_opt_info.calc_infoN)rrrr#rurrrrrrrrrrrrrlrrrrrs     rc@seZdZdZdZddZdS)_ilp64_opt_info_mixinNcCsTt|dg}|dd}|dd}|jd|fvrdS|jd|fvr&dSt|S)NrBLAS_SYMBOL_PREFIXr0BLAS_SYMBOL_SUFFIXF)dictrw symbol_prefix symbol_suffixbool)rHr:rrsuffixrrr _check_infoas  z!_ilp64_opt_info_mixin._check_info)rrrrrrrrrrr]s rc@$eZdZeZddgZdZddZdS)rrrNPY_LAPACK_ILP64_ORDERcCs.t|d}||r|jdi|dSdS)N_lapackTFrrrr_rHrr:rrrrts  z lapack_ilp64_opt_info._calc_infoN)rrrr%rurrrrrrrro  rc@eZdZdZdZdS)rr0Nrrrrrrrrrr|src@eZdZdZdZdS)rr064_Nrrrrrrrc@sdeZdZeZgdZdZddZddZddZ d d Z d d Z d dZ ddZ ddZddZdS)r)rrrrrrNPY_BLAS_ORDERcCr~)NrTFrrrrrrrrzblas_opt_info._calc_info_mklcCr~)NrTFrrrrrr_calc_info_blisrzblas_opt_info._calc_info_bliscCr~)NrTFrrrrrrrrz!blas_opt_info._calc_info_openblascCsHtd}|s td}|std}|std}|r"|jdi|dSdS)NrrrrTFrrrrrrrszblas_opt_info._calc_info_atlascCr~rrrrrrrrz#blas_opt_info._calc_info_acceleratecCstjtjpdddi}t|dgdtd}|r"t|fi|n%tjtjp(dddtd}|s>tjtjp8ddddSt|d |fgd |jd i|d S) Nr0rrnrrrrFrrTr) rsrtr&rrUrr'r)r_)rHr:rrrrr_calc_info_blasszblas_opt_info._calc_info_blascCszi}d|d<g|d<g|d<g|d<tjd|d<dtjvr3|dd |dtjd|jd i|d S) Nr&r rPr2r NPY_BLAS_LIBSr8NPY_CBLAS_LIBSr Tr)r5rvrbrer%r_rrrrrs  z$blas_opt_info._calc_info_from_envvarcCrrrrrrrrrzblas_opt_info._calc_infocCr)NrzAblas_opt_info user defined BLAS order has unacceptable values: {}rrr0rmrn)r blas_orderrrzr$r r5rvrrrsrtr'rr))rHrrrrrrrls   zblas_opt_info.calc_infoN)rrrr'rurrrrrrrrrrrlrrrrrs  rc@r)rrrNPY_BLAS_ILP64_ORDERcCs*t|}||r|jdi|dSdS)NTFrrrrrrrs  zblas_ilp64_opt_info._calc_infoN)rrrr(rurrrrrrrrrrc@r)rr0Nrrrrrrrrc@r)rr0rNrrrrrrrrc@seZdZdZdZgZeZdS) cblas_inforCBLASN)rrrrDrrr'rurrrrr s rc@s.eZdZdZdZdgZeZddZddZ dS)rrBLASc Cs|}|dd}|||j}|||g}|durdS||d<tdkrKd|d<t}|dd}||d}|rJ|||d<dg|d <n| |}|durad |d<||d<dg|d <|j d i|dS) N blas_libsrPr2Windowsr&r  cblas_libsr rrr) rRrfrrrTrrsystemrget_cblas_libsr_) rHrrarr:cblas_info_obj cblas_optrr0rrrrls,         zblas_info.calc_infoc CsFt}t}td}tj|d}zt|d }| |Wdn1s)wYz |j |g|| d}Wnt j jt j jfyQYWt|dSw|ddg|ddg|ddgdgfD]-}z |j|tj|d ||d |d gd |WWt|St j jyYqgwWt|dSt|w) a? Check whether we can link with CBLAS interface This method will search through several combinations of libraries to check whether CBLAS is present: 1. Libraries in ``info['libraries']``, as is 2. As 1. but also explicitly adding ``'cblas'`` as a library 3. As 1. but also explicitly adding ``'blas'`` as a library 4. Check only library ``'cblas'`` 5. Check only library ``'blas'`` Parameters ---------- info : dict system information dictionary for compilation and linking Returns ------- libraries : list of str or None a list of libraries that enables the use of CBLAS interface. Returns None if not found or a compilation error occurs. Since 1.17 returns a list. z #include int main(int argc, const char *argv[]) { double a[4] = {1,2,3,4}; double b[4] = {5,6,7,8}; return cblas_ddot(4, a, 1, b, 1) > 10; }source.cwtN) output_dirr2rPrra.outr1r8rPr1extra_postargs)rtempfilemkdtempr)r*r5r>r?rwritecompiler distutils ccompiler CompileError LinkErrorshutilrmtreelink_executablerw) rHr:rtmpdirr!rVrjobjr-rrrr8sD          zblas_info.get_cblas_libsN) rrrrDrrr'rurlrrrrrrs rc@sZeZdZdZdZdgZgZeZe ddZ e ddZ ddZ d d Z d d Zd dZdS)rrOPENBLAScC(z |j|jdWStyYdSw)Nrr0rArwrDrrNrrrr  zopenblas_info.symbol_prefixcCr)Nrr0rrNrrrrrzopenblas_info.symbol_suffixc Cst}|}|dd}|||j}|||g}|jdkr?|dur?ddlm}||d}|r>|jdkr>| ||}d}n|rGd }d |d <|durMdS| } t |fi| |sb| |sbdSd g|d <|j rv|d d|j fg7<|jr|d d|jfg7<|S)N openblas_libsrPrr) new_fcompiler) c_compilergnu95TFrr r rrr)rrRrfrrrTrnumpy.distutils.fcompilerrcheck_msvc_gfortran_libsr[rU check_symbolsrr) rHrrrarr:rrjskip_symbol_checkr^rrrrs6     zopenblas_info._calc_infocCs(|}|dur|jdi|dSdS)Nr)rr_rrrrrlszopenblas_info.calc_infoc Csg}|D] }|D]}tj||d}tj|r ||nqdSq|jj}tjtd|}tj|s>t ||g|gdd} tj||d} tj||d} t | d} | d|Wdn1spwYt | d } Wd| S1swY| S) Nrbuildr&)r1rPr z .fobjectsz .cobjectsrRr) r5r>r?rdrer9rgetcwdrYmakedirsrr) rHr1rP library_pathslibrary library_dirfullpathrrr: fake_lib_filefake_clib_filerjrrrrs:       z&openblas_info.check_msvc_gfortran_libsc sNd}t}t}dfddjD}dfddjD}tdt||d}tj |d}tj |d } z|d } Wn t yMg} YnwzRt |d  } | |Wdn1sdwY|j |g|d } z|j| | |d |d| dd}Wn tjjyd}Yn wWt||SWt||St|w)NFrc3"|] }dj|jfVqdS)zvoid %s%s%s();Nrrr8 symbol_namerNrrrBz.openblas_info.check_symbols..c3r)z %s%s%s();NrrrNrrrBrz %(prototypes)s int main(int argc, const char *argv[]) { %(calls)s return 0; }) prototypescallsrrr8rrrPr1rT)rrrr?_require_symbolsr)r*rr5r>ryrrrrrrrrr) rHr:r}rrrrr!rVr( extra_argsrjrrrNrrsP        zopenblas_info.check_symbolsN)rrrrDrrrr'rupropertyrrrrlrrrrrrrzs  ) rc@s$eZdZdZdZdgZdgZeZdS)rrrzungqr_N) rrrrDrrrr'rurrrrr s rc@seZdZddgZdS)rrrN)rrrrrrrrr  rcs6eZdZdZdZdgZddgZeZfddZ Z S)rrOPENBLAS_ILP64 openblas64dgemm_ cblas_dgemmcs(t}|dur|ddg7<|S)Nr)HAVE_BLAS_ILP64Nsuperrrr9rrr s zopenblas_ilp64_info._calc_info) rrrrDrrrr(rur __classcell__rrrrr srcs$eZdZgdZfddZZS)r)rrrLAPACKE_zungqrcs$t}|r|ddg7<|S)Nr) HAVE_LAPACKENrrrrrr" s z%openblas_ilp64_lapack_info._calc_info)rrrrrrrrrrr src@s"eZdZdZdZdgZdZdZdS)rr OPENBLAS64_rr0N)rrrrDrrrrrrrrr( s rc@r)rNrrrrrr0 rrc@rF)rrBLIScCsj|}|dd}|||j}|||g}|durdS|}t|ddg|d|jdi|dS)N blis_libsrPrr )r rr2r)rRrfrrrrrUr_)rHrrarr:rrrrrl9 s zblis_info.calc_infoN) rrrrDrrr'rurlrrrrr3 rHrc@s.eZdZdZdZdgZeZddZddZ dS)ra$ Usage of libflame for LAPACK operations This requires libflame to be compiled with lapack wrappers: ./configure --enable-lapack2flame ... Be aware that libflame 5.1.0 has some missing names in the shared library, so if you have problems, try the static flame library. rc Cst}t}td}tj|d}tj|d}|dg}zLt |d }| |Wdn1s6wY|j |g|d} z|j | ||d|d |d WWt |d StjjylYWt |d Swt |w) zS libflame does not necessarily have a wrapper for fortran LAPACK, we need to check z void zungqr_(); int main(int argc, const char *argv[]) { zungqr_(); return 0; }rrr8rNrrPr1rTF)rrrr)r*r5r>r?rwrrrrrrrrr) rHr:rrr!rVr(rrjrrrrcheck_embedded_lapackX s.     z flame_info.check_embedded_lapackcCs |}|d|j}|||g}|durdS|}t|fi|||r3|jdi|dStd}|s;dS|D]6}t ||t rS| |g||||<q=t ||t rg| |d||||<q=| |d||||<q=||r|jdi|dSdS)NrPrrr0) rRrrrr[rUrr_rrFryrwrq)rHr flame_libsr:r^rrOrrrrlv s*  zflame_info.calc_infoN) rrrrrDrr"rurrlrrrrrJ s  rc@s$eZdZdZddgZeZddZdS)rrveclibcCs(tjd}|r |g}n|d|j}dd|D}tjdkrtddsg}g}tdddksBd tvsBd tvsBdtvrEd }nd }tj d rgd|vrg|rY| dg| dg| ddgntj drd|vr|ry| dg| dg| ddg|r|j ||ddgddS)N ACCELERATErPcSsg|]}|qSr)rro)r8r0rrrr: z-accelerate_info.calc_info..r_PYTHON_HOST_PLATFORMi386intelx86_64rtrz0/System/Library/Frameworks/Accelerate.framework/rz-msse3z5-I/System/Library/Frameworks/vecLib.framework/Headersz-Wl,-frameworkz-Wl,Acceleratez,/System/Library/Frameworks/vecLib.framework/rz -Wl,vecLib)rorr )r7r8r) r5rvrwrrr`rgetenvr r>r+r%r_)rHrPr link_argsr rrrrl sN         zaccelerate_info.calc_infoN)rrrrDrr'rurlrrrrr rrc@r)rrBLAS_SRCcCDt|||}g}|D]}||g||dgq dd|DS)NrcSrWrrXr7rrrr: r\z+blas_src_info.get_paths..rrrrrr rzblas_src_info.get_pathscs|}d|D]}tjtj|dr|nqsdSd}d}d}fdd|||D}dd|D}|d d }|jd i|dS) Nr0zdaxpy.fao caxpy csscal dnrm2 dzasum saxpy srotg zdotc ccopy cswap drot dznrm2 scasum srotm zdotu cdotc dasum drotg icamax scnrm2 srotmg zdrot cdotu daxpy drotm idamax scopy sscal zdscal crotg dcabs1 drotmg isamax sdot sswap zrotg cscal dcopy dscal izamax snrm2 zaxpy zscal csrot ddot dswap sasum srot zcopy zswap scabs1 a cgbmv chpmv ctrsv dsymv dtrsv sspr2 strmv zhemv ztpmv cgemv chpr dgbmv dsyr lsame ssymv strsv zher ztpsv cgerc chpr2 dgemv dsyr2 sgbmv ssyr xerbla zher2 ztrmv cgeru ctbmv dger dtbmv sgemv ssyr2 zgbmv zhpmv ztrsv chbmv ctbsv dsbmv dtbsv sger stbmv zgemv zhpr chemv ctpmv dspmv dtpmv ssbmv stbsv zgerc zhpr2 cher ctpsv dspr dtpsv sspmv stpmv zgeru ztbmv cher2 ctrmv dspr2 dtrmv sspr stpsv zhbmv ztbsv z cgemm csymm ctrsm dsyrk sgemm strmm zhemm zsyr2k chemm csyr2k dgemm dtrmm ssymm strsm zher2k zsyrk cher2k csyrk dsymm dtrsm ssyr2k zherk ztrmm cherk ctrmm dsyr2k ssyrk zgemm zsymm ztrsm crP)z.fr=rLrMrrr: sz+blas_src_info.calc_info..cSrWrrXrLrrrr: r\r&rYrrZ)rHr5r9blas1blas2blas3rpr:rrMrrl s$  zblas_src_info.calc_infoN) rrrrDrr)rurrlrrrrr rhrc@s*eZdZdZeZdgZddZddZdS)rrX11cCstj|ttddS)Nr)rrJdefault_x11_lib_dirsdefault_x11_include_dirsrNrrrrJ s zx11_info.__init__cCstjdvrdS|}|}|dd}|||j}|||g}|dur)dSd}|D] }||dr9|}nq-|durEt ||gd|j di|dS)N)r+x11_libsrPzX11/X.hrr) r`rrRrrfrrrTrrUr_)rHrr2rarr:inc_dirr9rrrrl s$   zx11_info.calc_infoN) rrrrDr-rurrJrlrrrrr s  rc@s(eZdZdZdZeZddZddZdS) _numpy_inforcCsg}z;t|j}g}|jtjD] }|dkrn||qz |t|dWn ty3Ynw|t dWn t yFYnwt d}||t d}||vr_||t D]}tj |tj |}||vrw||qatj|g|ddS)Nr0 get_includer/ platincluder) __import__ modulenamer^rbr5r6rerAttributeError sysconfigget_path ImportErrorrGr>r?rrrJ)rHr2modulerr py_incl_dir py_pincl_dirr9rrrrJ& s>          z_numpy_info.__init__c Cszt|j}Wn tyYdSwi}g}dD]}t||d}|dur%q|jdt|f|jdfg}t||d|}d}|D]}||t j |jdrX|}nqF|durdt||gd|rn|j di|dS)N) __version__rl_VERSIONrz arrayobject.hrr) rrr#rupperr"rUrrr5r>r?r_) rHr$r:rrvrsr2rr9rrrrlG sD      z_numpy_info.calc_infoN) rrrrDrr,rurJrlrrrrr! s  !rc@r)rrNrrrrDrrrrrrf rrc@r)rrNr+rrrrrk rrc@r)rrNr+rrrrrp rrc@seZdZdZddZdS)rrc Csjd}tdrtddf}|ddurd}zddl}d}Wncty}zWt|}zddl}d}WnDtyv}z8t|}zddl}d}Wn%tyk}zt|}t|t|t|WYd}~nd}~wwWYd}~nd}~wwWYd}~nd}~ww|d |df}|dd vrt d |d|df|dtj d<|j d it|ddS) N)NNNUMERIXzenvironment varr)r defaulted)rr-)rr-rt)rrrzonumerix selector must be either 'Numeric' or 'numarray' or 'numpy' but the value obtained from the %s was '%s'.r)r5rrr#r?rrrr:rror$rvr_r) rHwhichrrmsg1rmsg2rmsg3rrrrlx sH     znumerix_info.calc_infoN)rrrrDrlrrrrru s rc@r)rcCs^zddlm}Wn tyYdSwtjtj|jd}|jtj|dg|gddS)NrrVzfortranobject.crpr2) numpy.f2pyrr#r5r>r?rr^r_)rHrf2py_dirrrrrl s zf2py_info.calc_infoNrrrrrr rrc@$eZdZdZdZddZddZdS)rrBOOSTcCr)Nzboost*cSrWrrXr7rrrr: r\z/boost_python_info.get_paths..rrrrrr rzboost_python_info.get_pathsc Cs|}d}|D]}tjtj|ddddr|}nq|s!dStdg}td}||vr5||tj|ddd}ttj|d}|ttj|d d7}d |g||d fg|gd }|rl|j d i|dS)Nr0r-pythonrVz module.cppr/r*.cpprboost_python_src)r2rprPr2r) rr5r>rdr?r!r"rerr_) rHr5rNr9 py_incl_dirsr&srcs_dirbpl_srcsr:rrrrl s8   zboost_python_info.calc_infoNrrrrDrrrlrrrrr  rc@r5)rrAGG2cCr)Nzagg2*cSrWrrXr7rrrr: r\z'agg2_info.get_paths..rrrrrr rzagg2_info.get_pathscCs|}d}|D]}tjtj|ddr|}nq|sdStjdkr1ttj|dddd}nttj|dd}|tj|dddd g7}d |tj|d gd fgtj|d gd }|ri|jdi|dS)Nr0rVzagg_affine_matrix.cppr+rzagg_win32_bmp.cppr8rzagg_platform_support.cppagg2_srcr/r2r:r) rr5r>rdr?r`rrr_)rHr5rNr9 agg2_srcsr:rrrrl s8 zagg2_info.calc_infoNr>rrrrr r?rc@sDeZdZdZdZdZdZdZdZdZ dZ ddZ d d Z d d Z dS) _pkg_config_infoN PKG_CONFIGz pkg-configr0z --modversionz--cflagscCs|jtjvr tj|jS|jSr)config_env_varr5rvdefault_config_exerNrrrget_config_exe s  z_pkg_config_info.get_config_exec CsL|d|jd|}zt|}Wn ttjfyYdSwt|}|S)N )append_config_exe subprocess check_outputOSErrorCalledProcessErrorr )rH config_exeoptioncmdr{rrrget_config_output sz"_pkg_config_info.get_config_outputcCsnt|}|std||jfdSi}g}g}g}g}g}g}|||j} | rP||jj dd t | f|j rP||j d| dddf|jrk||d} | rk||jd| dddf||d} | r| D]+} | ddd kr|| ddqw| ddd kr|| ddqw|| qw|||j} | r| D]D} | ddd kr|| ddq| ddd krd | vr| dd d \} }|| |fq|| dddfq|| q|rt||d|rt||d|rt||d|rt||d|r!t||d|r*t||d|r5|jdi|dS)Nz-File not found: %s. Cannot determine %s info.r.rz_%s_z --releasez--libsrmz-lz-L-Iz-D=rrrr)r8)r7r)r rGrrtrDrQ version_flagrer9rrbr)r"version_macro_namerrelease_macro_name cflags_flagrUr_)rHrNr:rrPr1r2r8r7rlreleaseoptsranrrrrrl s                 z_pkg_config_info.calc_info)rrrrDrErFrIrVrWrUrXrGrQrlrrrrrC s rCc@s,eZdZdZdZdZdZdZdZdZ dZ d S) rr WX_CONFIGz wx-configr0 WX_VERSION WX_RELEASEz --versionz --cxxflagsN) rrrrDrErFrIrVrWrUrXrrrrrP src@eZdZdZdZdZdS)r rrGDK_PIXBUF_XLIB_VERSIONNrrrrDrIrVrrrrr [ r c@r_)r rrGDK_PIXBUF_VERSIONNrarrrrr a rbr c@r_)r rrGDK_X11_VERSIONNrarrrrr g rbr c@r_)r rr GDK_VERSIONNrarrrrr m rbr c@eZdZdZdZdZdS)r rreNrarrrrr s rbr c@r_)rrrGTK_X11_VERSIONNrarrrrry rbrc@r_)rrr GTK_VERSIONNrarrrrr rbrc@rf)rr XFT_VERSIONNrarrrrr rbrc@rf)rrFREETYPE2_VERSIONNrarrrrr rbrc@s"eZdZdZdZdgZddZdS)rrAMDc Cs|}|dd}|||j}|||g}|durdS|}d}|D]}||d}|r:tj |d}nq&|durLt ||gdgd|gd|j di|dS) Namd_libsrPzamd.hr) SCIPY_AMD_HNrSr2r swig_optsr) rRrfrrrTrrr5r>rrUr_) rHrrarlr:r2rr9r)rrrrl s*  zamd_info.calc_infoN)rrrrDrrrlrrrrr s  rc@s&eZdZdZdZeZdgZddZdS)rrUMFPACKc Cs|}|dd}|||j}|||g}|durdS|}d}|D]}||ddgd}|r=tj |d}nq&|durOt ||gdgd|gd t |fit d |j d i|dS) N umfpack_libsrPr0rz umfpack.hr)SCIPY_UMFPACK_HNrSrnrr) rRrfrrrTrrr5r>rrUrr_) rHrrarqr:r2rr9r)rrrrl s, zumfpack_info.calc_infoN) rrrrDrr.rurrlrrrrr s  rc Osg}|D]}|s qt|r|g}||q|}|sgSt|dkr0tddtt|dg}n4t|dkrSg}|dD]}|dD]}|ttj ||qBq szcombine_paths..rrmNz (paths: %s)ru) r rerzrmaprr%r5r>r?rrr)rkwsrrr|a0a1rrrr s,     "rrtrmr)rc++r&rjrrxr&rj)rrtrmrc sg}|D]-\}dkr||qvr/dvr'fdd|Dq|q|<q|rEttdd|D}|d<dS)Nr )r1r2r7r8r3rcs&g|]}|vr|qSr)re)r8vvr9r~rrr: s&zdict_append..cSsg|]}t|dqSr) language_maprw)r8rrrrr: r )ryrer%inv_language_mapmax)r9ru languagesrrrrzrrU s  rUrcCsHddl}|d}|jddddddd |j|d dd \}}||fS) Nrzusage: %prog [-v] [info objs]z-vz --verbose store_trueverboseFz"be verbose and print more messages)actiondestrhelprt)r)optparse OptionParser add_option parse_args)rarparserrZrrrr parseCmdLine s  rc Csddl}|dur tj}t|\}}|jrttjnttjg}|D]}|dddkr3|d}| |q%| }t }| D]+\}} | | sOqEt| trX| turYqE|sf||vr`qE|||=| } d| _| } qE|r~tdd|dSdS)Nr_informzInfo classes not defined: %sru)inspectr`rarrr set_thresholdDEBUGrxreglobalsr{ryisclass issubclassrrd verbosityrr:r?) rarrZr show_onlyr[show_all_gdict_rrconfrrrrr s:       r__main__r)r)rr`r5rvr{rsrJr)r functoolsr configparserrrr@distutils.errorsrdistutils.distrr!numpy.distutilsrdistutils.utilr numpy.distutils.exec_commandr r numpy.distutils.misc_utilr r rnumpy.distutils.command.configrrsrrrdistutils.ccompilerrrr__all__r_bits architecture platform_bitsrr"r*r>r?get_config_varrEr=rGr>rrrHrFrIr.rJr vcpkg_dir specifiervcpkg_installed vcpkg_rootrN conda_dirr+globbed_x11_dirrb x11_so_dirr%rdevnullrjPopenPIPEr)rLr? communicatedecodertriplet returncoderinsertrerrmrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.rrrrrrrrrrrrrrrrrrrrrrrrrrrrrurrr-rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrCrr r r r r rrrrrrrr{r|rUrrrrrrrs'             '       $ SWz/       $Eow I n f  P27E% '*Y "