o 6˜¿aOã @sFddlZddlZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z ddl m Z ddlmZddlmZddgZe d¡Zd d „ZGd d„deƒZGd d„deƒZd d„Zedkr¡ddlmZddlmZe d¡eedƒ  ¡ƒz eedƒ  ¡ƒWdSe!y Z"z ee"ƒWYdZ"["dSdZ"["wwdS)éN)ÚPopenÚPIPEÚSTDOUT)Úfilepath_from_subprocess_output)Ú FCompiler)Ú LooseVersionÚ GnuFCompilerÚGnu95FCompilerzTarget: ([a-zA-Z0-9_\-]*)cCstjdko t ¡ddkS)NÚwin32rÚ64bit)ÚsysÚplatformÚ architecture©rrú?/usr/lib/python3/dist-packages/numpy/distutils/fcompiler/gnu.pyÚis_win64src @søeZdZdZdZdZdd„Zdd„Zdd gZd d ggd ¢d d gd ¢ddgdggd ¢dœZ d Z d Z e j dkr=ejdkr=dgZejdkrNdD] Ze e d¡qDdZdZdd„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… ¡}| d¡st|ƒdkr?t d|¡}|r>| d¡r1d| d¡fS| ¡d kr>d | d¡fSn3t d |¡}|rNd | d¡fSt d |¡}|rr| d¡}| d ¡sj| d¡sj| d¡rnd|fSd |fSd}t||ƒ‚)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ÚstripÚlenÚreÚsearchÚgroupÚstartÚ ValueError)ÚselfÚversion_stringÚmÚvÚerrrrrÚgnu_version_matchs2 ÿ ÿ    € ÿ  zGnuFCompiler.gnu_version_matchcCs&| |¡}|r |ddkrdS|dS)Nrrr)r))r$r%r'rrrÚ version_matchLs zGnuFCompiler.version_matchrÚf77Nú -dumpversion)Nú-gú-Wallú-fno-second-underscore)Nr-r.Úarú-crÚranlib©Ú version_cmdÚ compiler_f77Ú compiler_f90Ú compiler_fixÚ linker_soÚarchiverr2Ú linker_exeÚntÚcygwinz-fPICr )r4r5r8r:ú -mno-cygwinÚg2cÚgnu95cCsž|jdd…}tjdkr=tj dd¡}|s5ddl}| d¡}|s.d}d|›}tj |ddt |ƒtjd<|  gd ¢¡n|  d ¡tj  d ¡rM|  d ¡|S) NrÚdarwinÚMACOSX_DEPLOYMENT_TARGETrz10.9z.Env. variable MACOSX_DEPLOYMENT_TARGET set to é)Ú stacklevel)z -undefinedÚdynamic_lookupz-bundlez-sharedÚsunosz -mimpure-text)r8r r ÚosÚenvironÚgetÚ sysconfigÚget_config_varÚwarningsÚwarnÚstrÚextendÚappendr)r$ÚoptÚtargetrIÚsrrrÚget_flags_linker_soms       z GnuFCompiler.get_flags_linker_soc CsFz t |jdg¡}Wn ttjfyYdSwt|ƒ}tj |¡S)Nz-print-libgcc-file-name) Ú subprocessÚ check_outputr5ÚOSErrorÚCalledProcessErrorrrFÚpathÚdirname)r$ÚoutputrrrÚget_libgcc_dirs ÿû zGnuFCompiler.get_libgcc_dirc Csˆtjdd…dkr d}n tjdkrd}nd}d}|rBd |¡g}z t |j|¡}Wn ttjfy7Y|Swt|ƒ}t j   |¡}|S)NéÚlinuxzlibgfortran.sor@zlibgfortran.dylibz-print-file-name={0}) r r ÚformatrTrUr5rVrWrrFrXrY)r$Úlibgfortran_nameÚlibgfortran_dirÚ find_lib_argrZrrrÚget_libgfortran_dir›s&  ÿû z GnuFCompiler.get_libgfortran_dircCsâg}tjdd…dkrd| ¡}|rdtjdkr_| d¡s_tj |¡}tj |d|j¡}tj  |¡s_tjj|gtj fd¢RŽ}tj  tj |d¡¡}tj |d|j¡}tj  |¡r_|  |¡|  |¡|  ¡}|ro|  |¡|S)Nr\r]r z/usr/libzlib%s.aéÚlib)r r r[rrFrXÚnormpathÚjoinr>ÚexistsÚpardirÚabspathrOrb)r$rPÚdrXÚrootÚd2Úlib_gfortran_dirrrrÚget_library_dirs°s$      zGnuFCompiler.get_library_dirscCs¤g}| ¡}|dur&|jd}|j||jf}tj tj ||¡¡s%|j}n|j}|dur2| |¡|j }t j dkrF|rF|j dkrF| d¡t j dkrP| d¡|S)Nz-picr ÚmsvcÚgccr@Ú cc_dynamic) r[r>Ústatic_lib_formatÚstatic_lib_extensionrFrXÚisfilerfrOÚ c_compilerr r Ú compiler_type)r$rPrjr>Ú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_versionrO)r$r'rPrrrÚ get_flags_optÞs   zGnuFCompiler.get_flags_optcCs^ddl}z| ¡d}Wn tygYSwt d¡}g}| |¡D]}|d|g7}q$|S)z( Return detected arch flags from CFLAGS rNÚCFLAGSz -arch\s+(\w+)ú-arch)rIÚget_config_varsÚKeyErrorrÚcompileÚfindall)r$rIÚcflagsÚarch_reÚ arch_flagsÚarchrrrÚ _c_arch_flagsés ÿ zGnuFCompiler._c_arch_flagscCsgS)NrryrrrÚget_flags_archöszGnuFCompiler.get_flags_archcCsTtjdkrt‚d|vs J‚tjdkrd|›Stjdd…dkr%d|›Sd|›S) Nr ú,r@z -Wl,-rpath,éÚaixz-Wl,-blibpath:z -Wl,-rpath=)r r ÚNotImplementedError)r$ÚdirrrrÚ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_switchrFÚnamer r Ú pic_flagsÚkeyrOr>Úsuggested_f90_compilerrSr[rbrnrxrzr|r‡rˆrŽrrrrrsF-ø  #   c @seZdZdZdZdZdd„ZddgZdd ggd ¢gd ¢gd ¢gd ¢d dgdgddgdœZdZ dZ e j dd…dkrXed  d¡e  ¡ddd…dkrXdD] Zee  d¡qNdZdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„ZdS)2r r?)rzGNU Fortran 95 compilercCs`| |¡}|r |ddkrdS|d}t|ƒdkr |Stjdkr.dD] }|j| d¡q#|S)NrrrÚ4r )r4r5r6r7r8r:r=)r)rr r r•rO)r$r%r'ršrrrr*s   úzGnu95FCompiler.version_matchrÚf95úr,)Nr.r-z -ffixed-formr/)Nr.r-r/)ržr.r-r0r1r2Nr.r3z-Jz-IrŠr‹r8z -lpthreadrrBÚ64)r5r6r7r8r:z-maix64cCs^tjdksgSg}| ¡}d|vrd|| d¡<dD]}t||ƒr,||vr,| d|g¡q|S)z>Return a list of -arch flags for every supported architecture.r@Úi386Úi686)Úppcr¡Úx86_64Úppc64r~)r r r‡ÚindexÚ _can_targetrN)r$Úcmdr…Úc_archsr†rrrÚ_universal_flags<s €zGnu95FCompiler._universal_flagscCó*t |¡}| |j¡}|r||dd…<|S©Nr)rÚ get_flagsr©r6©r$Úflagsr…rrrr¬Ló   zGnu95FCompiler.get_flagscCrªr«)rrSr©r8r­rrrrSSr¯z"Gnu95FCompiler.get_flags_linker_soc Cs´t |¡}tjdkrM|j}|rM|jdkrM| ¡}|rMtj  |  ¡¡}tjj |gtj fd¢RŽ}tj  |d¡}tj  |¡}tj  tj  |d¡¡rM| |¡| ¡}|rX| |¡|S)Nr rorcrdz libmingwex.a)rrnr r rurvÚ get_targetrFrXrer[rfrhrgrOrb) r$rPrurQrjrkrXÚmingwdirrmrrrrnZs     zGnu95FCompiler.get_library_dirscCsŒt |¡}tjdkr| d¡tjdkrD|j}|r7|jdkr7d|vr7| d¡}| |dd¡| |dd¡|j}|rC|jdkrCgS |S) Nr@rqr rorprÚmingwexÚmingw32) rrxr r Úremoverurvr¥Úinsert)r$rPruÚirrrrxms     zGnu95FCompiler.get_librariesc CsVz t |jdg¡}Wn ttjfyYdSwt|ƒ}t |¡}|r)| d¡SdS)Nz-vrÚ) rTrUr5rVrWrÚTARGET_Rr r!)r$rZr&rrrr°sù  zGnu95FCompiler.get_targetc Cs|t ¡}|D]&}t|dƒ} | d¡}|sn| |¡qWdƒn1s'wYqt | ¡¡}| d¡}|  d¡S)NÚrbTiÚasciiú=) ÚhashlibÚsha1ÚopenÚreadÚupdateÚbase64Ú b32encodeÚdigestÚdecodeÚrstrip)r$Ú filenamesÚhÚfnrwÚblockÚtextrrrÚ _hash_files‹s   üü€  zGnu95FCompiler._hash_filesc Cs\|j}|jdkr tdƒ‚| t|ƒt|ƒ¡}tƒrd}nd}dtj tj  |d¡¡ddd…} | d |d |} | d } | d } | d } tj  || ¡}tj  || ¡}tj  || ¡}tj  |¡rh||fS|rtdgt|ƒdg}|j || |t|ƒdd|ddddgdtƒrd}nd}d|d||g}|j s¡| ¡| |jg|¡||fS)zeCreate a wrapper shared library for the given objects Return an MSVC-compatible lib rozThis method only supports MSVCÚ win_amd64r rdrNéÚ.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_dirÚextra_postargsz /MACHINE:X64z /MACHINE:X86z/def:z/OUT:)rurvr#rËÚlistrrFrXÚsplitextÚbasenamerfrtÚlink_shared_objectÚ initializedÚ initializeÚspawnrd)r$ÚobjectsrÏÚ extra_dll_dirÚ chained_dllsÚ is_archiveruÚ object_hashÚtagrÓÚ root_nameÚdll_nameÚdef_nameÚlib_nameÚdll_pathÚdef_pathÚlib_pathÚ specifierÚlib_argsrrrÚ_link_wrapper_lib˜s` ÿÿÿ  ÿúüz Gnu95FCompiler._link_wrapper_libcCs |jdvS)N)ro)rv)r$ÚcompilerrrrÚcan_ccompiler_linkÖs z!Gnu95FCompiler.can_ccompiler_linkc CsÂ|jjdkr]g}g}|D]}| ¡ d¡r| |¡q | |¡q g}g}|ddd…D]} |j| g|||dd\} } | d| ¡| d| ¡q,|sL|S|j||||dd\} } | g|Std ƒ‚) z† Convert a set of object files that are not compatible with the default linker, to a file that is compatible. roz.aNéÿÿÿÿT)rÚrÛrFzUnsupported C compiler)rurvÚlowerÚendswithrOrçrµr#) r$rØrÏrÙÚarchivesÚ plain_objectsÚobjÚ chained_libsrÚÚarchiverdÚdllrrrÚwrap_unlinkable_objectsÚs<    û  û z&Gnu95FCompiler.wrap_unlinkable_objects)rrr‘rvr’r“r*r”r•r–r—r r rOrršr>r©r¬rSrnrxr°rËrçrérórrrrr sBõ  > c CsÖ|dd…}tjdd\}}t |¡zQtj |¡}tj |¡dd}z3| d|d|g¡t|t t |d}|  ¡|j dkWtj  |¡rQt |¡Wt |¡SWt |¡Stj  |¡rdt |¡wwt |¡w) z7Return true if the architecture supports the -arch flagNz.f)Úsuffixrz.or~z-c)ÚstderrÚstdoutÚcwd)ÚtempfileÚmkstemprFÚcloserXrYrÒrNrrrÚ communicateÚ returncodergr´)r§r†ÚnewcmdÚfidÚfilenamerjrZÚprrrr¦s(       ý  ý ÿ r¦Ú__main__)Úlog)Úcustomized_fcompilerrBrÚg95)#rrFr rKr rør¼rÁrTrrrÚnumpy.distutils.exec_commandrÚnumpy.distutils.fcompilerrÚdistutils.versionrÚ compilersrr¸rrr r¦rÚ distutilsrÚnumpy.distutilsrÚ set_verbosityÚprintr{Ú ExceptionÚerrrrÚsB    q   €ÿø