o
    uJAfޙ                    @  sF  U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z
ddlmZmZmZmZmZmZmZmZ ddlmZ ddl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 ddlmZmZ ddl m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0 ddl,m1Z1m2Z2m3Z3 ddl4m5Z5 ddlm6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddl<m=Z= ddl>m?Z? e
j@r[ddlAmBZBmCZC ddlmDZD ddlmEZE ddlFmGZG ddlmHZH ddl,mIZImJZJ ddlmKZK ddl<mLZL G dd deCZMG dd  d eCZNG d!d" d"eCZOG d#d$ d$eCZPG d%d& d&eCZQG d'd( d(eCZRG d)d* d*eCZSG d+d, d,eCZTG d-d. d.eCZUG d/d0 d0eCZVG d1d2 d2eVZWG d3d4 d4eVZXe
jYeeLe=f ZZe2d5e[d6d7Z\d8e]d9< e2d:e3e^e_g d6d;Z`d<e]d=< e(jad>d?e'e2d@e_e)fe2dAe_e)fgZbdBe]dC< dQdHdIZcdJZdG dKdL dLeZedRdOdPZfdS )SzThis module provides helper functions for Gnome/GLib related
functionality such as gobject-introspection, gresources and gtk-doc    )annotationsN   )ExtensionModule	GirTargetGResourceHeaderTargetGResourceTarget
ModuleInfoModuleReturnValueTypelibTarget
VapiTarget   )build)interpreter)mesonlib)mlog)CustomTargetCustomTargetIndex
ExecutableGeneratedListInvalidArguments)
DependencyInternalDependency)PkgConfigDependencyPkgConfigInterface)
DEPENDS_KWDEPEND_FILES_KWENV_KWINSTALL_DIR_KW
INSTALL_KWNoneTypeDEPENDENCY_SOURCES_KWin_set_validator)	noPosargsnoKwargs
FeatureNewFeatureDeprecated)typed_kwargs	KwargInfoContainerTypeInfo)typed_pos_args)MachineChoiceMesonException
OrderedSet
Popen_safe	join_args	quote_arg)OverrideProgram)read_linguas)Literal	TypedDict)ModuleState)BuildTarget)Compiler)Interpreter)TYPE_varTYPE_kwargs)FileOrString)ExternalProgramc                   @  s6   e Zd ZU ded< ded< ded< ded< ded< dS )	PostInstallboolglib_compile_schemasT.List[str]gio_querymodulesgtk_update_icon_cacheupdate_desktop_databaseupdate_mime_databaseN__name__
__module____qualname____annotations__ rI   rI   =/usr/lib/python3.10/site-packages/mesonbuild/modules/gnome.pyr<   ;   s   
 r<   c                   @  s   e Zd ZU ded< ded< dS )CompileSchemasr=   build_by_defaultT.List[FileOrString]depend_filesNrD   rI   rI   rI   rJ   rK   B   s   
 rK   c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )Yelpr?   	languagesmediasourcesr=   symlink_mediaNrD   rI   rI   rI   rJ   rO   G   
   
 rO   c                   @  s^   e Zd ZU ded< ded< ded< ded< ded	< ded
< ded< ded< ded< ded< dS )CompileResourcesr=   rL   T.Optional[str]c_namez?T.List[T.Union[mesonlib.File, CustomTarget, CustomTargetIndex]]dependenciesexportr?   
extra_argsgresource_bundleinstallinstall_dirinstall_header
source_dirNrD   rI   rI   rI   rJ   rU   N   s   
 rU   c                   @  s   e Zd ZU ded< ded< ded< ded< ded< ded	< ded
< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< dS )GenerateGirr=   rL   zT.List[Dependency]rX   r?   export_packagesrZ   fatal_warningsheaderidentifier_prefixz'T.List[T.Union[build.IncludeDirs, str]]include_directoriesT.List[T.Union[str, GirTarget]]includesr\   rV   install_dir_girinstall_dir_typelibz9T.List[T.Union[build.SharedLibrary, build.StaticLibrary]]	link_withstr	namespace	nsversion3T.List[T.Union[FileOrString, build.GeneratedTypes]]rR   symbol_prefixNrD   rI   rI   rI   rJ   r`   [   s$   
 r`   c                   @  s   e Zd ZU ded< ded< ded< ded< ded< ded	< d
ed< d
ed< d
ed< d
ed< d
ed< ded< d
ed< d
ed< ded< ded< ded< ded< ded< d
ed< ded< ded< dS ) GtkDoc'T.List[T.Union[str, build.IncludeDirs]]src_dirrk   	main_sgmlmain_xmlmodule_versionrl   z&Literal['xml', 'smgl', 'auto', 'none']moder?   	html_args	scan_argsscanobjs_argsfixxref_args	mkdb_argsz3T.List[T.Union[build.GeneratedTypes, FileOrString]]content_filesignore_headersr]   r=   checkr\   rM   gobject_typesfilehtml_assetsexpand_content_filesc_argsre   ET.List[T.Union[Dependency, build.SharedLibrary, build.StaticLibrary]]rX   NrD   rI   rI   rI   rJ   rp   o   s.   
 rp   c                   @  sf   e Zd ZU ded< ded< ded< ded< ded	< ded
< ded< ded< ded< ded< ded< dS )GdbusCodegenrM   rR   r?   rZ   rV   interface_prefixrl   r=   object_managerrL   zT.List[T.List[str]]r   r^   r]   docbookz,Literal['all', 'none', 'objects', 'default']autocleanupNrD   rI   rI   rI   rJ   r      s   
 r   c                   @  s~   e Zd ZU ded< ded< ded< ded< ded	< ded
< ded< ded< ded< ded< ded< ded< ded< ded< dS )
GenMarshalrV   build_alwayszT.Optional[bool]build_always_stalerL   zT.List[mesonlib.File]rN   r?   rZ   r]   r=   r^   internalnostdincprefixskip_sourcerM   rR   stdincvalist_marshallersNrD   rI   rI   rI   rJ   r      s   
 r   c                   @  sF   e Zd ZU ded< ded< ded< ded< ded	< ded
< ded< dS )GenerateVapirf   rR   rV   r]   r=   r\   r?   	vapi_dirsmetadata_dirsgir_dirsz(T.List[T.Union[str, InternalDependency]]packagesNrD   rI   rI   rI   rJ   r      s   
 r   c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )_MkEnumsCommonr=   r^   rV   r]   rd   ro   NrD   rI   rI   rI   rJ   r      rT   r   c                   @  s6   e Zd ZU ded< ded< ded< ded< ded< dS )	MkEnumsSimplerM   rR   rk   header_prefix	decoratorfunction_prefixbody_prefixNrD   rI   rI   rI   rJ   r      s   
 r   c                   @  sn   e Zd ZU ded< ded< ded< ded< ded< ded	< ded
< ded< ded< ded< ded< ded< dS )MkEnumsrn   rR   zT.Optional[FileOrString]
c_template
h_templaterV   commentseprodfheadfprodftailvheadvprodvtailz=T.List[T.Union[BuildTarget, CustomTarget, CustomTargetIndex]]dependsNrD   rI   rI   rI   rJ   r      s   
 r   rL   TdefaultzKwargInfo[bool]_BUILD_BY_DEFAULTrZ   r   listifyzKwargInfo[T.List[str]]_EXTRA_ARGS_KWr^   namerd   ro   zT.List[KwargInfo]_MK_ENUMS_COMMON_KWSr   !T.List[T.Union[str, T.List[str]]]returnrV   c                 C  s   d}| sdS t dd | D rt| dkrdS |S t dd | D s<t| D ]\}}t|ts9d|d  d	  S q&dS t| D ]\}}t|dksSt d
d |D s_d|d  d|   S q@dS )z+Validate gdbus-codegen annotations argumentz8must be made up of 3 strings for ELEMENT, KEY, and VALUENc                 s      | ]}t |tV  qd S N
isinstancerk   .0annotrI   rI   rJ   	<genexpr>       z(annotations_validator.<locals>.<genexpr>   c                 s  r   r   )r   listr   rI   rI   rJ   r      r   zelement r   z must be a listc                 s  r   r   r   )r   irI   rI   rJ   r      r    )alllen	enumerater   r   )r   Zbadlistcr   rI   rI   rJ   annotations_validator   s$   
r   z	>= 2.51.1c                      sP  e Zd ZedZdO fddZdPddZejdQddZ	e
dRddZe
dSddZedededdedeeeg ddededdededdded edd!deedd"dTd(d)Zed*eeejeeefed*eeeejd+d,d-eed.ee fed/eeejeefg dded0edd,ded1edd,ded2eeeg dddUd6d7Z!e
dVd=d>Z"		dWdXdGdHZ#dYdLdMZ$		dWdZdOdPZ%d[dSdTZ&d\dWdXZ'd]d[d\Z(d^d^d_Z)e*j+d`dad_dcddZ,e
d`dhdiZ-e
dadldmZ.e
dbdqdrZ/e
dcdtduZ0e
dddwdxZ1e
dedzd{Z2e
dfd~dZ3e
dgddZ4e
dhddZ5e
diddZ6e
djddZ7e
dkddZ8e
dlddZ9e
dmddZ:ede;e<j=e<j>fddedeejddee?jdded/eee@g ddedeeeg ddededddedeeeg ddedeeeg ddedeeee<jAfg ddedeeeeeBfg ddedee fddedeee fddidd dedee fddedeee fddidd dedeee<j=e<j>fg ddededdededdedeeeejeeefg ddedeeeg dddnddZCeedejddeDdoddńZEedeedǍededeeedg dddˍedeeedg d͍edeeedg d͍ededddpdd҄ZFedeededeeedg dd֍ededddedeeeejeeefg dded/eee@e<j=e<j>fdg d͍edeeeejfg ddedeeeg ddedeeeejfg ddedeeeg ddedeeeejfg ddedeeeg ddedeeee<jAfdg d͍ededdedeeeg ddedee fedee fedeeeg ddededd,eGh ddededddededd,dedeeeg ddedeeeg ddedeeee<jAfddddqddZHdrddZIeJededsddZKedeeejeeefgdedejddeLjdded eeedg dd֍edee fedee fededdedeeeefg eMdd ded+edddedee feded	deGh d
dejdddtddZNedeedgeOePedeeeejeeefdddedeeje fedeeje fedee fedee fedee fedee fedee fedee fedee fedee fR  duddZQeddedeedgeOedeeeejfdddededded edded!edded"eddR  dvd$d%ZRdd`d`d&dwd,d-ZSed.eed.eDjddePjddejd+d/eed eeedg d͍ed0edded1edded2ee fed3eddedeeeejfdd4ddded5edded6edddxd8d9ZTdyd=d>ZUdzdAdBZVd{dFdGZWedHeedHeeedeeeeBfdd4dddedIeeedg d͍edJeeedg d͍edKeeedg d͍ed:eeeeXfdg d͍d|dMdNZY  ZZS (}  GnomeModuleZgnomer   'Interpreter'r   Nonec                   s   t  | d | _d | _d | _d| _g | _d| _d| _d| _	d | _
d | _| j| j| j| j| j| j| j| j| j| j| j| j| jd d S )NF)post_installcompile_resourcesgenerate_gircompile_schemasyelpgtkdocgtkdoc_html_dirgdbus_codegenmkenumsmkenums_simple
genmarshalgenerate_vapi)super__init__gir_dep	giscanner
gicompilerinstall_glib_compile_schemasinstall_gio_querymodulesinstall_gtk_update_icon_cacheinstall_update_desktop_databaseinstall_update_mime_databasedevenvnative_glib_versionmethodsupdater   r   r   r   r   r   r   r   r   r   r   r   )selfr   	__class__rI   rJ   r     s2   zGnomeModule.__init__state'ModuleState'rk   c                 C  sL   | j d u r#td|jddd}| r| | _ | j S td d| _ | j S )Nglib-2.0TF)nativerequiredz]Could not detect glib version, assuming 2.54. You may get build errors if your glib is older.z2.54)r   r   environmentfoundget_versionr   warning)r   r   Zglib_deprI   rI   rJ   _get_native_glib_version!  s   


z$GnomeModule._get_native_glib_versionc                 C  s2   t | |tstjdtdddd d S d S )NztGLib compiled dependencies do not work reliably with 
the current version of GLib. See the following upstream issue:z1https://bugzilla.gnome.org/show_bug.cgi?id=774368TFoncefatal)r   version_comparer   gresource_dep_needed_versionr   r   boldr   r   rI   rI   rJ   Z__print_gresources_warning-  s   
z&GnomeModule.__print_gresources_warningc                   C  s   t jdt dddd d S )NzCode generated with gdbus_codegen() requires the root directory be added to
  include_directories of targets with GLib < 2.51.3:z/https://github.com/mesonbuild/meson/issues/1387TFr   )r   r   r   rI   rI   rI   rJ   _print_gdbus_warning6  s   
z GnomeModule._print_gdbus_warningtool
'ToolType'c              	   C  s8   ddddddddd}|| }| dd}| |||S )Nzgio-2.0r   gobject-introspection-1.0)gio-querymodulesglib-compile-schemasglib-compile-resourcesgdbus-codegenglib-genmarshalglib-mkenumsg-ir-scannerg-ir-compiler-_)replace	find_tool)r   r   Ztool_mapdepnamevarnamerI   rI   rJ   
_find_tool=  s   
zGnomeModule._find_toolzgnome.post_installr>   Fr   r@   Tr   rA   rB   z0.59.0)r   sincerC   z0.64.0z0.57.0argsT.List['TYPE_var']kwargs'PostInstall'r	   c                 C  s  g }t j|j |j }|d r7| js7d| _| |d}t j|dd}|j	||g}d|_
|| |d D ]-}	|	| jvrh| j|	 | |d}t j|j |	}
|j	||
g}d|_
|| q;|d r| jsd| _|jd	d
d}t|tp| }|s|d}t j|dd}|j	|ddd|g}d|_
|| |d r| jsd| _|d}t j|d}|j	|d|g}d|_
|| |d r| jsd| _|d}t j|d}|j	||g}d|_
|| td |S )Nr>   Tr   r   Zschemasr@   r   rA   zgtk4-update-icon-cacheFr   zgtk-update-icon-cacheZiconsZhicolor-qz-tz-frB   zupdate-desktop-databaseZapplicationsrC   zupdate-mime-databasemime)ospathjoinr   
get_prefixget_datadirr   r	  backendget_executable_serialisationskip_if_destdirappendr   r   find_programr   r   r   r   r   r	   )r   r   r  r  rvdatadir_absprogZ
schemasdirscriptdZ	moduledirr   ZicondirZappdirrI   rI   rJ   r   M  sV   









zGnomeModule.post_installzgnome.compile_resourcesr^   z0.37.0)r   r
  rW   rX   rY   r[   r_   T.Tuple[str, 'FileOrString']'CompileResources''ModuleReturnValue'c                   s  |    |  }|  d}|dg}|d }|d }|\}	}
g }g }|D ]'}t|tjr5||j q&|| ||  t	|t
sMd}t|q&t	|t
st|
tjru|
jrktj j |
j|
j}ntj|
j|
j}nt|
tttfrtdtj j|
}|  |||\}}} fdd|D }||7 }|tj j j t|D ]}|d	|g7 }q|d
 r|d|d
 g7 }|d s|dg7 }|g d7 }||d 7 }|d }|r|	 d}|	 d}n+d jjjjv r|	 d}|	 d}nd jjjjv r|	 d}|	 d}ntd|d r#|s#td|d }|r1|r1td|r=|d s=tdd }t	|t
sI|}n| d}g }t|d d!g }t| j j j||
g|g|d" ||||d |d# ry|d# gng d$gd%}|rt||gS |d# p jj t!d&}t|t"sJ d't#|	 d( j j j||
g|	 d)g|d" |||gd*gd+}||g}t||S ),Nr   @INPUT@r_   rX   zThe "dependencies" argument of gnome.compile_resources() cannot
be used with the current version of glib-compile-resources due to
<https://bugzilla.gnome.org/show_bug.cgi?id=774368>a4  Resource xml files generated at build-time cannot be used with gnome.compile_resources() in the current version of glib-compile-resources because we need to scan the xml for dependencies due to <https://bugzilla.gnome.org/show_bug.cgi?id=774368>
Use configure_file() instead to generate it at configure-time.c                   s    g | ]}t j j j|qS rI   )r  r  r  build_to_srcsubdirr   r   r   rI   rJ   
<listcomp>       z1GnomeModule.compile_resources.<locals>.<listcomp>--sourcedirrW   z--c-namerY   
--internal)z
--generatez--target@OUTPUT@rZ   r[   z
.gresourceZ
_gresourcer   .c_ccppz.cppZ_cppzFCompiling GResources into code is only supported in C and C++ projectsr\   zGThe install kwarg only applies to gresource bundles, see install_headerr^   z<The install_header kwarg does not apply to gresource bundlesz7GResource header is installed yet export is not enabledz.dz--dependency-filez	@DEPFILE@rL   r]   runtime)rL   depfilerN   extra_dependsr\   r]   install_tag
includedirfor mypy_h.hdevel)rL   r3  r\   r]   r4  )$&_GnomeModule__print_gresources_warningr   r	  r   r   Filer  r&  
get_subdirr   r   r+   is_builtr  r  r  r   get_build_dirfnamer   r   r   _get_gresource_dependenciesr%  r,   coredata	compilershostcopyr   
subprojectr	   
get_option	OptionKeyrk   r   )r   r   r  r  glib_versionZglib_compile_resourcescmdsource_dirsrX   target_name
input_filesubdirsr   depmifilerN   r_   Z	gresourceoutputr   r^   r2  Z
target_cmdZtarget_cr]   Ztarget_hr  rI   r(  rJ   r     s   










zGnomeModule.compile_resourcesrL  rJ  r?   CT.Sequence[T.Union[mesonlib.File, CustomTarget, CustomTargetIndex]]eT.Tuple[T.List[mesonlib.FileOrString], T.List[T.Union[CustomTarget, CustomTargetIndex]], T.List[str]]c              
   C  s  d|dg}|d| j g7 }|D ]}|dtj| j |g7 }qzt|| j d\}}}W n ttfy8   t	dw |j
dkrTd|d  d	| }	t|	 t|j
||d
d d }
g }g }g }|
 D ]}tj|}|D ]X}t|tjr|j|krqq|
| || ||j   nct|ttfrd }dd | D }|D ]\}}||kr|} nq|d ur|
| || ||   n+qqztj| j d|}W n t	y   t	d| d| dw |
| || qg||
 |||fS )Nr   z--generate-dependenciesr+  )cwdz)Could not execute glib-compile-resources.r   z6glib-compile-resources failed to get dependencies for r   z:

c                 S  s   h | ]
}|t j|fqS rI   )r  r  basename)r   orI   rI   rJ   	<setcomp>I      z:GnomeModule._get_gresource_dependencies.<locals>.<setcomp>.z
Resource "z" listed in "z" was not found. If this is a generated file, pass the target that generates it to gnome.compile_resources() using the "dependencies" keyword argument.)r&  r  r  r  r-   r   get_source_dirFileNotFoundErrorPermissionErrorr+   
returncoder   r   
subprocessCalledProcessErrorsplitrD  rW  r   r   r;  r?  remover  r   r   get_outputsr<  from_source_fileextend)r   rL  rJ  rX   rI  r_   pcstdoutstderrrO  Zraw_dep_filesr   rM  Z	dep_filesZresfileZresbasenamerN  r?  outputsrX  ZbaseofrI   rI   rJ   r@     st   











z'GnomeModule._get_gresource_dependencieslib1T.Union[build.SharedLibrary, build.StaticLibrary]r   gT.Sequence[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString', build.StructuredSources]]include_rpathr=   use_gir_argsyT.Tuple[T.List[str], T.List[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString', build.StructuredSources]]]c           
      C  s   g }t |}t|tjrRtj|j |j	
|}|d|  |r*|d|  || |j	|D ]}	tj|j |	}	|d|	  |rQ|d|	  q5|re| dre|d|j  ||fS |d|j  ||fS )N-Lz-Wl,-rpath,--extra-library--extra-library=-l)r   r   r   SharedLibraryr  r  r  r   r>  r  get_target_dirr  determine_rpath_dirs_gir_has_optionr   )
r   r   rl  r   ro  rp  Zlink_commandnew_dependslibdirr   rI   rI   rJ   _get_link_argsj  s&   
zGnomeModule._get_link_argsdepsUT.Sequence[T.Union['Dependency', build.BuildTarget, CustomTarget, CustomTargetIndex]]T.Tuple[OrderedSet[str], OrderedSet[T.Union[str, T.Tuple[str, str]]], OrderedSet[T.Union[str, T.Tuple[str, str]]], OrderedSet[str], T.List[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString', build.StructuredSources]]]c              	   C  s2  t  }t  }t  }t  }	t|}t|}|D ]c}
t|
tr8|
jdddd}|r8t|ts2J d|	|g t|
t	r||

  |||
j |
jD ]B}t|tjr| ||||\}}|| | | ||||}||d  ||d  ||d  |	|d  |d	 }qP| |
j||||}||d  ||d  ||d  |	|d  |d	 }|
jD ]}t|tr|	tj|j | g qqt|
trX||

  t|
jd
d}|D ]f}tj|r9t|
ddr9tj |}|d| g |r|d| g tj!|}|"dr-|dd  }|#dd }d| }|"dr@q|dkrP||t$|fg q||g qqt|
tj%tjfrr|||
&  |'|
 qt()d|
d q|r| *drddd}||}||}||||	|fS )Ngirdir 	pkgconfigr   default_valuer6  r   r   r   r      T)raw
is_libtoolFrr  z-Wl,-rpath rl  z.soru  z-Wz
-frameworkzdependency z not handled to build gir filesrs  ldflags+T.Iterable[T.Union[str, T.Tuple[str, str]]]r   +OrderedSet[T.Union[str, T.Tuple[str, str]]]c                 S  s@   t  }| D ]}t|tr|dr|ddd}|| q|S )Nru  rt  r   )r,   r   rk   
startswithr  add)r  Zfixed_ldflagsldflagrI   rI   rJ   fix_ldflags  s   z<GnomeModule._get_dependencies_flags_raw.<locals>.fix_ldflags)r  r  r   r  )+r,   r   r   r   r   r   get_variablerk   r   r   get_compile_argsget_include_argsre   	librariesr   rv  r|  _get_dependencies_flags_rawget_external_depsext_depsrR   r   r  r  r  r   r>  r<  iterget_link_argsisabsgetattrdirnamerW  r  rb  nextStaticLibraryget_include_dirsr  r   logry  )r   r}  r   r   ro  rp  cflagsinternal_ldflagsexternal_ldflagsgi_includesrN  r  rl  _ldZlibdepflagsZextdepflagssourcer  flagZlib_dirlibnamer  rI   rI   rJ   r    s   











z'GnomeModule._get_dependencies_flags_rawT.Tuple[OrderedSet[str], T.List[str], T.List[str], OrderedSet[str], T.List[T.Union[build.BuildTarget, 'build.GeneratedTypes', 'FileOrString', build.StructuredSources]]]c                 C  s   |  |||||\}}}}	}g }
g }|D ]}t|tr!|
| q|
| q|D ]}t|tr6|| q)|| q)||
||	|fS r   )r  r   rk   r  rf  )r   r}  r   r   ro  rp  r  Zinternal_ldflags_rawZexternal_ldflags_rawr  r  r  r  rI   rI   rJ   _get_dependencies_flags  s   	

z#GnomeModule._get_dependencies_flags	girtarget=T.Union[Executable, build.StaticLibrary, build.SharedLibrary]c                 C  sh   t |ttjtjfstd| dt|j d}t |tjr2t	| 
|d  |s2td| |S )Nz4Gir target must be an executable or library but is "z
" of type z>=1.58.1r   zEStatic libraries can only be introspected with GObject-Introspection )r   r   r   rv  r  r+   typerE   r   r   _get_gir_depr   )r   r  r   ZSTATIC_BUILD_REQUIRED_VERSIONrI   rI   rJ   _unwrap_gir_target   s   
zGnomeModule._unwrap_gir_targetr  valuec                 C  s(   | j d u r
t | _ | j ||g d S r   )r   r   EnvironmentVariablesprepend)r   r  r  rI   rI   rJ   _devenv_prepend  s   

zGnomeModule._devenv_prependbbuild.Buildc                 C  s    | j d ur|j | j  d S d S r   )r   r  )r   r  rI   rI   rJ   postconf_hook  s   
zGnomeModule.postconf_hookT.Tuple[Dependency, T.Union[Executable, 'ExternalProgram', 'OverrideProgram'], T.Union[Executable, 'ExternalProgram', 'OverrideProgram']]c                 C  s>   | j s|d| _ | |d| _| |d| _| j | j| jfS )Nr   r  r  )r   
dependencyr	  r   r   r   rI   rI   rJ   r    s
   zGnomeModule._get_gir_depN)maxsizeoptionc                 C  sP   | j }t|tr|dv sJ dS t| dg tjd\}}}|jdko'||v S )N>   --sources-top-dirsrs  Tz--help)ri  r   )r   r   r0   r-   get_commandr`  STDOUTr_  )r   r  exeprX  r  rI   rI   rJ   ry     s   
zGnomeModule._gir_has_optionrg   rf   4T.Tuple[T.List[str], T.List[str], T.List[GirTarget]]c              	   C  s   g }g }g }|D ]:}t |tr|d| g7 }qt |trB|tj| j |	  |dtj|	 |
   || q|||fS )Nz
--include=z--include-uninstalled=)r   rk   r   r  r  r  r  r   r>  r<  get_basename)r   rg   retgir_inc_dirsr   incrI   rI   rJ   _scan_include+  s   

"

zGnomeModule._scan_includelangsT.Iterable[str]c                 C  sB   g }|D ]}| j jtj|}|D ]}|dr|| qq|S )Nrr  )r   rA  get_external_link_argsr*   HOSTr  r  )r   r  r  lang	link_argslink_argrI   rI   rJ   _scan_langs<  s   

zGnomeModule._scan_langs
girtargetsT.Sequence[build.BuildTarget] T.List[T.Union[str, Executable]]c                 C  s   g }|D ]a}t |tr|d|g7 }qtj| | }| j }t |t	j
r:|d|tj|g7 }| }ntj| d| }|d|g7 }| j|D ]}tj| j |}|d|  qQq|S )Nz	--programz-L{}/{}/z	--libraryrr  )r   r   r  r  r  r<  get_filenamer   r>  r   rv  formatr  r  r  rx  r  )r   r  r  r  libpath
build_rootr  r   rI   rI   rJ   _scan_gir_targetsH  s    


zGnomeModule._scan_gir_targets T.List[T.Tuple[str, 'Compiler']]c                 C  s@   g }| D ]}|j  D ]\}}|dv r|||f  nqq|S )N>   r   r   r0  objcobjcpp)rB  itemsr  )r  r  r  r  compilerrI   rI   rJ   _get_girtargets_langs_compilersj  s   z+GnomeModule._get_girtargets_langs_compilersOT.List[T.Union[build.BuildTarget, CustomTarget, CustomTargetIndex, Dependency]]c                 C  s*   g }| D ]}||  7 }|| 7 }q|S r   )get_all_link_depsr  r  r  r  rI   rI   rJ   _get_gir_targets_depsv  s
   z!GnomeModule._get_gir_targets_depsOrderedSet[build.IncludeDirs]c                 C  s"   t  }| D ]	}||  q|S r   )r,   r   r  r  rI   rI   rJ   _get_gir_targets_inc_dirs  s   z%GnomeModule._get_gir_targets_inc_dirslangs_compilers.T.Tuple[T.List[str], T.List[str], T.List[str]]c                 C  s   g }g }g }|D ]X\}}| j |r|| j | 7 }| j|r&|| j| 7 }td|jv r`| jjjtd j	}||
|7 }|d}d|v rN|dg7 }d|v rW|dg7 }d|v r`|dg7 }q|||fS )	N
b_sanitize,addressz-lasanthreadz-ltsan	undefinedz-lubsan)global_argsgetproject_argsr   rG  base_optionsr   rA  optionsr  sanitizer_compile_argsrb  )r   r  r  r  r  r  r  sanitizerI   rI   rJ   _get_langs_compilers_flags  s(   




z&GnomeModule._get_langs_compilers_flagssrcdirnsrm   
libsourcesWT.Sequence[T.Union[str, mesonlib.File, GeneratedList, CustomTarget, CustomTargetIndex]]c                 C  s2  | j |d }tj|st| tj|| d| d}t|dddh}|D ]\}	t|	t	t
frO|	 D ]}
|tj| j | j |	|
d  q7q*t|	tjra||	| jd  q*t|	trz|	 D ]}|tj||d  qjq*|tj||	d  q*W d    |S 1 sw   Y  |S )Nr   r  Z_gir_filelistwutf-8encodingrU  )r  get_target_private_dir_absr  r  isdirmkdirr  openr   r   r   rd  writer   r>  rw  r   r;  rel_to_builddirr%  r   )r   r  r  rm   r  r  Zgir_filelist_dirZgir_filelist_filenameZgir_filelistsZcustom_outputgen_srcrI   rI   rJ   _make_gir_filelist  s6   



zGnomeModule._make_gir_filelistgirfilescan_commandQT.Sequence[T.Union['FileOrString', Executable, ExternalProgram, OverrideProgram]]generated_filesWT.Sequence[T.Union[str, mesonlib.File, CustomTarget, CustomTargetIndex, GeneratedList]]gT.Sequence[T.Union['FileOrString', build.BuildTarget, 'build.GeneratedTypes', build.StructuredSources]]T.Dict[str, T.Any]r   c           
      C  s   |d }|d u r|d }|d }|d u rt j| j d}n|du r%d}tj| jtjdd}| jj	j
jd  }	|d	d
d |	D d ||d  t|| j| j| j|||g|d |||gdg|dS )Ninstall_girr\   rh   zgir-1.0FT)uninstalledr   CCc                 S  s   g | ]}t |qS rI   )r/   )r   xrI   rI   rJ   r)        z0GnomeModule._make_gir_target.<locals>.<listcomp>r   envrL   r9  )rL   r3  r\   r]   r4  r  )r  r  r  r   r  r   get_envr*   r  rA  rB  rC  get_exelistsetmerger   r&  rE  )
r   r  r  r  r   r  r\   r]   Zrun_envZ
cc_exelistrI   rI   rJ   _make_gir_target  s6   zGnomeModule._make_gir_targettypelib_outputtypelib_cmdCT.Sequence[T.Union[str, Executable, ExternalProgram, CustomTarget]]r
   c                 C  s~   |d }|d u r|d }|d }|d u rt j| j d}n|du r%d}t|| j| j| j|||g||gdg|d |d d	S )
Ninstall_typelibr\   ri   zgirepository-1.0FtypelibrL   r  )r\   r]   r4  rL   r  )r  r  r  r   
get_libdirr
   r&  rE  )r   r  r  r  r  r\   r]   rI   rI   rJ   _make_typelib_target  s,   z GnomeModule._make_typelib_targetST.Sequence[T.Union[Dependency, build.BuildTarget, CustomTarget, CustomTargetIndex]]c           
      C  s
  g }t |}|D ]x}t|tr9|jD ]%}t|tr7||vr7|| tj| j	
 | }||vr7|| qn&t|tjr_|jD ]}t|tr^tj| j	
 | }||vr^|| qBt|tr|jdddd}	t|	tsuJ d|	r|	|vr||	 q||fS )Nr  r  r  r6  )r   r   r   rR   r   r  r  r  r  r   r>  r<  r   rv  	generatedr   r  rk   )
r   r}  r   typelib_includesrz  rN  r  r&  Zg_sourcer  rI   rI   rJ   +_gather_typelib_includes_and_update_depends  s<   	








z7GnomeModule._gather_typelib_includes_and_update_dependsc                 C  s.   g }|D ]}|t | jjtj|7 }q|S r   )r   r   r   rA  get_external_argsr*   r  )r   r  r  r  rI   rI   rJ   _get_external_args_for_langs4  s   z(GnomeModule._get_external_args_for_langsr  c                 c  s*    | D ]}| dr| ds|V  qdS )z?g-ir-scanner only accepts -I/-D/-U; must ignore all other flags)z-Dz-U-Iz-D_FORTIFY_SOURCENr  )r  rk  rI   rI   rJ   _get_scanner_cflags;  s   zGnomeModule._get_scanner_cflagsr  c                 c  s     | D ]
}| dr|V  qdS )zFg-ir-scanner only accepts -L/-l; must ignore -F and other linker flags)rr  ru  rs  Nr!  )r  rk  rI   rI   rJ   _get_scanner_ldflagsD  s   
z GnomeModule._get_scanner_ldflagszgnome.generate_girr   )varargsmin_varargsz0.40.0)r
  z1.2.0ra   rb   0.55.0rc   rd   re   r  0.61.0rh   )r'  z'Use install_gir to disable installationc                 C     | du rdS d S NTzas boolean can only be falserI   r  rI   rI   rJ   <lambda>\      zGnomeModule.<lambda>)deprecated_values	validatorr  ri   )r'  z+Use install_typelib to disable installationc                 C  r(  r)  rI   r*  rI   rI   rJ   r+  `  r,  rj   rl   r  rR   ro   NT.Tuple[T.List[T.Union[Executable, build.SharedLibrary, build.StaticLibrary]]]'GenerateGir'c           ,        s   dtj  fdd|d D }t|dkr&tdd |D r&td \}}}|d	 }|d
 }	|d }
| d|	 d}tj	j
 j}tj	j
 j}g }||j ||  |} |\}}} |}||d 7 }||g7 } ||\}} j||dd\}}}}}g }|t |7 }|t |7 }|t  dd |D 7 }g }|t |7 }|t |7 }g }|t |7 }|t |7 } |}|d }g }|g}|dg7 }|dg7 }|d| d|	 g7 }|dg7 }|ddg7 }|dd |d D 7 }||d 7 }|d| d| g7 }||7 }|d |||	||
 g7 }|d D ]}  j| |dd\}!}||! qJ |d  \}"}#}$||" ||# ||$ |d!d |d" D 7 }|d#d |d$ D 7 }|d%d |d& D 7 }|d'g7 }||7 }|d(g7 }||7 }|jt|||d)d*7 }|t|7 }|  |7 }| !d+d |D 7 }|t|7 } "d,r|d,tj	j
 j#g7 }|d,tj	j
 j#g7 }d-|v rt$%d.d/j&d0j' |d1 r|(d- d2d |
D }% )|||%|t*+d3|}&| d|	 d4}'||&ddg}(|(j|d5d*7 }(|D ]
})|(d5|) g7 }(qI ,|'|(|%t*+d3|}* -d6tj	j
 j |&|*g}+t.|+|+S )7Nr   c                   s   g | ]}  |qS rI   )r  )r   argr   rI   rJ   r)  l  s    z,GnomeModule.generate_gir.<locals>.<listcomp>r   r   c                 s  r   r   )r   r   )r   elrI   rI   rJ   r   m  r   z+GnomeModule.generate_gir.<locals>.<genexpr>zVgenerate_gir only accepts a single argument when one of the arguments is an executablerl   rm   rR   r  z.girrX   T)rp  c                 S     g | ]}|d  qS r   rI   r   ZlcrI   rI   rJ   r)    r  re   --quietz--no-libtool--namespace=z--nsversion=z
--warn-all--outputr-  c                 S     g | ]}d | qS )z--c-include=rI   )r   hrI   rI   rJ   r)        rc   rZ   r   z--filelist=rj   rg   c                 S  r9  )z--symbol-prefix=rI   r   r  rI   rI   rJ   r)    r;  ro   c                 S  r9  )z--identifier-prefix=rI   r<  rI   rI   rJ   r)    r;  rd   c                 S  r9  )z--pkg-export=rI   r<  rI   rI   rJ   r)    r;  ra   z--cflags-beginz--cflags-endz--add-include-path=)r   c                 S  r3  r4  rI   r5  rI   rI   rJ   r)    r  r  z--warn-errorz(gnome.generate_gir argument --warn-errorr&  z%Use "fatal_warnings" keyword argumentrb   c                 S  s    g | ]}t |tttfr|qS rI   )r   r   r   r   )r   rk  rI   rI   rJ   r)    r*  r  z.typelibz--includedir=ZGI_TYPELIB_PATH)/add_languager*   r  r   anyr+   r  r  r  r  r   r\  r&  r>  rf  rR   r  r  r  r  r  r   r"  r  r#  r  r  r   r|  r  	itertoolschainr  r  ry  root_subdirr%   
single_userE  current_noder  r  Tcastr  r  r	   ),r   r   r  r  r  r   r   r   r  rm   r  r  r  builddirr   r  r  r  r  r}  r  Z
dep_cflagsZdep_internal_ldflagsZdep_external_ldflagsr  Zscan_cflagsZscan_internal_ldflagsZscan_external_ldflagsZgirtargets_inc_dirsinc_dirsr  r  lZ_cflags_cmdZ_gincZ_depsr  Zscan_targetr  r  incdirZtypelib_targetr  rI   r   rJ   r   K  s   



$















zGnomeModule.generate_girzgnome.compile_schemas'CompileSchemas'c           	      C  s   t j|j|j}|j}| |dd||g}|jdkrd}n	d|jdd }t||j|j|j	|g dg|d	 |d
 dd
}| 
dt j|j	 |j t||gS )Nr   z--targetdirr  zgsettings-compilezgsettings-compile-r  r  zgschemas.compiledrL   rN   zCompiling gschemas {})rL   rN   descriptionZGSETTINGS_SCHEMA_DIR)r  r  r  r%  r&  r	  r  r   rE  r   r  r>  r	   )	r   r   r  r  r  outdirrI  
targetnameZtarget_grI   rI   rJ   r     s(   
zGnomeModule.compile_schemasz
gnome.yelp)r$  rP   z0.43.0z2Use a LINGUAS file in the source directory instead)r   r   
deprecateddeprecated_messagerQ   )r   r   rS   T.Tuple[str, T.List[str]]'Yelp'c           *        s@  |d }|d }|d rt dd jd j |s$|d }|s#tdn	|d r-td  fd	d
|D }|d }|sHttj	
 jj j}|d }|d }	g }
g } d} d} d}tj	
 j d}tj	
|d|}tj|||t  jdd}|
| g }|D ]6}tj jjtj	
 jd|}|| tj	
|tj	|}tj|g||t  jdd}|
| qtj	
d jd|d } fdd
|D }|d|g}|| td| d|g tj	
 jd j j}|
| |D ]}tj	
 j|}tj	
|||}t|D ]a\}}tj	|}tj	
||}|	rGtj	
tj	j||d|} tj| tj	|| jdd}!n*ztj jj||}"W n tya   || }"Y nw tj|"g||t  jdd}!|
|! q|d }#|ddtj	
d||#tj	
d||#|g}$td| d| d|$|g| j j}%|
|% ||% |d | d  }&td| d| d!| j j|d"dd#g|#g|&gdgd$d%	}'|
|' td| d| | j j|d&tj	
||&d'|dd(d"g|||'gd)|gdgd$d*}(|
|( qtd| d| j j j})|
|) t d |
S )+Nr   rR   r   z,gnome.yelp more than one positional argumentz0.60.0z+use the "sources" keyword argument instead.zYelp requires a list of sourcesz\"gnome.yelp" ignores positional sources arguments when the "sources" keyword argument is setc              	     s,   g | ]}t j jjtj jd |qS )C)	r   r;  re  r   r_   r  r  r  r&  r   r  r(  rI   rJ   r)    s    z$GnomeModule.yelp.<locals>.<listcomp>rP   rQ   rS   itstoolmsgmergemsgfmthelprS  doc)r4  @SOURCE_ROOT@z.potc                   s    g | ]}t jd  jd|qS )rZ  rS  )r  r  r  r&  rT  r(  rI   rJ   r)  -  r*  z-ozhelp-z-pot)startz.por  r  z
-update-poz.gmoz-gmor$  r-  zGenerating yelp doc {})r4  rL  z-mz--lang@OUTDIR@T)r3  r\   r]   r4  rL  )!r%   rB  rE  rC  r+   r   r   r1   r  r  r  r   r_   r&  r  r  r   Datar   FileModer  r;  re  r  rf  	RunTargetr   relpathSymlinkDatarW  r   AliasTargetr	   )*r   r   r  r  Z
project_idrR   Zsources_filesr  rQ   symlinkstargetsZ	potargetsrU  rV  rW  r]   Zc_install_dirZc_dataZmedia_filesrO  rk  Zm_install_dirZm_dataZpot_fileZpot_sourcesZpot_args	pottargetrH  Zl_subdirZl_install_dirr   Zm_dirlink_targetZl_dataZm_filepo_fileZpo_argsZpotargetZgmo_file	gmotargetZmergetargetZallpotargetrI   r(  rJ   r     s   


















zGnomeModule.yelpzgnome.gtkdocr   z0.48.0)r
  r   r   r~   z0.52.0r|   r   rz   r   rw   r   r}   r\   r]   rs   rt   r{   rv   auto>   nonexmlri  Zsgml)r   r
  r.  ru   r  rx   ry   rr   )r   r   T.Tuple[str]'GtkDoc'c           #        s  |d }|d }|d }|d ur|d urt d|}|d }||r%d| nd d } j }	|d	 }
 d
tj dL fdd}|d }g }|D ]}t|tjra|	|
 j  j  qI|| qIddd j  d j  d j dd| d| d| d| d|d  g
}dD ]"}d| } |}| }|d usJ d |d!| d"|  q|
r|d#|
   j }|r|d$d%|   |d&d|d'   |d(d|d)   |d*d|d+   |d,d||d-   |d.d|d/   |d0d|d1   |d2d||d3   g }g }|d4 D ]w}t|ttfrb|| | D ]}|tj j  j|| qJq7t|tjrz|| j  j  q7t|tr|| | D ]}|tj j  j| qq7|tj j  j| q7|d5d| g7 }|d6d||d7   |d8d|d9   |d:d|d;   | |d< |d= |d>  |\}}|	| |	| t| j j  j|	| g | d?gd@|dAdB
}t!||g j j  j}|dC rN dD}dE| dF| g}|dG |f} tj j  j}! j"| ||!|gdH ||g}"|dI rd|" jj#|	| dJdK t$||"S )MNr   rs   rt   z<gnome.gtkdoc: main_xml and main_sgml are exclusive argumentsru   r  r  z-docrl   r   filesT.Iterable['FileOrString']r   T.Iterator[str]c                 3  sR    | D ]#}t |tjr| j  j V  qtj	 j  j
|V  qd S r   )r   r   r;  absolute_pathr   r\  r>  r  r  r  r&  )rn  rk  r(  rI   rJ   abs_filenames  s   z)GnomeModule.gtkdoc.<locals>.abs_filenamesrr   r,  r   z--sourcedir=z--builddir=z	--subdir=z--headerdirs=z@@z--mainfile=z--modulename=z--moduleversion=z--mode=rv   )scanZscangobjZmkdbZmkhtmlZfixxrefzgtkdoc-z8This shouldn't be possible since program should be found--=r7  z--run=r   z--htmlargs=rw   z--scanargs=rx   z--scanobjsargs=ry   z--gobjects-types-file=r   z--fixxrefargs=rz   z--mkdbargs=r{   z--html-assets=r   r|   z--content-files=z--expand-content-files=r   z--ignore-headers=r}   z--installdir=r]   r   re   rX   z	-decl.txtTzGenerating gtkdoc {})r   r3  rL  r~   zgtkdoc-checkzDOC_MODULE=zDOC_MAIN_SGML_FILE=z-check)r  workdirr   r\   rY  )tag)rn  ro  r   rp  )%r   r   get_build_commandr=  r*   r  r   r   IncludeDirsrf  to_string_listr\  r>  r  r&  r  r  get_pathget_exe_wrapperr  r   r   rd  r  r  r  rw  r   r;  rq  r   _get_build_argsrE  rb  testr  r	   )#r   r   r  r  Z
modulename	main_filert   ZmoduleversionrN  commandrl   rr  src_dirsZheader_dirsrr   t_argsr   Zprogram_nameprogramr  exe_wrapperr   r|   r  rX  r  Z
build_argsrz  custom_targetalias_targetZ	check_cmdZ	check_env
check_argsZcheck_workdirresrI   r(  rJ   r   y  s   #



















zGnomeModule.gtkdocrG  rq   r   >T.Sequence[T.Union[build.BuildTarget, 'build.GeneratedTypes']]c                 C  s>  g }|  }| j|||dd\}}	}
}}|| ||| g }||	 ||
 ||jjtjd ||jj	tjd |jjj
tj d }| |d|fg}||d  ||d  ||d  |r|dt|  g7 }|dt|  g7 }|r|d	t| g7 }|r|d
t| g7 }||fS )NT)ro  r   r   r   r   z--cc=%sz--ld=%sz--cflags=%sz--ldflags=%s)rD  r  rf  r  r   rA  r  r*   r  r  rB  r  r.   r  get_linker_exelist)r   r   rG  r}  r   r   r  r  Zdeps_cflagsr  r  Z_gi_includesrz  r  r  Zcompiler_flagsrI   rI   rJ   r}    s0   


zGnomeModule._get_build_argszgnome.gtkdoc_html_dir'TYPE_kwargs'c                 C  s   t jd|d S )Nzshare/gtk-doc/htmlr   )r  r  r  )r   r   r  r  rI   rI   rJ   r   3  s   zGnomeModule.gtkdoc_html_dirzgnome.gdbus_codegen)optargsz0.46.0rZ   z0.47.0r   r   r   c                 C  s   | rt | d tr| gS | S )Nr   r   r*  rI   rI   rJ   r+  E  rZ  )r   r.  	convertorr   r   r   >   objectsrj  r   GT.Tuple[str, T.Optional[T.Union['FileOrString', build.GeneratedTypes]]]'GdbusCodegen'c                 C  s  |d }|d r|d gng }|  |dg}||d  | |}t|ds8|d dkr7td| d	 n|d }|dkrBd
}|d|g |d d urX|d|d g |d d urg|d|d g |d rq|dg ||d  |d }	|d D ]}
|d ||
 qg }|d }|d p|jj	
td}t|tsJ d|d }t|dr|g d }n/|d d ur|d }|d|g7 }t|dr|d d!d"|d#g7 }n|   |d"d$| d#g7 }|}t||j|j|j|||g|	d%d&	}|| |d' }t|dr|g d( }g }n|}|g}t||j|j|j|||g|	|||gd)gd*d+}|| |d d ur|d }|d, }g }|D ]}|d-|tjt| qHt|drn|d d!d|d#g }g }n|}|g}t||j|j|j||||	|d.d/
}|| t||S )0Nr   r   r   rZ   z	>= 2.49.1r   r   zGlib version (zE) is too old to support the 'autocleanup' kwarg, need 2.49.1 or newerr   z--c-generate-autocleanupr   z--interface-prefixrl   z--c-namespacer   z--c-generate-object-managerrR   rL   r   z
--annotater^   r]   r5  r6  r.  z	>= 2.56.2)--bodyr8  r-  r$  r   z--generate-docbookz	>= 2.51.3z--output-directoryr\  z--generate-c-coder$  z	@OUTDIR@/zGenerating gdbus source {})rL   rL  r8  )--headerr8  r-  r$  r9  zGenerating gdbus header {})rL   r3  r\   r]   r4  rL  z-docbookz{}-{}zGenerating gdbus docbook {})rL   r3  rL  )r	  rf  r   r   r   r   r   r  r   rA  rF  rG  r   rk   r   r   r&  rE  r  r  r  rW  r	   )r   r   r  r  namebaseZ	xml_filesrI  rH  ZacrL   r   rd  r^   r]   rQ  c_cmdr   Zcfile_custom_targetZ	hfile_cmdr   Zhfile_custom_targetrj  rk  Zdocbook_cmdZdocbook_custom_targetrI   rI   rJ   r   8  s   



"

zGnomeModule.gdbus_codegenzgnome.mkenumsr   r   r   r   r   r   r   r   r   r   	'MkEnums'c                 C  s  |d }|d }t |tjr||jj|jj}|d }t |tjr,||jj|jj}g }g d}|D ]}	||	 rH|d|	dd ||	 g7 }q4g }
d }|d urtj	
tj	|d }|dd	g }|g}||d
  | j|||||d |d d}|
| |d urtj	
tj	|d }|dd	g }|g}||d
  |d  }|d ur|| | j|||||d}|
d| |d u r|d u r|d	g }| j||d
 |||d |d d}t||gS t|
|
S )Nr   r   r   )
r   r   r   r   r   rd   ro   r   r   r   rt  r  r  z
--templater$  rR   r^   r]   r\   r]   r   )r   )r   r   r;  rq  r   r_   	build_dirr  r  r  rW  splitextrf  _make_mkenum_implr  rD  insertr	   )r   r   r  r  rW  r   r   rI  known_kwargsr1  rd  Zh_targetZh_outputh_cmdZ	h_sourcesZc_outputr  Z	c_sourcesr   Zc_targetZgeneric_cmdtargetrI   rI   rJ   r     s\   




zGnomeModule.mkenumszgnome.mkenums_simplez0.42.0r   r   r   r   'MkEnumsSimple'c                 C  sB  |d  d}|d  d}|d }|d }|d }|d }	g }
|d r-|
 d	|d g |d
 r:|
 d|d
 g |
 }d}|	dkrJ|d|	 7 }|d| 7 }| j|d D ]}tj| |j}|d| d7 }qX|t	
d7 }| d|g |d |t	
d |d |t	
d| d | ddg |d |t	
d |d | ||d ||}|
 }|d |t	
d| d |d |t	
d |d |t	
d | d!| d"| d# |d$ |t	
d% |d | j||d |||d& |d' d(}t||g||gS ))Nr   r8  r.  r   r   r   r   rd   z--identifier-prefixro   z--symbol-prefixr  z%s
z#include "%s"
rR   z
#include "z"
za
            #define C_ENUM(v) ((gint) v)
            #define C_FLAGS(v) ((guint) v)
            z--fheadz--fprodz>
            /* enumerations from "@basename@" */
            z--vheadz
            GType
            z@enum_name@_get_type (void)
            {
            static gsize gtype_id = 0;
            static const G@Type@Value values[] = {z--vprodz<    { C_@TYPE@(@VALUENAME@), "@VALUENAME@", "@valuenick@" },z--vtaila:      { 0, NULL, NULL }
            };
            if (g_once_init_enter (&gtype_id)) {
                GType new_type = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
                g_once_init_leave (&gtype_id, new_type);
            }
            return (GType) gtype_id;
            }r$  z?#pragma once

            #include <glib-object.h>
            z(

            G_BEGIN_DECLS
            z
            z
            GType zP@enum_name@_get_type (void);
            #define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (z@enum_name@_get_type())z--ftailz
            G_END_DECLSr^   r]   r  )rf  rD  r   source_strings_to_filesr  r  r`  relative_namer&  textwrapdedentr  r  r	   )r   r   r  r  Zhdr_filenameZbody_filenamer   Zdecl_decoratorZfunc_prefixr   rI  r  r   hdrZhdr_pathZc_filer  Zh_filerI   rI   rJ   r      s   



	

	


zGnomeModule.mkenums_simple)r\   r]   r   rQ  rI  *T.Optional[T.Sequence[T.Union[str, bool]]]MT.Optional[T.Sequence[T.Union[CustomTarget, CustomTargetIndex, BuildTarget]]]build.CustomTargetc          
      C  sr   |  |dg}|| |p|jjtd}	t|	ts!J dt	||j
|j|j|||gd||	gdg|dddS )Nr   r5  r6  Tr9  zGenerating GObject enum file {})capturer\   r]   r4  r3  absolute_pathsrL  )r	  rf  r   rA  rF  r   rG  r   rk   r   r&  rE  )
r   r   rR   rQ  rI  r\   r]   r   Zreal_cmdZ_install_dirrI   rI   rJ   r    s(   
zGnomeModule._make_mkenum_implzgnome.genmarshalr   r   r   r   r   )allow_emptyr   r   'GenMarshal'c                 C  s  |d }|d }t | |d}| |dg}|d r%|d|d g |d r?|r3||d  ntjdtd	d
dd dD ]}|| rS|d|	dd  qA|d }	d}
t | |drj|ddg7 }nd
}
|d }|ddg }|r}|dg7 }t
|d |j|j|j|||g|	|d r|d gng dg|
|d dd}|ddg }g }t | |d r|d!|g7 }|| t
|d" |j|j|j||| d#g|
|d |d$d%}||g}t||S )&Nr   rR   z	>= 2.53.3r   r   z--prefixrZ   zvThe current version of GLib does not support extra arguments 
for glib-genmarshal. You need at least GLib 2.53.3. See z-https://github.com/mesonbuild/meson/pull/2049TFr   )r   r   r   r   r   rt  r  r  r^   z	>= 2.51.0r8  r-  r8  r  r$  z--pragma-oncer7  r]   r9  rN   z$Generating glib marshaller header {})r\   r]   r4  r  rN   rL  r  z	>= 2.53.4z--include-headerr/  r.  z$Generating glib marshaller source {})r  rN   r3  rL  )r   r   r   r	  rf  r   r   r   r  r  r   r&  rE  r   r	   )r   r   r  r  rQ  rR   Znew_genmarshalrI  kr^   r  header_filer  rc   r  
extra_depsbodyr  rI   rI   rJ   r     sz   



zGnomeModule.genmarshalr   (T.List[T.Union[InternalDependency, str]]OT.Tuple[T.List[str], T.List[VapiTarget], T.List[str], T.List[str], T.List[str]]c                 C  s&  |s	g g g g g fS g }g }g }g }g }|D ]v}t |trpdd |jD }	|	D ]H}
tj|j |
 }tj|j	 |
 }|

 d dd }|d|  |d|  |d|  ||
 || || q&qt |tsyJ d	|d|  || || q|||||fS )
z
        Packages are special because we need to:
        - Get a list of packages for the .deps file
        - Get a list of depends for any VapiTargets
        - Get package name from VapiTargets
        - Add include dirs for any VapiTargets
        c                 S  s   g | ]	}t |tr|qS rI   )r   r   )r   trI   rI   rJ   r)  $  s    z6GnomeModule._extract_vapi_packages.<locals>.<listcomp>r   N
--vapidir=	--girdir=z--pkg=r6  )r   r   rR   r  r  r  r   r\  r<  r>  rd  r  rk   )r   r   r   vapi_dependsvapi_packagesvapi_includesZ	vapi_argsremaining_argsr1  rd  r  r  rM  outfilerI   rI   rJ   _extract_vapi_packages  s<   	



z"GnomeModule._extract_vapi_packageslibrary
build.Datac           	      C  s   |j j}tj||d }t|ddd}|D ]	}||d  qW d    n1 s+w   Y  tt	
d||g||t	 |jS )Nz.depsr  r  r  rU  T)r   scratch_dirr  r  r  r  r  r   r]  r   r;  r^  rE  )	r   r   r  r   r]   rM  r?  ofilepackagerI   rI   rJ   _generate_deps:  s   $zGnomeModule._generate_depsr  r   T.List[build.LibTypes]c                 C  sF   g }|  D ]}t|tjr|| qt|tr || |7 }q|S r   )get_target_dependenciesr   r   rv  r  r   _get_vapi_link_with)r   r  rj   rN  rI   rI   rJ   r  B  s   
zGnomeModule._get_vapi_link_withzgnome.generate_vapir   r   r   'GenerateVapi'c                 C  s@  g }|d }t j|j |j}t j|j |j}| ||d \}}	}
}}|ddd| d| g}|	dd |d	 D  |	d
d |d D  |	dd |d D  ||7 }|d| g7 }|d }g }|D ]:}t
|tr|t j|| qot
|tr|| |7 }t j|j | }t j|| d }|| qo|d }|jjtd}t
|tsJ d|d pt j|dd}|d r| |||
|}|| t||j|j|j|||g|	|d |gdgd}t|jdg| dg}|g|	 }td |g g |g |g g i g g g }|| t||S )Nr   r   vapigenr6  z
--library=z--directory=c                 S  r9  )r  rI   r'  rI   rI   rJ   r)  c  r;  z-GnomeModule.generate_vapi.<locals>.<listcomp>r   c                 S  r9  )--metadatadir=rI   r'  rI   rI   rJ   r)  d  r;  r   c                 S  r9  )r  rI   r'  rI   rI   rJ   r)  e  r;  r   r  rR   z.vapidatadirr6  r]   valavapir\   r9  )r  rR   rj  r3  r\   r]   r4  r[  F)r  r  r  r   r>  r&  r\  r  r  rf  r   rk   r  r   r  r<  rd  rA  rF  r   rG  r  r   rE  r   ry  r   r	   )r   r   r  r  Zcreated_valuesr  r  r_   Zpkg_cmdr  r  r  r   rI  inputsrj   r   r&  Zgir_fileZvapi_outputr  r]   Zdeps_targetZvapi_targetincsrR   r  rI   rI   rJ   r   K  sb   




 

zGnomeModule.generate_vapi)r   r   r   r   )r   r   r   rk   )r   r   r   r   )r   r   )r   r   r   rk   r   r   )r   r   r  r  r  r  r   r	   )r   r   r  r!  r  r"  r   r#  )
r   r   rL  rk   rJ  r?   rX   rR  r   rS  )FF)r   r   rl  rm  r   rn  ro  r=   rp  r=   r   rq  )r}  r~  r   r   r   rn  ro  r=   rp  r=   r   r  )r}  r~  r   r   r   rn  ro  r=   rp  r=   r   r  )r  r  r   r   r   r  )r  rk   r  rk   r   r   )r  r  r   r   )r   r   r   r  )r  rk   r   r=   )r   r   rg   rf   r   r  )r   r   r  r  r   r?   )r   r   r  r  r   r  )r  r  r   r  )r  r  r   r  )r  r  r   r  )r   r   r  r  r   r  )r   r   r  rk   r  rk   rm   rk   r  r  r  r  r   rk   )r   r   r  rk   r  r  r  r  r   r  r  r  r   r   )r   r   r  rk   r  r  r  r  r  r  r   r
   )r   r   r}  r  r   rn  r   rq  )r   r   r  r?   r   r?   )r  r  r   r  )r  r  r   r  )r   r   r  r/  r  r0  r   r	   )r   r   r  r  r  rK  r   r	   )r   r   r  rQ  r  rR  r   r	   )r   r   r  rl  r  rm  r   r	   )r   r?   rG  rq   r}  r   r   r   r   r  r   rq  )r   r   r  rl  r  r  r   rk   )r   r   r  r  r  r  r   r	   )r   r   r  rl  r  r  r   r	   )r   r   r  rl  r  r  r   r	   )r   r   rR   r  rQ  rk   rI  r?   r\   r=   r]   r  r   r  r   r  )r   r   r  rl  r  r  r   r	   )r   r   r   r  r   r  )
r   r   r  rk   r   r?   r]   rk   r   r  )r  r   r   r  )r   r   r  rl  r  r  r   r	   )[rE   rF   rG   r   INFOr   r   r   run_oncer:  staticmethodr   r	  r&   r'   r=   r(   r   rk   r"   r$   r   r)   r;  r   r   r   r   r   r   evolver   r   r   r@  r|  r  r  r  r  r  r  	functools	lru_cachery  r  r  r  r  r  r  r  r   r  r  r  r  r"  r#  r   r   rv  r  r   r   ry  r   r   r   r   r   r!   r   r}  r#   r   r    r   r   r   r   r   r   r  r   r  r  r  r   r   __classcell__rI   rI   r   rJ   r     sR   , La

!,(

 q
z 
!v"


 
;
	
m
"

 J(
	r   interpr   c                 C  s\   t | }|jttj |jttj |jttj |jttj |jttj |S r   )	r   r   append_holder_mapr   CustomTargetHolderr   r   r
   r   )r  modrI   rI   rJ   
initialize  s   r  )r   r   r   rV   )r  r   r   r   )g__doc__
__future__r   rD  r?  r  r  r`  r  typingrD  r  r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   rX   r   r   dependencies.pkgconfigr   r   Zinterpreter.type_checkingr   r   r   r   r   r   r    r!   interpreterbaser"   r#   r$   r%   r&   r'   r(   interpreterbase.decoratorsr)   r*   r+   r,   r-   r.   r/   programsr0   Zscripts.gettextr1   TYPE_CHECKINGZtyping_extensionsr2   r3   r4   r5   rB  r6   r7   r8   r9   r:   r;   r<   rK   rO   rU   r`   rp   r   r   r   r   r   r   UnionZToolTyper=   r   rH   r   rk   r   r  r   r   r   r   r  rI   rI   rI   rJ   <module>   s   (( 


               $