U ã€C^DQã@shddlmZmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl m Z mZmZddlmZddlmZddlmZddlmZdd gZe d ¡Zd d „ZeƒrÆgZngZGd d„deƒZGdd „d eƒZdd„Ze dkrdddl!m"Z"ddl#m$Z$e" %d¡e&e$dƒ '¡ƒze&e$dƒ '¡ƒWn e(k rbe&eƒƒYnXdS)é)ÚdivisionÚabsolute_importÚprint_functionN)ÚPopenÚPIPEÚSTDOUT)Úfilepath_from_subprocess_output)Ú FCompiler)Ú get_exception)Ú system_infoÚ GnuFCompilerÚGnu95FCompilerzTarget: ([a-zA-Z0-9_\-]*)cCstjdkot ¡ddkS)NÚwin32rÚ64bit)ÚsysÚplatformÚ architecture©rrú@/tmp/pip-install-6_kvzl1k/numpy/numpy/distutils/fcompiler/gnu.pyÚis_win64src @seZdZdZdZdZdd„Zdd„Zdd gZd d gd d d dgd d d d d gddgdgd d d gdœZ d Z d Z e j dkr‚ejdkr‚dgZejdkr¤dD]Ze e d¡qdZdZdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd S)/r Úgnu)Úg77zGNU Fortran 77 compilercCsì| d¡r"|| d¡dd…}qt|ƒdkrrt d|¡}|rØ| d¡rVd| d¡fS| ¡d krØd | d¡fSnft d |¡}|rd | d¡fSt d |¡}|rØ| d¡}| d ¡sÈ| d¡sÈ| d¡rÐd|fSd |fSd}t||ƒ‚dS)z6Handle the different versions of GNU fortran compilerszgfortran: warningÚ éNéz ([0-9.]+)z GNU FortranrrÚgfortranzGNU Fortran\s+95.*?([0-9-.]+)z%GNU Fortran.*?\-?([0-9-.]+\.[0-9-.]+)Ú0Ú2Ú3z6A valid Fortran version was not found in this string: )Ú startswithÚfindÚlenÚreÚsearchÚgroupÚstartÚ ValueError)ÚselfÚversion_stringÚmÚvÚerrrrrÚgnu_version_match)s.      ÿ zGnuFCompiler.gnu_version_matchcCs&| |¡}|r|ddkrdS|dS)Nrrr)r,)r'r(r*rrrÚ version_matchUs zGnuFCompiler.version_matchrZf77Nú -dumpversionú-gú-Wallú-fno-second-underscoreÚarú-crÚranlib©Ú version_cmdÚ compiler_f77Ú compiler_f90Ú compiler_fixÚ linker_soÚarchiverr4Ú linker_exeÚntÚcygwinz-fPICr)r6r7r:r<ú -mno-cygwinÚg2cÚgnu95cCsÒ|jdd…}tjdkr®tj dd¡}|sœddlm}i}z |j}Wnt k rXYnX|ƒ}|  ||¡| dd¡}|tjd<|dkrœd}t j |dd|  d d d g¡n | d ¡tj d ¡rÎ| d¡|S)NrÚdarwinÚMACOSX_DEPLOYMENT_TARGETrz10.3z2Env. variable MACOSX_DEPLOYMENT_TARGET set to 10.3é)Ú stacklevelz -undefinedZdynamic_lookupz-bundlez-sharedÚsunosz -mimpure-text)r:rrÚosÚenvironÚgetÚdistutils.sysconfigÚ sysconfigÚget_makefile_filenameÚAttributeErrorÚparse_makefileÚwarningsÚwarnÚextendÚappendr)r'ÚoptÚtargetÚscÚgrLÚfilenameÚsrrrÚget_flags_linker_sovs,         z GnuFCompiler.get_flags_linker_soc CsJzt |jdg¡}Wnttjfk r0YnXt|ƒ}tj |¡SdS)Nz-print-libgcc-file-name) Ú subprocessÚ check_outputr7ÚOSErrorÚCalledProcessErrorrrGÚpathÚdirname)r'ÚoutputrrrÚget_libgcc_dir¢sÿ  zGnuFCompiler.get_libgcc_dirc Csˆtjdd…dkrd}ntjdkr(d}nd}d}|r„d |¡g}zt |j|¡}Wnttjfk rnYnXt|ƒ}t j   |¡}|S)NéÚlinuxzlibgfortran.sorBzlibgfortran.dylibz-print-file-name={0}) rrÚformatrZr[r7r\r]rrGr^r_)r'Zlibgfortran_nameZlibgfortran_dirZ find_lib_argr`rrrÚget_libgfortran_dir­s"  ÿ z GnuFCompiler.get_libgfortran_dircCsàg}tjdd…dkrÆ| ¡}|rÆtjdkr¼| d¡s¼tj |¡}tj |d|j¡}tj  |¡s¼tjj|ftj fdžŽ}tj  tj |d¡¡}tj |d|j¡}tj  |¡r¼|  |¡|  |¡|  ¡}|rÜ|  |¡|S)Nrbrcrz/usr/libzlib%s.aéÚlib)rrrarrGr^ÚnormpathÚjoinr@ÚexistsÚpardirÚabspathrRre)r'rSÚdr^ÚrootZd2Úlib_gfortran_dirrrrÚget_library_dirsÂs$      zGnuFCompiler.get_library_dirscCs¤g}| ¡}|dk rL|jd}|j||jf}tj tj ||¡¡sR|j}n|j}|dk rd| |¡|j }t j dkrŒ|rŒ|j dkrŒ| d¡t j dkr | d¡|S)Nz-picrÚmsvcÚgccrBÚ cc_dynamic) rar@Zstatic_lib_formatZstatic_lib_extensionrGr^ÚisfilerirRÚ c_compilerrrÚ compiler_type)r'rSrmr@ÚfrurrrÚ get_librariesØs$  ÿ   zGnuFCompiler.get_librariescCsdgS)Nr/r©r'rrrÚget_flags_debugíszGnuFCompiler.get_flags_debugcCs0| ¡}|r|dkrdg}ndg}| d¡|S)Nz3.3.3z-O2z-O3z-funroll-loops)Ú get_versionrR)r'r*rSrrrÚ get_flags_optðs   zGnuFCompiler.get_flags_optcCsdddlm}z| ¡d}Wntk r4gYSXt d¡}g}| |¡D]}|d|g7}qN|S)z( Return detected arch flags from CFLAGS r)rKÚCFLAGSz -arch\s+(\w+)ú-arch)Ú distutilsrKÚget_config_varsÚKeyErrorr"ÚcompileÚfindall)r'rKÚcflagsZarch_reÚ arch_flagsÚarchrrrÚ _c_arch_flagsûs   zGnuFCompiler._c_arch_flagscCsgS)NrryrrrÚget_flags_archszGnuFCompiler.get_flags_archcCsJtjdd…dkstjdkr t‚d|ks,t‚tjdkr:dnd}d||fS)NéÚaixrú,rBú=z-Wl,-rpath%s%s)rrÚNotImplementedErrorÚAssertionError)r'ÚdirÚseprrrÚruntime_library_dir_option s  z'GnuFCompiler.runtime_library_dir_option)Ú__name__Ú __module__Ú __qualname__rvÚcompiler_aliasesÚ descriptionr,r-Úpossible_executablesÚ executablesÚmodule_dir_switchÚmodule_include_switchrGÚnamerrZ pic_flagsÚkeyrRr@Zsuggested_f90_compilerrYrarerprxrzr|r‡rˆr‘rrrrr $sD, ø  ,   c @s&eZdZdZdZdZdd„ZddgZdd gd d d d dged d d dged d d d dgedd d gddgdgd d gdœZ dZ dZ e j d d…dkrÎe d d¡e  ¡dd d…dkrÎdD]Ze e d¡qºdZdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd S)2r rA)rzGNU Fortran 95 compilercCsX| |¡}|r|ddkrdS|d}|dkr0n$tjdkrTdD]}|j| d¡q>|S)Nrrrz4.r)r6r7r8r9r:r<r?)r,rrr˜rR)r'r(r*rœrrrr-s  zGnu95FCompiler.version_matchrZf95zr.Nr0r/z -ffixed-formr1r2r3r4r5z-Jz-Ir‰rŠr:z -lpthreadrrDZ64)r7r8r9r:r<z-maix64cCs^tjdksgSg}| ¡}d|kr0d|| d¡<dD]$}t||ƒr4||kr4| d|g¡q4|S)z>Return a list of -arch flags for every supported architecture.rBÚi386Úi686)ÚppcržÚx86_64Úppc64r~)rrr‡ÚindexÚ _can_targetrQ)r'Úcmdr…Zc_archsr†rrrÚ_universal_flagsIs zGnu95FCompiler._universal_flagscCs*t |¡}| |j¡}|r&||dd…<|S©Nr)r Ú get_flagsr¥r8©r'Úflagsr…rrrr§Ys    zGnu95FCompiler.get_flagscCs*t |¡}| |j¡}|r&||dd…<|Sr¦)r rYr¥r:r¨rrrrY`s    z"Gnu95FCompiler.get_flags_linker_soc Cs²t |¡}tjdkr˜|j}|r˜|jdkr˜| ¡}|r˜tj  |  ¡¡}tjj |ftj fdžŽ}tj  |d¡}tj  |¡}tj  tj  |d¡¡r˜| |¡| ¡}|r®| |¡|S)Nrrqrfrgz libmingwex.a)r rprrrurvÚ get_targetrGr^rhrarirkrjrRre) r'rSrurTrmrnr^Zmingwdirrorrrrpgs      zGnu95FCompiler.get_library_dirscCsŠt |¡}tjdkr| d¡tjdkr†|j}|rn|jdkrnd|krn| d¡}| |dd¡| |dd¡|j}|r†|jdkr†gS|S) NrBrsrrqrrrZmingwexZmingw32) r rxrrÚremoverurvr¢Úinsert)r'rSruÚirrrrxzs     zGnu95FCompiler.get_librariesc CsVzt |jdg¡}Wnttjfk r0Yn"Xt|ƒ}t |¡}|rR| d¡SdS)Nz-vrÚ) rZr[r7r\r]rÚTARGET_Rr#r$)r'r`r)rrrrªŒs  zGnu95FCompiler.get_targetc Cstt ¡}|D]6}t|dƒ"}| d¡}|s,q8| |¡qW5QRXq t | ¡¡}tj ddkrj|  d¡}|  d¡S)NÚrbirr‰ÚasciirŒ) ÚhashlibÚsha1ÚopenÚreadÚupdateÚbase64Ú b32encodeÚdigestrÚ version_infoÚdecodeÚrstrip)r'Ú filenamesÚhÚfnrwÚblockÚtextrrrÚ _hash_files˜s   zGnu95FCompiler._hash_filesc Cs`|j}|jdkrtdƒ‚| t|ƒt|ƒ¡}tƒr:d}nd}dtj tj  |d¡¡ddd…} | d |d |} | d } | d } | d } tj  || ¡}tj  || ¡}tj  || ¡}tj  |¡rÐ||fS|rèdgt|ƒdg}|j || |t|ƒdd|ddddgdtƒr d}nd}d|d||g}|j sF| ¡| |jg|¡||fS)zeCreate a wrapper shared library for the given objects Return an MSVC-compatible lib rqzThis method only supports MSVCZ win_amd64rrgrNéÚ.z .gfortran-z.dllz.defz.libz-Wl,--whole-archivez-Wl,--no-whole-archivez-Wl,--allow-multiple-definitionz-Wl,--output-def,z-Wl,--export-all-symbolsz-Wl,--enable-auto-importz-staticz-mlong-double-64)Ú output_dirZextra_postargsz /MACHINE:X64z /MACHINE:X86z/def:z/OUT:)rurvr&rÂÚlistrrGr^ÚsplitextÚbasenamerirtZlink_shared_objectZ initializedZ initializeÚspawnrg)r'ÚobjectsrÅÚ extra_dll_dirÚ chained_dllsÚ is_archiveruZ object_hashÚtagrÈZ root_nameZdll_nameZdef_nameZlib_nameZdll_pathZdef_pathZlib_pathÚ specifierZlib_argsrrrÚ_link_wrapper_lib¦s` ÿÿÿ  ÿúüz Gnu95FCompiler._link_wrapper_libcCs |jdkS)N)rq)rv)r'ÚcompilerrrrÚcan_ccompiler_linkäsz!Gnu95FCompiler.can_ccompiler_linkc CsÆ|jjdkrºg}g}|D](}| ¡ d¡r6| |¡q| |¡qg}g}|ddd…D]6} |j| g|||dd\} } | d| ¡| d| ¡qX|s˜|S|j||||dd\} } | g|Std ƒ‚dS) z† Convert a set of object files that are not compatible with the default linker, to a file that is compatible. rqz.aNéÿÿÿÿT)rÌrÍrFzUnsupported C compiler)rurvÚlowerÚendswithrRrÐr¬r&) r'rÊrÅrËZarchivesZ plain_objectsÚobjZ chained_libsrÌÚarchivergÚdllrrrÚwrap_unlinkable_objectsès<   û  û  z&Gnu95FCompiler.wrap_unlinkable_objects)r’r“r”rvr•r–r-r—Ú _EXTRAFLAGSr˜r™ršrrrRrrœr@r¥r§rYrprxrªrÂrÐrÒrÙrrrrr sXÿÿÿÿÿÿõ >c Cs²|dd…}tjdd\}}t |¡zztj |¡}tj |¡dd}z<|  d|d|g¡t |t t |d}|  ¡|jdkW¢W¢Stj |¡rœt |¡XW5t |¡Xd S) z7Return true if the architecture supports the -arch flagNz.f)Úsuffixrz.or~z-c)ÚstderrÚstdoutÚcwdF)ÚtempfileÚmkstemprGÚcloser«r^r_rÇrjrQrrrÚ communicateÚ returncode)r¤r†ZnewcmdZfidrWrmr`Úprrrr£s     r£Ú__main__)Úlog)Úcustomized_fcompilerrDrZg95))Ú __future__rrrr"rGrrOrrßr²r·rZrrrZnumpy.distutils.exec_commandrZnumpy.distutils.fcompilerr Znumpy.distutils.compatr Znumpy.distutils.system_infor Z compilersr‚r¯rrÚr r r£r’rræZnumpy.distutilsrçÚ set_verbosityÚprintr{Ú ExceptionrrrrÚsF     t