a ;jg@sddlmZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z ddlmZddlZGdd d ZGd d d e Zd d ZddZdS)) annotationsN)Path)Backend)Template)chainc @seZdZdZdddddddddddd ddZddd d Zd dd d Zd dddZd dddZd dddZ d dddZ d dddZ ddZ dS) MesonTemplatez+Template meson build file generation class.strz list[Path]z list[str]) modulenamesourcesdeps libraries library_dirs include_dirs object_files linker_args fortran_args build_type python_exec Cs||_ttjd|_||_||_||_||_ |durB||_ ng|_ i|_ ||_ dd| D|_ |j|j|j|j|j|jg|_| |_| |_d|_dS)Nzmeson.build.templatecSs0g|](}|dr|ds(d|dn|qS)') startswithendswith).0xrE/usr/local/lib/python3.9/site-packages/numpy/f2py/_backends/_meson.py 2sz*MesonTemplate.__init__..z )r r__file__parentabsolutebuild_template_pathr r r rr substitutionsobjectsrinitialize_templatesources_substitutiondeps_substitutioninclude_substitutionlibraries_substitutionfortran_args_substitutionpipelinerrindent) selfr r r r rrrrrrrrrr__init__s2zMesonTemplate.__init__returncCs.|js$ttjd|jd|jS)NzMeson build template z does not exist.)r is_fileFileNotFoundErrorerrnoENOENTr read_textr+rrrmeson_build_templateBs z"MesonTemplate.meson_build_templateNonecCs(|j|jd<|j|jd<|j|jd<dS)Nr Z buildtypepython)r r!rrr4rrrr#Ls  z!MesonTemplate.initialize_templatecs$dfddjDjd<dS)N, csg|]}jd|dqSz'''z''',r*rsourcer4rrrSz6MesonTemplate.sources_substitution..Z source_list)joinr r!r4rr4rr$Qsz"MesonTemplate.sources_substitutioncs,djfddjDjd<dS)Nr8csg|]}jd|dqS)z dependency('z'),r:)rdepr4rrrXr=z3MesonTemplate.deps_substitution..Zdep_list)r*r>r r!r4rr4rr%Vs zMesonTemplate.deps_substitutioncsdddtjDjd<dddjDjd<djfddjDjd<djfd dttjDjd <dS) N cSs"g|]\}}d|d|dqS)lib_dir_z( = declare_dependency(link_args : ['''-Lz'''])r)rilib_dirrrrr]sz8MesonTemplate.libraries_substitution..Zlib_dir_declarationscSs$g|]}|ddd|dqS)._z& = declare_dependency(link_args : ['-lz']))replacerlibrrrrdsZlib_declarationscs$g|]}j|dddqS)rDrE,)r*rFrGr4rrrkr=Zlib_listcsg|]}jd|dqS)rArIr:)rrBr4rrrnr= lib_dir_list)r> enumeraterr!r r*rangelenr4rr4rr'[s      z$MesonTemplate.libraries_substitutioncs,djfddjDjd<dS)Nr8csg|]}jd|dqSr9r:)rincr4rrrsr=z6MesonTemplate.include_substitution..Zinc_list)r*r>rr!r4rr4rr&qs z"MesonTemplate.include_substitutioncCs@|jr2|jdddd|jDd|jd<n d|jd<dS)Nzfortran_args: [z, cSsg|]}|qSrr)rargrrrryr=z;MesonTemplate.fortran_args_substitution..z],r)rr*r>r!r4rrrr(vs" z'MesonTemplate.fortran_args_substitutioncCs<|jD] }|qt|}||j}tdd|}|S)Nz,,rI)r)rr5 substituter!resub)r+nodetemplateZ meson_buildrrrgenerate_meson_build~s    z"MesonTemplate.generate_meson_buildN) __name__ __module__ __qualname____doc__r,r5r#r$r%r'r&r(rVrrrrrs"- rcs^eZdZfddZddddZdddd d Zd d Zddd dZddddZZ S) MesonBackendcsVtj|i||jdg|_d|_tdd|jDr@dnd|_t |j|_dS)N dependenciesZbbdircss|]}d|vVqdS)debugNr)rflagrrr r=z(MesonBackend.__init__..r]release) superr,Z extra_datgetr\meson_build_diranyfc_flagsr _get_flags)r+argskwargs __class__rrr,s zMesonBackend.__init__r) build_dircCsvt||j}t||jd||jd}|D]8}t|j}|rZ|t ||t |q8dS)Nz*.soz*.pyd) rrcrglobr cwdnameexistsunlinkshutilcopy2osremove)r+rkZwalk_dirZ path_objectsZ path_object dest_pathrrr_move_exec_to_roots zMesonBackend._move_exec_to_rootr6)rkr.c Csft|j|j|j|j|j|j|j|j|j |j t j }| }t|jdddt|d}|||S)z1Writes the meson build file at specified locationTparentsexist_okz meson.build)rr r r\r rr extra_objectsZ flib_flagsrersys executablerVrmkdir write_text)r+rkZmeson_templatesrcZmeson_build_filerrrwrite_meson_builds$   zMesonBackend.write_meson_buildcCstj||dddS)NT)rmcheck) subprocessrun)r+commandrmrrr_run_subprocess_commandsz$MesonBackend._run_subprocess_commandcCs6dd|jg}|||ddd|jg}|||dS)Nmesonsetupcompilez-C)rcr)r+rkZ setup_commandZcompile_commandrrr run_mesons  zMesonBackend.run_mesonr-cCs<t|j|j|j|_||j||j||jdS)N)_prepare_sourcesr r rkrrrvr4rrrrs  zMesonBackend.compile) rWrXrYr,rvrrrr __classcell__rrrirr[s  r[cCs|}t|jddd|D](}t|rt|rt||qt|dt|dt|dg}t|}|D]2}|r|t|||j||j|q|dd|D}|S)NTrwzmodule.cz-f2pywrappers2.f90z-f2pywrappers.fcSs$g|]}t|jdkst|jqS)z.pyf)rsuffixrnr;rrrrsz$_prepare_sources..) copyrr}ror/rqrnappendrp)Zmnamer bdirZextended_sourcesr<Zgenerated_sourcesZgenerated_sourcerrrrs&     rcCsbg}td}|D]<}||}|r|d}dd|D}||qtt |}|S)Nz--f(77|90)flags=(.*)cSsg|]}|dqS)z'")strip)rvalrrrrr=z_get_flags..) rRrmatchgrouprsplitextendlistdictfromkeys)reZ flag_valuesZ flag_patternr^Z match_resultvaluesZ unique_flagsrrrrfs   rf) __future__rrsr1rqrr{rRpathlibrZ_backendrstringr itertoolsrwarningsrr[rrfrrrrs     u>