o
    Wod4                     @  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 d | dddjS )NT)Z
allow_dupsZ
user_input)r   r   )r    r   rhome/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/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                   @  s4   e 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 | _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   )selfr%   splitr   r   r   __init__D   s   

zParsedTargetName.__init__r/   r   boolc                 C  s   h d}| |v S )N>   runZcustomaliasZshared_module
executableshared_libraryZjarZstatic_libraryr   )r/   Zallowed_typesr   r   r   r0   S   s   
zParsedTargetName._is_valid_typeN)r%   r   )r/   r   r   r5   )
__name__
__module____qualname__r,   r   r/   r1   r4   staticmethodr0   r   r   r   r   r'   >   s    
r'   r%   introspect_dataT.Dict[str, T.Any]c                 C  s>  | j |vrtd| j d|| j  }g }| }| js"| js"|}n3|D ]0}| jr4| j|d ddksN| jrO|d dkrOt| jt|d d |j	krOq$||g7 }q$|s`td| j dt
|d	krg }|D ] }t|d d |}	|d dd}
|d
|	 d|
  qjd|}td| j d| |d S )Nr*   z`: target not foundr/    _filenameZno_namer   r   z- ./r)   
z/`: ambiguous name.Add target type and/or path:
)r   r   r,   resolver/   r1   replacer   relative_toparentr.   appendjoin)r%   r   r>   Zintro_targetsZfound_targetsZresolved_bdirintro_targetZsuggestionsiptZsuggestions_strr   r   r   get_target_from_intro_datab   s<   


 
rN   dictc                   s6   t |  |}|d dv r| jgS  fdd|d D S )Nr/   >   r7   r6   c                   s"   g | ]}t t|  qS r   )r   r   rF   rD   ).0out_filer   r   r   
<listcomp>      " z/generate_target_names_ninja.<locals>.<listcomp>rB   )rN   r   )r%   r   r>   rJ   r   r   r   generate_target_names_ninja   s   rT   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..-Cr   -j-l-vclean)r   r   samefileextendas_posixjobsr   load_averageverboserH   Z
ninja_argstargetsr&   rT   r'   r]   )rU   r   runnercmd
intro_datarM   r   r   r   get_parsed_args_ninja   s(   






rh   c                 C  sj   t | ||}|d dvsJ dtdd|d }t|d d | j}|td	kr3t|| }|S )
Nr/   >   r7   r6   z9Should not reach here: `run` targets must be handle abovez[\%\$\@\;\.\(\)']rA   idrB   r   rX   )rN   resubr   rF   rD   rG   r   )r%   r   r>   rJ   target_namerel_pathr   r   r   generate_target_name_vs   s   rn   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 )r/   >   r7   r6   N)rN   r'   rP   rM   r   rg   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.rB   z
{}.vcxprojri   c                   s"   g | ]}d  tt| qS )z
-target:{})formatrn   r'   ro   rp   r   r   rR      rS   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#   globr.   rd   r&   anyr   rN   r'   r   rG   rr   r   rD   r_   r]   ra   rH   rb   r   warningrc   Zvs_argsosenvironcopypop)
rU   r   ZslnsZslnrf   Zhas_run_targetrJ   Zproj_dirZprojenvr   rp   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-targetr]   z-alltargetsz-UseNewBuildSystem=FALSEr   z-jobsz8xcodebuild does not have a load-average switch, ignoring)shutilwhichr   rv   chdirr   rd   r]   ra   r_   rb   r   ru   rc   Z
xcode_args)rU   r   re   rf   rM   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.rd   ZTARGET*Nz^Targets to build. Target has the following format: [PATH_TO_TARGET/]TARGET_NAME[:TARGET_TYPE].)metavarnargsdefaulthelpz--clean
store_truezClean the build directory.)actionr   rY   wdz#directory to cd into before running)destr   r   rZ   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   r/   r   r[   z--load-averagez:The system load average to try to maintain (if supported).r\   z	--verbosezShow more verbose output.z--ninja-argsz?Arguments to pass to `ninja` (applied only on `ninja` backend).)r/   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_arguments  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 simultaneouslyr5   ZvsenvzINFO:z1automatically activated MSVC compiler environmentbackendzautodetecting backend asZninjavsZxcodez	Backend `zR` is not yet supported by `compile`. Use generated project files directly instead.z#calculating backend command to run:)stdoutstderrrz   ) r   r   r   rd   r]   r   r   r"   environmentZcoredataTcastZ
get_optionr   Z	OptionKeyr   r   logZgreen
isinstancer   rh   
startswithr{   r   r
   Z
Popen_safesysr   bufferr   
returncode)
rU   bdirbZcdataZ
need_vsenvrf   rz   r   rL   rA   r   r   r   r6   H  s4   


r6   )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>   rO   r   r   )rU   rV   r   r   r   rW   )r%   r'   r   r   r>   rO   r   r   )r   r   r   r   )rU   rV   r   r   )(
__future__r   rv   r!   rj   r   r|   typingr   collectionsr   pathlibr   r(   r   r   r   r	   r
   r   Zmesonbuild.environmentr   Zmesonbuild.coredatar   Z
mesonbuildr   TYPE_CHECKINGargparser   r   r&   r'   rN   rT   rh   rn   r{   r   r   r6   r   r   r   r   <module>   s<   



$
!



7
$6