o
    ék)huK  ã                   @   sæ   d Z ddlZddlmZ ddlZddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZmZmZmZmZ dd	lmZ ejZeeeƒƒD ]Zee d d
v rhee d d fee dd…  ee< qKG dd„ deƒZdS )zC Modified version of build_clib that handles fortran source files.
é    N)Úglob)Ú
build_clib)ÚDistutilsSetupErrorÚDistutilsErrorÚDistutilsFileError)Úlog)Únewer_group)Úfilter_sourcesÚget_lib_source_filesÚget_numpy_include_dirsÚhas_cxx_sourcesÚhas_f_sourcesÚis_sequence)Únew_ccompiler_opt)z
build-clibz
build-tempú=é   c                   @   st   e Zd ZdZejg d¢ Zejg d¢ Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r   z1build C/C++/F libraries used by Python extensions))z
fcompiler=Nz!specify the Fortran compiler type)ÚinplaceÚizBuild in-place)z	parallel=Újznumber of parallel jobs)ú
warn-errorNz'turn all warnings into errors (-Werror))zcpu-baseline=Nz4specify a list of enabled baseline CPU optimizations)zcpu-dispatch=Nz.specify a list of dispatched CPU optimizations)údisable-optimizationNz1disable CPU optimized code(dispatch,simd,fast...))r   r   r   c                 C   s8   t  | ¡ d | _d| _d | _d | _d | _d | _d | _d S )Nr   )	Úold_build_clibÚinitialize_optionsÚ	fcompilerr   ÚparallelÚ
warn_errorÚcpu_baselineÚcpu_dispatchÚdisable_optimization)Úself© r    úBlib/python3.10/site-packages/numpy/distutils/command/build_clib.pyr   1   s   

zbuild_clib.initialize_optionsc              
   C   s\   | j rzt| j ƒ| _ W n ty } ztdƒ|‚d }~ww t | ¡ |  dddddd¡ d S )Nz)--parallel/-j argument must be an integerZbuild)r   r   )r   r   )r   r   )r   r   )r   r   )r   ÚintÚ
ValueErrorr   Úfinalize_optionsZset_undefined_options)r   Úer    r    r!   r$   <   s   
€ÿ
ûzbuild_clib.finalize_optionsc                 C   ó*   | j D ]\}}t| dg ¡ƒr dS qdS ©NÚsourcesTF)Ú	librariesr   Úget©r   Úlib_nameÚ
build_infor    r    r!   Úhave_f_sourcesK   ó
   ÿzbuild_clib.have_f_sourcesc                 C   r&   r'   )r)   r   r*   r+   r    r    r!   Úhave_cxx_sourcesQ   r/   zbuild_clib.have_cxx_sourcesc                 C   sN  | j sd S g }|  d¡ | j D ]\}}| dd ¡}|r$||vr$| |¡ qddlm} || j| j| jd| _| jj	| j
|  ¡ d | jrR| jj d¡ | jj d¡ | j }d | _ | j | ¡ || _ | j ¡  | js¯tj dd	d
d¡}tj |  d¡j|¡}tj tj | jd¡¡}t| dƒr“| j ¡  t| j|| j| j|d| _dd„ }	dd l}
|
 |	| j¡ |   ¡ rìddl!m"} || j#| j$| j| jd|v | jd| _%| j%d urë| j% 	| j
¡ | j }d | _ | j% | ¡ || _ | j% ¡  nd | _%|  &| j ¡ | j'r#| j
j(D ]'}| j )|j*¡}tj | j+|¡}tj |j,|¡}|  -|j,¡ t. /||¡ qýd S d S )NÚ	build_srcÚlanguager   )Únew_compiler)ÚcompilerÚdry_runÚforce)Zneed_cxxz-WerrorÚnumpyÚ	distutilsÚincludeznpy_cpu_dispatch_config.hzccompiler_opt_cache_clib.pyÚcompiler_opt)r4   Údispatch_hpathr   r   Ú
cache_pathc                 S   s    t  d¡ t  | jdd¡ d S )Nz3
########### CLIB COMPILER OPTIMIZATION ###########T)Zfull)r   ÚinfoÚreport)Zcoptr    r    r!   r>   Œ   s   
zbuild_clib.run.<locals>.report©Únew_fcompilerÚf90©r4   Úverboser5   r6   Ú
requiref90Z
c_compiler)0r)   Zrun_commandr*   ÚappendZdistutils.ccompilerr3   r4   r5   r6   Ú	customizeÚdistributionr0   r   Zcompiler_soZcustomize_cmdZshow_customizationr   ÚosÚpathÚjoinÚget_finalized_commandr1   ÚabspathÚ
build_tempÚhasattrr:   Zcache_flushr   r   r   ÚatexitÚregisterr.   Únumpy.distutils.fcompilerr@   r   rC   Ú_f_compilerÚbuild_librariesr   Zinstalled_librariesÚlibrary_filenameÚnamer   Z
target_dirÚmkpathÚshutilÚcopy)r   Ú	languagesr,   r-   Úlr3   r)   r;   Zopt_cache_pathr>   rO   r@   ZlibnameÚsourceÚtargetr    r    r!   ÚrunW   sŠ   

€þ
ÿ
ÿ

ýû

€úzbuild_clib.runc                 C   s.   |   | j¡ g }| jD ]	}| t|ƒ¡ q|S ©N)Zcheck_library_listr)   Úextendr
   )r   Ú	filenamesÚlibr    r    r!   Úget_source_files±   s
   
zbuild_clib.get_source_filesc                 C   s    |D ]\}}|   |||¡ qd S r^   )Úbuild_a_library)r   r)   r,   r-   r    r    r!   rS   ¸   s   ÿzbuild_clib.build_librariesc                 C   s>   |du rg S g }|D ]}t |ƒr||| ƒ7 }q
| |¡ q
|S )ah   Assemble flags from flag list

        Parameters
        ----------
        in_flags : None or sequence
            None corresponds to empty list.  Sequence elements can be strings
            or callables that return lists of strings. Callable takes `self` as
            single parameter.

        Returns
        -------
        out_flags : list
        N)ÚcallablerE   )r   Zin_flagsZ	out_flagsZin_flagr    r    r!   Úassemble_flags¼   s   zbuild_clib.assemble_flagsc           0         s  | j }| j}| d¡}|d u st|ƒstd| ƒ‚t|ƒ}t|ƒ\}}}	}
|
  p0| dd¡dk}g }|r:| d¡ |rA| d¡ |rI| d¡ n|	rP| d¡ ||d< |j|| j	d	}|| d
g ¡ }| j
}| jsv| j ¡ svt d¡ d}|s†t||dƒs†t d|¡ d S t d|¡ | di ¡}|d urÍ|rÍt d|f ¡ ddlm} ||j| j| j| j
|| j d}|d urÍ| j}| d¡ ¡ }| |¡ | |¡ |	sÑ|
rÛ|d u rÛtd| ƒ‚|d urï| d¡påg |_| d¡píg |_| d¡}|d u rúg }| d¡}|d u rg }|  | d¡¡}|  | d¡¡}|  | d¡¡}|  t!ƒ ¡ | d¡p+g }t"j# $|¡}|r:|  %|¡ |jdkrJ||7 }g }||7 }g }g }g }g }| js¢|  &d¡j'}t"j# (d d!d"¡} t"j# (|| ¡} | | ¡ |}!|f|d#f||f|d$ffD ]\}"}#‰ |"D ]‰|#‡ ‡fd%d&„ˆd d … D ƒ7 }#q†q| j )¡ }n| d'¡ g }$|rÇt d(¡ |$| jj*|| j+|!|| || j|| |%d)7 }$|rät d*¡ |$| jj*|| j+|!|| || j|| d+7 }$|rt d,¡ |$|j,|| j+|| || j|| | d-7 }$|r%t d.¡ | -¡ }%|%j,|| j+|| || j|| | d-}&|$  |&¡ |	s+|
rÊg }g }'|rD|j.d u r<t/d/ƒ}(|| 0||¡7 }|
r[t d0¡ |'|j,|
| j+||| j|d-7 }'|r²| jj.d u r²t/d/ƒD ]H})|)|(v rrqit"j# (||)¡}*t"j# 1|)¡t"j# 1|*¡krˆqit"j# 2|*¡r”t" 3|*¡ z	|  4|)|¡ W qi t5y±   t 6d1|)|f ¡ Y qiw |	rÉt d2¡ |'|j,|	| j+||| j|d-7 }'ng }'|'rQ| 7|¡sQt"j# (| j	|d3 ¡}+t8|+d4ƒ})|) 9d5 (d6d7„ |'D ƒ¡¡ W d   ƒ n	1 sýw   Y  t"j# (| j	|d8 ¡}+t8|+d4ƒ})|) 9d5 (d9d7„ |$D ƒ¡¡ W d   ƒ n	1 s*w   Y  t"j# (| j	||j: ¡},t8|,d:ƒ})W d   ƒ n	1 sKw   Y  n|$  |'¡ |j;|$|| j	| jd; | d<g ¡}-|D ]\}.}/|.|-v r{|-  |/ d<g ¡¡ qi|-r†|-|d<< d S d S )=Nr(   zfin 'libraries' option (library '%s'), 'sources' must be present and must be a list of source filenamesr2   ÚcrA   zc++Zf77Úsource_languages)Ú
output_dirÚdependsz*Detected changes on compiler optimizationsTZnewerz"skipping '%s' library (up-to-date)zbuilding '%s' libraryÚ	config_fczEusing additional config_fc from setup script for fortran compiler: %sr   r?   rB   z<library %s has Fortran sources but no Fortran compiler foundÚextra_f77_compile_argsÚextra_f90_compile_argsÚmacrosÚinclude_dirsZextra_compiler_argsÚextra_cflagsÚextra_cxxflagsÚmodule_dirsZmsvcr1   r7   r8   r9   )z.dispatch.c)z.dispatch.cppz.dispatch.cxxc                    s&   g | ]}|  ˆ ¡rˆ ˆ |¡¡‘qS r    )ÚendswithÚpopÚindex)Ú.0Ús©Z_extZ_srcr    r!   Ú
<listcomp>K  s
    
þÿz.build_clib.build_a_library.<locals>.<listcomp>)ZNPY_DISABLE_OPTIMIZATIONr   z#compiling C++ dispatch-able sources)rh   Úsrc_dirrm   rn   ÚdebugÚextra_postargsZ	ccompilerz!compiling C dispatch-able sources)rh   ry   rm   rn   rz   r{   zcompiling C sources)rh   rm   rn   rz   r{   zcompiling C++ sourcesz*.modz#compiling Fortran 90 module sourceszfailed to move %r to %rzcompiling Fortran sourcesz	.fobjectsÚwÚ
c                 s   ó    | ]	}t j |¡V  qd S r^   ©rH   rI   rL   ©ru   Úobjr    r    r!   Ú	<genexpr>»  ó   € z-build_clib.build_a_library.<locals>.<genexpr>z	.cobjectsc                 s   r~   r^   r   r€   r    r    r!   r‚   À  rƒ   Úwb)rh   rz   r)   )<r4   rR   r*   r   r   Úlistr	   rE   rT   r   r6   r   r:   Z	is_cachedr   rz   r   r=   rQ   r@   Zcompiler_typerC   r5   rG   Zget_option_dictrX   ÚupdaterF   r   rk   rl   re   r_   r   rH   rI   ÚdirnamerV   rK   r1   rJ   Zcpu_baseline_flagsZtry_dispatchrM   ÚcompileÚcxx_compilerZmodule_dir_switchr   Zmodule_optionsrL   ÚisfileÚremoveZ	move_filer   ÚwarnZcan_ccompiler_linkÚopenÚwriteZstatic_lib_extensionZcreate_static_lib)0r   r-   r,   r)   r4   r   r(   Z	c_sourcesZcxx_sourcesZ	f_sourcesZfmodule_sourcesrD   rg   Zlib_fileri   Zforce_rebuildrj   r@   ZdistZbase_config_fcrm   rn   r{   ro   rp   rq   Zmodule_build_dirZcopt_c_sourcesZcopt_cxx_sourcesZcopt_baseline_flagsZcopt_macrosZbsrc_dirr;   Zcopt_build_srcZ_srcsZ_dstZobjectsr‰   Zcxx_objectsZ	f_objectsZexisting_modulesÚfÚtZlistfnZ	lib_fnameZclib_librariesZlnameZbinfor    rw   r!   rc   Ô   sì  
þ
ÿÿ


ÿ
þû

ÿÿÿÿÿ


ÿÿÿ


ÿþ
þÿ

ø
ù	
ÿþú

ÿþú
	ÿ
û

ÿÿ
û€
ÿÿ
ÿÿ
ÿÿ€
þ
€ÿzbuild_clib.build_a_libraryN)Ú__name__Ú
__module__Ú__qualname__Údescriptionr   Úuser_optionsZboolean_optionsr   r$   r.   r0   r]   rb   rS   re   rc   r    r    r    r!   r      s    ÿZr   )Ú__doc__rH   r   rW   Zdistutils.command.build_clibr   r   Zdistutils.errorsr   r   r   Znumpy.distutilsr   Zdistutils.dep_utilr   Znumpy.distutils.misc_utilr	   r
   r   r   r   r   Znumpy.distutils.ccompiler_optr   r•   Z_lÚrangeÚlenZ_ir    r    r    r!   Ú<module>   s      &€