o 6aO @sFddlZddlZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z ddl m Z ddlmZddlmZddgZedZd d ZGd ddeZGd ddeZd dZedkrddlmZddlmZedeed z eed WdSe!yZ"z ee"WYdZ"["dSdZ"["wwdS)N)PopenPIPESTDOUT)filepath_from_subprocess_output) FCompiler) LooseVersion GnuFCompilerGnu95FCompilerzTarget: ([a-zA-Z0-9_\-]*)cCstjdko tddkS)Nwin32r64bit)sysplatform architecturerr?/usr/lib/python3/dist-packages/numpy/distutils/fcompiler/gnu.pyis_win64src @seZdZdZdZdZddZddZdd gZd d ggd d d gd ddgdggd dZ d Z d Z e j dkr=ejdkr=dgZejdkrNdD] Ze edqDdZdZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd S).rgnu)g77zGNU Fortran 77 compilercCs|dr||ddd}|dst|dkr?td|}|r>|dr1d|dfS|d kr>d |dfSn3td |}|rNd |dfStd |}|rr|d}|d sj|dsj|drnd|fSd |fSd}t||)z6Handle the different versions of GNU fortran compilerszgfortran: warning Nz ([0-9.]+)z GNU FortranrrgfortranzGNU Fortran\s+95.*?([0-9-.]+)z%GNU Fortran.*?\-?([0-9-.]+\.[0-9-.]+)023z6A valid Fortran version was not found in this string: ) startswithfindstriplenresearchgroupstart ValueError)selfversion_stringmverrrrrgnu_version_matchs2        zGnuFCompiler.gnu_version_matchcCs&||}|r |ddkrdS|dS)Nrrr)r))r$r%r'rrr version_matchLs zGnuFCompiler.version_matchrf77N -dumpversion)N-g-Wall-fno-second-underscore)Nr-r.ar-crranlib version_cmd compiler_f77 compiler_f90 compiler_fix linker_soarchiverr2 linker_exentcygwinz-fPICr )r4r5r8r: -mno-cygwing2cgnu95cCs|jdd}tjdkr=tjdd}|s5ddl}|d}|s.d}d|}tj |ddt |tjd<| gd n| d tj d rM| d |S) NrdarwinMACOSX_DEPLOYMENT_TARGETrz10.9z.Env. variable MACOSX_DEPLOYMENT_TARGET set to ) stacklevel)z -undefineddynamic_lookupz-bundlez-sharedsunosz -mimpure-text)r8r r osenvironget sysconfigget_config_varwarningswarnstrextendappendr)r$opttargetrIsrrrget_flags_linker_soms       z GnuFCompiler.get_flags_linker_soc CsFz t|jdg}Wn ttjfyYdSwt|}tj|S)Nz-print-libgcc-file-name) subprocess check_outputr5OSErrorCalledProcessErrorrrFpathdirname)r$outputrrrget_libgcc_dirs  zGnuFCompiler.get_libgcc_dirc Cstjdddkr d}n tjdkrd}nd}d}|rBd|g}z t|j|}Wn ttjfy7Y|Swt|}t j |}|S)Nlinuxzlibgfortran.sor@zlibgfortran.dylibz-print-file-name={0}) r r formatrTrUr5rVrWrrFrXrY)r$libgfortran_namelibgfortran_dir find_lib_argrZrrrget_libgfortran_dirs&   z GnuFCompiler.get_libgfortran_dircCsg}tjdddkrd|}|rdtjdkr_|ds_tj|}tj|d|j}tj |s_tjj|gtj fdR}tj tj|d}tj|d|j}tj |r_| || || }|ro| ||S)Nr\r]r z/usr/libzlib%s.alib)r r r[rrFrXnormpathjoinr>existspardirabspathrOrb)r$rPdrXrootd2lib_gfortran_dirrrrget_library_dirss$      zGnuFCompiler.get_library_dirscCsg}|}|dur&|jd}|j||jf}tjtj||s%|j}n|j}|dur2|||j }t j dkrF|rF|j dkrF|dt j dkrP|d|S)Nz-picr msvcgccr@ cc_dynamic) r[r>static_lib_formatstatic_lib_extensionrFrXisfilerfrO c_compilerr r compiler_type)r$rPrjr>frurrr get_librariess$      zGnuFCompiler.get_librariescCsdgS)Nr-rr$rrrget_flags_debugszGnuFCompiler.get_flags_debugcCs0|}|r|dkrdg}ndg}|d|S)Nz3.3.3z-O2z-O3z-funroll-loops) get_versionrO)r$r'rPrrr get_flags_opts   zGnuFCompiler.get_flags_optcCs^ddl}z|d}Wn tygYSwtd}g}||D]}|d|g7}q$|S)z( Return detected arch flags from CFLAGS rNCFLAGSz -arch\s+(\w+)-arch)rIget_config_varsKeyErrorrcompilefindall)r$rIcflagsarch_re arch_flagsarchrrr _c_arch_flagss  zGnuFCompiler._c_arch_flagscCsgS)Nrryrrrget_flags_archszGnuFCompiler.get_flags_archcCsTtjdkrtd|vs Jtjdkrd|Stjdddkr%d|Sd|S) Nr ,r@z -Wl,-rpath,aixz-Wl,-blibpath:z -Wl,-rpath=)r r NotImplementedError)r$dirrrrruntime_library_dir_options      z'GnuFCompiler.runtime_library_dir_option)__name__ __module__ __qualname__rvcompiler_aliases descriptionr)r*possible_executables executablesmodule_dir_switchmodule_include_switchrFnamer r pic_flagskeyrOr>suggested_f90_compilerrSr[rbrnrxrzr|rrrrrrrrsF-  #   c @seZdZdZdZdZddZddgZdd ggd gd gd gd d dgdgddgdZdZ dZ e j dddkrXed de ddddkrXdD] Zee dqNdZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1ZdS)2r r?)rzGNU Fortran 95 compilercCs`||}|r |ddkrdS|d}t|dkr |Stjdkr.dD] }|j|dq#|S)Nrrr4r )r4r5r6r7r8r:r=)r)rr r rrO)r$r%r'rrrrr*s   zGnu95FCompiler.version_matchrf95r,)Nr.r-z -ffixed-formr/)Nr.r-r/)rr.r-r0r1r2Nr.r3z-Jz-Irrr8z -lpthreadrrB64)r5r6r7r8r:z-maix64cCs^tjdksgSg}|}d|vrd||d<dD]}t||r,||vr,|d|gq|S)z>Return a list of -arch flags for every supported architecture.r@i386i686)ppcrx86_64ppc64r~)r r rindex _can_targetrN)r$cmdrc_archsrrrr_universal_flags<s zGnu95FCompiler._universal_flagscC*t|}||j}|r||dd<|SNr)r get_flagsrr6r$flagsrrrrrL   zGnu95FCompiler.get_flagscCrr)rrSrr8rrrrrSSrz"Gnu95FCompiler.get_flags_linker_soc Cst|}tjdkrM|j}|rM|jdkrM|}|rMtj | }tjj |gtj fdR}tj |d}tj |}tj tj |drM|||}|rX|||S)Nr rorcrdz libmingwex.a)rrnr r rurv get_targetrFrXrer[rfrhrgrOrb) r$rPrurQrjrkrXmingwdirrmrrrrnZs     zGnu95FCompiler.get_library_dirscCst|}tjdkr|dtjdkrD|j}|r7|jdkr7d|vr7|d}||dd||dd|j}|rC|jdkrCgS |S) Nr@rqr rorprmingwexmingw32) rrxr r removerurvrinsert)r$rPruirrrrxms     zGnu95FCompiler.get_librariesc CsVz t|jdg}Wn ttjfyYdSwt|}t|}|r)|dSdS)Nz-vr) rTrUr5rVrWrTARGET_Rr r!)r$rZr&rrrrs  zGnu95FCompiler.get_targetc Cs|t}|D]&}t|d} |d}|sn||qWdn1s'wYqt|}|d}| dS)NrbTiascii=) hashlibsha1openreadupdatebase64 b32encodedigestdecoderstrip)r$ filenameshfnrwblocktextrrr _hash_filess     zGnu95FCompiler._hash_filesc Cs\|j}|jdkr td|t|t|}trd}nd}dtjtj |dddd} | d |d |} | d } | d } | d } tj || }tj || }tj || }tj |rh||fS|rtdgt|dg}|j || |t|dd|ddddgdtrd}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_dirextra_postargsz /MACHINE:X64z /MACHINE:X86z/def:z/OUT:)rurvr#rlistrrFrXsplitextbasenamerfrtlink_shared_object initialized initializespawnrd)r$objectsr extra_dll_dir chained_dlls is_archiveru object_hashtagr root_namedll_namedef_namelib_namedll_pathdef_pathlib_path specifierlib_argsrrr_link_wrapper_libs`   z Gnu95FCompiler._link_wrapper_libcCs |jdvS)N)ro)rv)r$compilerrrrcan_ccompiler_links z!Gnu95FCompiler.can_ccompiler_linkc Cs|jjdkr]g}g}|D]}|dr||q ||q g}g}|dddD]} |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.aNT)rrrFzUnsupported C compiler)rurvlowerendswithrOrrr#) r$rrrarchives plain_objectsobj chained_libsrarchiverddllrrrwrap_unlinkable_objectss<     z&Gnu95FCompiler.wrap_unlinkable_objects)rrrrvrrr*rrrrr r rOrrr>rrrSrnrxrrrrrrrrrr sB  > c Cs|dd}tjdd\}}t|zQtj|}tj|dd}z3|d|d|gt|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)stderrstdoutcwd)tempfilemkstemprFcloserXrYrrNrrr communicate returncodergr)rrnewcmdfidfilenamerjrZprrrrs(          r__main__)log)customized_fcompilerrBrg95)#rrFr rKr rrrrTrrrnumpy.distutils.exec_commandrnumpy.distutils.fcompilerrdistutils.versionr compilersrrrrr rr distutilsrnumpy.distutilsr set_verbosityprintr{ ExceptionerrrrsB    q