
    es9                    :   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j4                  rd dlZddZddZddZ G 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'y)"    )annotationsN)defaultdict)Path   )mlog)mesonlib)MesonExceptionRealPathAction	join_argssetup_vsenv)detect_ninja)UserArrayOption)buildc                ,    t        j                  |       S )N)r   listify_value)values    5/usr/lib/python3/dist-packages/mesonbuild/mcompile.py	array_argr   %   s    ((//    c                N    | dz  dz  j                         st        d|  d      y )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	   )builddirs    r   validate_builddirr   (   sC    &7@@BRS[R\ ]Q Q R 	R Cr   c                .   | dz  dz  }|j                         st        d|j                   d      |j                  d      5 }t	        j
                  |      }ddd       t        t              }D ]  }||d   xx   |gz  cc<    |S # 1 sw Y   2xY w)	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   path_to_introfschemaparsed_datatargets         r   parse_introspect_datar(   /   s     |+.BBM!q!3!3 44bcdd			W		- 1 .9->K 0F6N#x/#0 s   BBc                  >    e Zd ZdZdZdZdZdZdZddZ	e
dd       Zy)ParsedTargetName c                   || _         |j                  dd      }t        |      dkD  rA|d   | _        | j	                  | j                        st        d| d| j                   d      |d   j                  dd      }t        |      dkD  r|d   | _        |d   | _        n
|d   | _        | j                  j                  dd      }t        |      dkD  r|d   | _        |d   | _	        y |d   | _        y )	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'   splits      r   __init__zParsedTargetName.__init__F   s    c1%u:>aDI&&tyy1$'=fXE^_c_h_h^iij%kllaQ'u:>aDIaDIaDI		  a(u:>"1XDN(DK"1XDNr   c                    h d}| |v S )N>   jarrunaliascustom
executableshared_moduleshared_librarystatic_library )r4   allowed_typess     r   r5   zParsedTargetName._is_valid_type\   s    	
 }$$r   N)r'   str)r4   rG   returnbool)__name__
__module____qualname__r1   r7   r   r4   r6   r8   r;   staticmethodr5   rE   r   r   r*   r*   >   s9    IIDDDF&, % %r   r*   c                ,   | j                   |vr'| j                  |vrt        d| j                   d      || j                      }|s|| j                     }g }|j	                         }| j
                  s| j                  s| j                  s|}n|D ]  }|d   }|d   j                  dd      }t        |      dkD  r.|d   j                  dd      }t        |      dkD  r|d   }n|d   }| j
                  r"| j
                  |d	   j                  d
d      k7  sc| j                   |k7  sT| j                  rI|d   dk7  rAt        | j                        t        |d   d         j                  |      j                  k7  r||gz  } |st        d| j                   d      t        |      dkD  rg }	|D ]  }
|
d   }|
d   j                  dd      }t        |      dkD  r.|d   j                  dd      }t        |      dkD  r|d   }n|d   }t        |
d   d         j                  |      j                  |z  }|
d	   j                  d
d      }|	j                  d| d|         dj!                  |	      }t        d| j                   d|       |d   S )Nr.   z`: target not foundr   id@r   r   z@@r4    _filenameno_namez- ./r-   
z0`: ambiguous name. Add target type and/or path:
)r   r7   r	   r1   resolver4   r6   r8   r2   r3   r:   replacer   relative_toparentappendjoin)r'   r   introspect_dataintro_targetsfound_targetsresolved_bdirintro_targetintro_target_namer:   suggestionsii_nameptsuggestions_strs                  r   get_target_from_intro_datarh   k   s   {{/)f.>.>o.U5f6F6F5GGZ[\\#FKK0M'(8(8902M$$&M;;v{{6==%) 	,L ,V 4 &--c15E5zA~atQ/u:>(-a%(-a%V0D0L0LSRU0V!V 11j!9Y!Ffkk"d<
+CA+F&G&S&STa&b&i&iil^+M	," 5f6F6F5GGZ[\\	]	a	#% 	/AvYFdGNN3*E5zA~atQ/u:>"1XF"1XFQz]1%&22=AHH6QA&	!!#s+AaS!~.	/ ))K05f6F6F5G H??N>OQ R 	R r   c           	         t        | ||      }|d   dv r| j                  gS |d   D cg c]3  }t        t        |      j	                  |j                                     5 c}S c c}w )Nr4   >   r>   r?   rS   )rh   r   rG   r   rX   rV   )r'   r   r\   r`   out_files        r   generate_target_names_ninjark      sa    -fhPLF//}T`akTlmDN..x/?/?/ABCmmms   8A$c                   t               }|t        d      |}|j                  d      s!|j                  d|j	                         g       | j
                  dkD  r&|j                  dt        | j
                        g       | j                  dkD  r&|j                  dt        | j                        g       | j                  r|j                  d       || j                  z  }| j                  rAt        |      }| j                  D ]'  }|j                  t        t        |      ||             ) | j                  r|j                  d       |d fS )	NzCannot find ninja.r0   -Cr   -j-l-vclean)r   r	   samefileextendas_posixjobsrG   load_averageverboserZ   
ninja_argstargetsr(   rk   r*   rq   )optionsr   runnercmd
intro_datarf   s         r   get_parsed_args_ninjar~      s   ^F~122
CS!

D(++-./ ||a

D#gll+,-a

D#g22345

47C *84
 	_AJJ23CA3FR\]^	_}}

79r   c                   t        | ||      }|d   dvsJ d       t        j                  dd|d         }t        |d   d         j	                  |j                               j                  }|t        d	      k7  rt        ||z        }|S )
Nr4   >   r>   r?   z9Should not reach here: `run` targets must be handle abovez[\%\$\@\;\.\(\)']rR   rO   rS   r   r0   )rh   resubr   rX   rV   rY   rG   )r'   r   r\   r`   target_namerel_paths         r   generate_target_name_vsr      s    -fhPL'77t9tt7 &&-sL4FGKL,Q/0<<X=M=M=OPWWH49([01r   c                   t        j                  d            }t        |      dk(  sJ d       |d   }dg}| j                  r,t	              t        fd| j                  D              }|rt        | j                        dkD  rt        d      t        t        | j                  d               }t        |d   d         j                  }|d	j                  |d
         z  }|t        |j                               gz  }n|t        |j                               gz  }|j                  | j                  D 	cg c]'  }	dj                  t        t        |	                  ) c}	       n|t        |j                               gz  }| j                   r|j                  dg       | j"                  dkD  r|j%                  d| j"                          n|j%                  d       | j&                  rt)        j*                  d       | j,                  s|j%                  d       || j.                  z  }t0        j2                  j5                         }
|
j7                  dd        ||
fS c c}	w )Nz*.slnr   z$More than one solution in a project?r   msbuildc              3  T   K   | ]  }t        t        |            d    dv  ! yw)r4   >   r>   r?   N)rh   r*   ).0rf   r   r}   s     r   	<genexpr>z%get_parsed_args_vs.<locals>.<genexpr>   s4      & ''7':HjQRXY]mm&s   %(zPOnly one target may be specified when `run` target type is used on this backend.rS   z
{}.vcxprojrO   z
-target:{}z-target:Cleanz-maxCpuCount:z-maxCpuCountz6Msbuild does not have a load-average switch, ignoring.z-verbosity:minimalPLATFORM)r"   globr3   ry   r(   anyr	   rh   r*   r   rY   formatrG   rV   rs   r   rq   ru   rZ   rv   r   warningrw   vs_argsosenvironcopypop)rz   r   slnsslnr|   has_run_targetr`   proj_dirprojrf   envr}   s    `         @r   get_parsed_args_vsr      s(   g&'Dt9>AAA>
q'C+C*84
 &__& &  7??#a'$%wxx56FwWXGY6Z\dfpqLL4Q78??HL//T0BCCDC'((CC&''CJJ  zA  zI  zI  Jtu++,CDTUVDWYacm,no  J  KCKKM"##}}

O$% ||a

]7<<.12

>"MN??

'(7??C **//
CGGJ8O5 Js   ?,I.c                   d}t        j                  |      st        d      t        j                  t        |             |dg}| j                  r| j                  D ]	  }|d|gz  } | j                  r | j                  r|dgz  }n|ddgz  }|dgz  }| j                  dkD  r&|j                  d	t        | j                        g       | j                  dkD  rt        j                  d
       | j                  r	 || j                  z  }|d fS )N
xcodebuildz.Cannot find xcodebuild, did you install XCode?z-parallelizeTargetsz-targetrq   z-alltargetsz-UseNewBuildSystem=FALSEr   z-jobsz8xcodebuild does not have a load-average switch, ignoring)shutilwhichr	   r   chdirrG   ry   rq   ru   rs   rv   r   r   rw   
xcode_args)rz   r   r{   r|   rf   s        r   get_parsed_args_xcoder     s   F<<MNN HHS](
)C 	"AIq>!C	" }}??G9CM7++C*++||a

GS./0aOP 	7C9r   c                   | j                  ddddd       | j                  ddd	
       | j                  ddt        d       | j                  ddddt        d       | j                  ddddt        d       | j                  dddd
       | j                  dt        g d       | j                  dt        g d       | j                  d t        g d!       y)"zAdd compile specific arguments.ry   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   rm   wdz#directory to cd into before running)destr   r   rn   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   r4   r   ro   z--load-averagez:The system load average to try to maintain (if supported).rp   z	--verbosezShow more verbose output.z--ninja-argsz?Arguments to pass to `ninja` (applied only on `ninja` backend).)r4   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   )parsers    r   add_argumentsr   2  s2   
{  } )  
 4B  D hy   I   k(  
 N	   M	   S	  r   c                Z   t        | j                        }t        |       | j                  r| j                  rt        d      t        j                  | j                        }|j                  j                  }t        j                  d|j                  t        j                  d                  }t        |      r)t!        j"                  t!        j$                  d      d       g }d }|j                  t        j                  d            }t'        |t(              sJ t!        j"                  t!        j$                  d      d|       |dk(  rt+        | |      \  }}nE|j-                  d	      rt/        | |      \  }}n$|d
k(  rt1        | |      \  }}nt        d| d      t!        j"                  t!        j$                  d      dt3        |             t        j4                  |t6        j8                  j:                  t6        j<                  j:                  |      ^}}	|j>                  S )Nz3`TARGET` and `--clean` can't be used simultaneouslyrI   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   ry   rq   r	   r   r!   environmentcoredataTcast
get_optionr   	OptionKeyr   r   loggreen
isinstancerG   r~   
startswithr   r   r   
Popen_safesysr   bufferr   
returncode)
rz   bdirbcdata
need_vsenvr|   r   r   re   rR   s
             r   r>   r>   h  s   

Dd7==STT

7::AMM""E 0 01C1CG1L MNJ:G$&YZC(,Cx11)<=Ggs###HHTZZ "<gF'($7S			D	!%gt4S	G	($7Sy rsu 	u 	HHTZZ "GSVXCJJ,=,=cjjFWFW]`aEA<<r   )r   rG   rH   T.List[str])r   r   rH   None)r   r   rH   zT.Dict[str, T.List[dict]])r'   r*   r   r   r\   T.Dict[str, T.Any]rH   r   )r'   r*   r   r   r\   dictrH   r   )rz   'argparse.Namespace'r   r   rH   z2T.Tuple[T.List[str], T.Optional[T.Dict[str, str]]])r'   r*   r   r   r\   r   rH   rG   )r   z'argparse.ArgumentParser'rH   r   )rz   r   rH   r   )(
__future__r   r   r    r   r   r   typingr   collectionsr   pathlibr   r+   r   r   r	   r
   r   r   mesonbuild.environmentr   mesonbuild.coredatar   
mesonbuildr   TYPE_CHECKINGargparser   r   r(   r*   rh   rk   r~   r   r   r   r   r>   rE   r   r   <module>r      s    # 5 	  	 
   #    L L / / ??0R+% +%Z4ln>5n"L4lr   