B { `¦Oã @sTddlZddlZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z ddl m Z ddlmZddlmZddgZe d¡Zd d „Zeƒr¦gZngZGd d„deƒZGd d„deƒZd d„ZedkrPddlmZddlmZe d¡e edƒ !¡ƒye edƒ !¡ƒWn,e"k rNZ#z e e#ƒWddZ#[#XYnXdS)éN)ÚPopenÚPIPEÚSTDOUT)Úfilepath_from_subprocess_output)Ú FCompiler)Ú LooseVersionÚ GnuFCompilerÚGnu95FCompilerzTarget: ([a-zA-Z0-9_\-]*)cCstjdkot ¡ddkS)NÚwin32rÚ64bit)ÚsysÚplatformÚ architecture©rrúA/tmp/pip-unpacked-wheel-4iou4664/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¨xdD]Ze e d¡q’WdZdZdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd S)/rÚgnu)Úg77zGNU Fortran 77 compilercCsðx$| d¡r$|| d¡dd…}qWt|ƒdkrvt d|¡}|rÜ| d¡rZd| d¡fS| ¡d krÜd | d¡fSnft d |¡}|r”d | 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_matchRs zGnuFCompiler.version_matchrZf77Nz -dumpversionz-gz-Wallz-fno-second-underscoreÚarz-crÚranlib)Ú version_cmdÚ compiler_f77Ú compiler_f90Ú compiler_fixÚ linker_soÚarchiverr+Ú linker_exeÚntÚcygwinz-fPICr )r,r-r0r2z -mno-cygwinÚg2cÚgnu95cCsœ|jdd…}tjdkrxtj dd¡}|sfddl}| d¡}|s\d}d|›}tj |dd|tjd<|  d d d g¡n |  d ¡tj  d ¡r˜|  d¡|S)NrÚdarwinÚMACOSX_DEPLOYMENT_TARGETrz10.9z.Env. variable MACOSX_DEPLOYMENT_TARGET set to é)Ú stacklevelz -undefinedZdynamic_lookupz-bundlez-sharedÚsunosz -mimpure-text) r0r r ÚosÚenvironÚgetÚ sysconfigÚget_config_varÚwarningsÚwarnÚextendÚappendr)r#ÚoptÚtargetr?ÚsrrrÚget_flags_linker_soss        z GnuFCompiler.get_flags_linker_soc CsJyt |jdg¡}Wnttjfk r0YnXt|ƒ}tj |¡SdS)Nz-print-libgcc-file-name) Ú subprocessÚ check_outputr-ÚOSErrorÚCalledProcessErrorrr<ÚpathÚdirname)r#ÚoutputrrrÚget_libgcc_dir–s zGnuFCompiler.get_libgcc_dirc Csˆtjdd…dkrd}ntjdkr(d}nd}d}|r„d |¡g}yt |j|¡}Wnttjfk rnYnXt|ƒ}t j   |¡}|S)NéÚlinuxzlibgfortran.sor7zlibgfortran.dylibz-print-file-name={0}) r r ÚformatrIrJr-rKrLrr<rMrN)r#Zlibgfortran_nameZlibgfortran_dirZ find_lib_argrOrrrÚ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)NrQrRr z/usr/libzlib%s.aéÚlib)r r rPrr<rMÚnormpathÚjoinr5ÚexistsÚpardirÚabspathrDrT)r#rEÚdrMÚ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Úgccr7Ú cc_dynamic) rPr5Zstatic_lib_formatZstatic_lib_extensionr<rMÚisfilerXrDÚ c_compilerr r Ú compiler_type)r#rEr\r5ÚfrdrrrÚ get_librariesÌs"      zGnuFCompiler.get_librariescCsdgS)Nz-gr)r#rrrÚget_flags_debugászGnuFCompiler.get_flags_debugcCs0| ¡}|r|dkrdg}ndg}| d¡|S)Nz3.3.3z-O2z-O3z-funroll-loops)Ú get_versionrD)r#r&rErrrÚ get_flags_optäs   zGnuFCompiler.get_flags_optcCsdddlm}y| ¡d}Wntk r0gSXt d¡}g}x| |¡D]}|d|g7}qLW|S)z( Return detected arch flags from CFLAGS r)r?ÚCFLAGSz -arch\s+(\w+)z-arch)Ú distutilsr?Úget_config_varsÚKeyErrorrÚcompileÚfindall)r#r?ÚcflagsZarch_reÚ arch_flagsÚarchrrrÚ _c_arch_flagsïs  zGnuFCompiler._c_arch_flagscCsgS)Nr)r#rrrÚget_flags_archüszGnuFCompiler.get_flags_archcCsXtjdkrt‚d|kst‚tjdkr.d|›Stjdd…dkrJd|›Sd|›SdS) Nr ú,r7z -Wl,-rpath,éÚaixz-Wl,-blibpath:z -Wl,-rpath=)r r ÚNotImplementedErrorÚAssertionError)r#ÚdirrrrÚruntime_library_dir_optionÿs     z'GnuFCompiler.runtime_library_dir_option)Ú__name__Ú __module__Ú __qualname__reÚcompiler_aliasesÚ descriptionr(r)Úpossible_executablesÚ executablesÚmodule_dir_switchÚmodule_include_switchr<Únamer r Z pic_flagsÚkeyrDr5Zsuggested_f90_compilerrHrPrTr_rgrhrjrtrur|rrrrr!sB,   #   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ÒxdD]Ze e d¡q¼WdZdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd S)2r r6)rzGNU Fortran 95 compilercCs`| |¡}|r|ddkrdS|d}t|ƒdkr4n(tjdkr\xdD]}|j| d¡qDW|S)NrrrÚ4r )r,r-r.r/r0r2z -mno-cygwin)r(rr r rƒrD)r#r$r&r‡rrrr)s    zGnu95FCompiler.version_matchrZf95zz -dumpversionNz-Wallz-gz -ffixed-formz-fno-second-underscorer*z-crr+)r,r-r.r/r0r1r+r2z-Jz-Irwrxr0z -lpthreadrr9Z64)r-r.r/r0r2z-maix64cCsbtjdksgSg}| ¡}d|kr0d|| d¡<x,dD]$}t||ƒr6||kr6| d|g¡q6W|S)z>Return a list of -arch flags for every supported architecture.r7Úi386Úi686)ÚppcrŠÚx86_64Úppc64z-arch)r r rtÚindexÚ _can_targetrC)r#ÚcmdrrZc_archsrsrrrÚ_universal_flagsBs  zGnu95FCompiler._universal_flagscCs*t |¡}| |j¡}|r&||dd…<|S)Nr)rÚ get_flagsr‘r.)r#Úflagsrrrrrr’Rs    zGnu95FCompiler.get_flagscCs*t |¡}| |j¡}|r&||dd…<|S)Nr)rrHr‘r0)r#r“rrrrrrHYs    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)Nr r`rUrVz libmingwex.a)rr_r r rdreÚ get_targetr<rMrWrPrXrZrYrDrT) r#rErdrFr\r]rMZmingwdirr^rrrr_`s      zGnu95FCompiler.get_library_dirscCsŠt |¡}tjdkr| d¡tjdkr†|j}|rn|jdkrnd|krn| d¡}| |dd¡| |dd¡|j}|r†|jdkr†gS|S) Nr7rbr r`rarZmingwexZmingw32) rrgr r ÚremoverdrerŽÚinsert)r#rErdÚirrrrgss     zGnu95FCompiler.get_librariesc CsVyt |jdg¡}Wnttjfk r0Yn"Xt|ƒ}t |¡}|rR| d¡SdS)Nz-vrÚ) rIrJr-rKrLrÚTARGET_Rrr )r#rOr%rrrr”…s  zGnu95FCompiler.get_targetc Csnt ¡}xB|D]:}t|dƒ&}x| d¡}|s0P| |¡q WWdQRXqWt | ¡¡}| d¡}|  d¡S)NÚrbiÚasciiú=) ÚhashlibÚsha1ÚopenÚreadÚupdateÚbase64Ú b32encodeÚdigestÚdecodeÚrstrip)r#Ú filenamesÚhÚfnrfÚ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 r`zThis method only supports MSVCZ win_amd64r rVrNéÚ.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:)rdrer"r¬Úlistrr<rMÚsplitextÚbasenamerXrcZlink_shared_objectZ initializedZ initializeÚspawnrV)r#Úobjectsr¯Ú extra_dll_dirÚ chained_dllsÚ is_archiverdZ object_hashÚtagr²Z root_nameZdll_nameZdef_nameZlib_nameZdll_pathZdef_pathZlib_pathÚ specifierZlib_argsrrrÚ_link_wrapper_libžsP     z Gnu95FCompiler._link_wrapper_libcCs |jdkS)N)r`)re)r#ÚcompilerrrrÚcan_ccompiler_linkÜsz!Gnu95FCompiler.can_ccompiler_linkc CsÎ|jjdkrÂg}g}x0|D](}| ¡ d¡r8| |¡q| |¡qWg}g}xH|ddd…D]6} |j| g|||dd\} } | d| ¡| d| ¡q^W|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. r`z.aNéÿÿÿÿT)r¶r·rFzUnsupported C compiler)rdreÚlowerÚendswithrDrºr–r") r#r´r¯rµZarchivesZ plain_objectsÚobjZ chained_libsr¶ÚarchiverVÚdllrrrÚwrap_unlinkable_objectsàs8       z&Gnu95FCompiler.wrap_unlinkable_objects)r}r~rrer€rr)r‚Ú _EXTRAFLAGSrƒr„r…r r rDrr‡r5r‘r’rHr_rgr”r¬rºr¼rÃrrrrr sD    >c Csª|dd…}tjdd\}}t |¡zrtj |¡}tj |¡dd}z4| d|d|g¡t|t t |d}|  ¡|j dkStj  |¡r”t |¡XWdt |¡Xd S) z7Return true if the architecture supports the -arch flagNz.f)Úsuffixrz.oz-archz-c)ÚstderrÚstdoutÚcwdF)ÚtempfileÚmkstempr<ÚcloserMrNr±rCrrrÚ communicateÚ returncoderYr•)rrsZnewcmdZfidÚfilenamer\rOÚprrrrs      rÚ__main__)Úlog)Úcustomized_fcompilerr9rZg95)$rr<r rAr rÉrr¢rIrrrZnumpy.distutils.exec_commandrZnumpy.distutils.fcompilerrZdistutils.versionrZ compilersror™rrÄrr rr}rlrÑZnumpy.distutilsrÒÚ set_verbosityÚprintriÚ ExceptionÚerrrrÚsB    p