o
    uJAfs9                     @  s8  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	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 d d	lmZ d d
lmZ d dlmZ ejr\d dlZd6ddZd7ddZd8ddZG dd dZd9dd Z d:d"d#Z!d;d'd(Z"d<d)d*Z#d;d+d,Z$d;d-d.Z%d=d1d2Z&d>d4d5Z'dS )?    )annotationsN)defaultdict)Path   )mlog)mesonlib)MesonExceptionRealPathAction	join_argssetup_vsenv)detect_ninja)UserArrayOption)buildvaluestrreturnT.List[str]c                 C  s
   t | S )N)r   listify_value)r    r   8/usr/lib/python3.10/site-packages/mesonbuild/mcompile.py	array_arg%   s   
r   builddirr   Nonec                 C  s$   | d d   std|  dd S )Nzmeson-privatezcoredata.datz3Current directory is not a meson build directory: `z`.
Please specify a valid build dir or change the working directory to it.
It is also possible that the build directory was generated with an old
meson version. Please regenerate it in this case.)is_filer   r   r   r   r   validate_builddir(   s   r   T.Dict[str, T.List[dict]]c                 C  s   | d d }|  std|j d|jdd}t|}W d   n1 s)w   Y  tt}|D ]}||d   |g7  < q4|S )	za
    Converts a List of name-to-dict to a dict of name-to-dicts (since names are not unique)
    z
meson-infozintro-targets.json`z.` is missing! Directory is not configured yet?zutf-8)encodingNname)existsr   r   openjsonloadr   list)r   Zpath_to_introfZschemaZparsed_datatargetr   r   r   parse_introspect_data/   s   r'   c                   @  s<   e Zd ZdZdZdZdZdZdZdddZ	e
dd	d
ZdS )ParsedTargetName r&   r   c                 C  s   || _ |dd}t|dkr&|d | _| | js&td| d| j d|d dd}t|dkr?|d | _|d | _n|d | _| jdd}t|dkr]|d | _|d | _	d S |d | _d S )	N:r   Can't invoke target `z`: unknown target type: `r   r   /.)
	full_namersplitlentype_is_valid_typer   pathr   	base_namesuffix)selfr&   splitr   r   r   __init__F   s    



zParsedTargetName.__init__r1   r   boolc                 C  s   h d}| |v S )N>   shared_librarystatic_libraryshared_modulerunjaraliascustom
executabler   )r1   Zallowed_typesr   r   r   r2   \   s   
zParsedTargetName._is_valid_typeN)r&   r   )r1   r   r   r9   )__name__
__module____qualname__r.   r4   r   r1   r3   r5   r8   staticmethodr2   r   r   r   r   r(   >   s    
r(   r&   introspect_dataT.Dict[str, T.Any]c                 C  s  | j |vr| j|vrtd| j d|| j  }|s|| j }g }| }| js1| js1| js1|}na|D ]^}|d }|d dd}t	|dkr^|d 
dd}t	|dkrZ|d }n|d }| jrl| j|d	 d
dks| j |ks| jr|d dkrt| jt|d d |jkrq3||g7 }q3|std| j dt	|dkrg }	|D ]L}
|
d }|
d dd}t	|dkr|d 
dd}t	|dkr|d }n|d }t|
d d |j| }|
d	 d
d}|	d| d|  qd|	}td| j d| |d S )Nr+   z`: target not foundr   id@r   r   z@@r1    _filenameno_namez- ./r*   
z0`: ambiguous name. Add target type and/or path:
)r   r4   r   r.   resolver1   r3   r5   r/   r0   r7   replacer   relative_toparentappendjoin)r&   r   rF   intro_targetsZfound_targetsZresolved_bdirintro_targetZintro_target_namer7   ZsuggestionsiZi_nameptZsuggestions_strr   r   r   get_target_from_intro_datak   sZ   



"

rZ   dictc                   s6   t |  |}|d dv r| jgS  fdd|d D S )Nr1   >   r=   r?   c                   s"   g | ]}t t|  qS r   )r   r   rQ   rO   ).0out_filer   r   r   
<listcomp>      " z/generate_target_names_ninja.<locals>.<listcomp>rL   )rZ   r   )r&   r   rF   rV   r   r   r   generate_target_names_ninja   s   r`   options'argparse.Namespace'2T.Tuple[T.List[str], T.Optional[T.Dict[str, str]]]c                 C  s   t  }|d u rtd|}|ds|d| g | jdkr*|dt| jg | jdkr9|dt| jg | jrA|	d || j
7 }| jr^t|}| jD ]}|tt||| qP| jrf|	d |d fS )	NzCannot find ninja.r-   -Cr   -j-l-vclean)r   r   samefileextendas_posixjobsr   load_averageverboserS   
ninja_argstargetsr'   r`   r(   rh   )ra   r   runnercmd
intro_datarY   r   r   r   get_parsed_args_ninja   s(   






rt   c                 C  sj   t | ||}|d dvsJ dtdd|d }t|d d | j}|td	kr3t|| }|S )
Nr1   >   r=   r?   z9Should not reach here: `run` targets must be handle abovez[\%\$\@\;\.\(\)']rK   rH   rL   r   r-   )rZ   resubr   rQ   rO   rR   r   )r&   r   rF   rV   target_namerel_pathr   r   r   generate_target_name_vs   s   ry   c           
        s  t  d}t|dksJ d|d }dg}| jrxt t fdd| jD }|r`t| jdkr9tdtt| jd  }t	|d	 d j
}|d
|d  }|t| g7 }n!|t| g7 }| fdd| jD  n	|t| g7 }| jr|dg | jdkr|d| j  n|d | jrtd | js|d || j7 }tj }	|	dd  ||	fS )Nz*.slnr   z$More than one solution in a project?r   Zmsbuildc                 3  s(    | ]}t t| d  dv V  qdS )r1   >   r=   r?   N)rZ   r(   r\   rY   r   rs   r   r   	<genexpr>   s
    
z%get_parsed_args_vs.<locals>.<genexpr>zPOnly one target may be specified when `run` target type is used on this backend.rL   z
{}.vcxprojrH   c                   s"   g | ]}d  tt| qS )z
-target:{})formatry   r(   rz   r{   r   r   r^      r_   z&get_parsed_args_vs.<locals>.<listcomp>z-target:Cleanz-maxCpuCount:z-maxCpuCountz6Msbuild does not have a load-average switch, ignoring.z-verbosity:minimalZPLATFORM)r$   globr0   rp   r'   anyr   rZ   r(   r   rR   r}   r   rO   rj   rh   rl   rS   rm   r   warningrn   Zvs_argsosenvironcopypop)
ra   r   ZslnsZslnrr   Zhas_run_targetrV   Zproj_dirZprojenvr   r{   r   get_parsed_args_vs   s@   





r   c                 C  s   d}t |stdtt| |dg}| jr%| jD ]}|d|g7 }q| jr<| jr1|dg7 }n|ddg7 }|dg7 }| jdkrK|	d	t| jg | j
dkrUtd
 | jrY	 || j7 }|d fS )NZ
xcodebuildz.Cannot find xcodebuild, did you install XCode?z-parallelizeTargetsz-targetrh   z-alltargetsz-UseNewBuildSystem=FALSEr   z-jobsz8xcodebuild does not have a load-average switch, ignoring)shutilwhichr   r   chdirr   rp   rh   rl   rj   rm   r   r   rn   Z
xcode_args)ra   r   rq   rr   rY   r   r   r   get_parsed_args_xcode  s*   






r   parser'argparse.ArgumentParser'c                 C  s   | j dddddd | j ddd	d
 | j ddtdd | j ddddtdd | j ddddtdd | j ddddd
 | j dtg dd | j dtg dd | j d tg d!d dS )"zAdd compile specific arguments.rp   ZTARGET*NzlTargets to build. Target has the following format: [PATH_TO_TARGET/]TARGET_NAME.TARGET_SUFFIX[:TARGET_TYPE].)metavarnargsdefaulthelpz--clean
store_truezClean the build directory.)actionr   rd   wdz#directory to cd into before running)destr   r   re   z--jobsstorer   zjThe number of worker jobs to run (if supported). If the value is less than 1 the build program will guess.)r   r   r1   r   rf   z--load-averagez:The system load average to try to maintain (if supported).rg   z	--verbosezShow more verbose output.z--ninja-argsz?Arguments to pass to `ninja` (applied only on `ninja` backend).)r1   r   r   z	--vs-argsz>Arguments to pass to `msbuild` (applied only on `vs` backend).z--xcode-argszDArguments to pass to `xcodebuild` (applied only on `xcode` backend).)add_argumentr	   intfloatr   )r   r   r   r   add_arguments2  sh   

r   r   c           
      C  s<  t | j}t| | jr| jrtdt| j}|jj	}t
d|td}t|r6ttdd g }d }|td}t|tsIJ ttdd| |dkr_t| |\}}n!|d	rlt| |\}}n|d
krxt| |\}}ntd| dttddt| tj|tjjtjj|d^}}	|jS )Nz3`TARGET` and `--clean` can't be used simultaneouslyr9   vsenvzINFO:z1automatically activated MSVC compiler environmentbackendzautodetecting backend asninjavsxcodez	Backend `zR` is not yet supported by `compile`. Use generated project files directly instead.z#calculating backend command to run:)stdoutstderrr   ) r   r   r   rp   rh   r   r   r#   environmentcoredataTcast
get_optionr   	OptionKeyr   r   loggreen
isinstancer   rt   
startswithr   r   r
   
Popen_safesysr   bufferr   
returncode)
ra   Zbdirbcdata
need_vsenvrr   r   r   rX   rK   r   r   r   r=   h  s4   


r=   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r&   r(   r   r   rF   rG   r   rG   )r&   r(   r   r   rF   r[   r   r   )ra   rb   r   r   r   rc   )r&   r(   r   r   rF   r[   r   r   )r   r   r   r   )ra   rb   r   r   )(
__future__r   r   r"   ru   r   r   typingr   collectionsr   pathlibr   r)   r   r   r   r	   r
   r   Zmesonbuild.environmentr   Zmesonbuild.coredatar   
mesonbuildr   TYPE_CHECKINGargparser   r   r'   r(   rZ   r`   rt   ry   r   r   r   r=   r   r   r   r   <module>   s<   



-
6



7
&6