
    eA"                    T   d Z ddlmZ ddlm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mZ ddlZddl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 ej6                  rddlZddlmZmZ  G d de      Z h dZ!h de!z  Z"h dZ#dZ$dZ% G d de      Z&dZ'ddZ(dddZ)ddZ*ddZ+y) z*Code that creates simple startup projects.    )annotations)Path)EnumN)glob)buildmesonlibmlog)FORBIDDEN_TARGET_NAMES)detect_ninja)create_meson_build)sample_generator)ProtocolLiteralc                  |    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<   y)	ArgumentszT.List[Path]srcfilesstrwdname
executabledepsz[Literal['c', 'cpp', 'cs', 'cuda', 'd', 'fortran', 'java', 'rust', 'objc', 'objcpp', 'vala']languageboolr   builddirforcez Literal['executable', 'library']typeversionN)__name__
__module____qualname____annotations__     2/usr/lib/python3/dist-packages/mesonbuild/minit.pyr   r   (   s<    		mm..r#   r   >   .F.f.F90.f90.for>   .c.d.m.cc.cs.cu.mm.rs.cpp.java.vala>   cdcscppcudajavaobjcrustvalaobjcppfortranr   z0.1c                      e Zd ZdZdZy)DEFAULT_TYPESr   libraryN)r   r   r    EXELIBr"   r#   r$   rA   rA   =   s    
C
Cr#   rA   zpSample project created. To build it run the
following commands:

meson setup builddir
meson compile -C builddir
c                   t        |       }| j                  t        d   j                  k(  r|j	                          n<| j                  t        d   j                  k(  r|j                          nt        d      t        t               y)z
    Based on what arguments are passed we check for a match in language
    then check for project type and create new Meson samples project.
    rC   rD   zUnreachable codeN)	r   r   rA   valuecreate_executablecreate_libraryRuntimeErrorprintINFO_MESSAGE)options
sample_gens     r$   create_samplerN   I   sh    
 "'*J||}U+111$$&	u-33	3!!#-..	,r#   c                   | j                   s{t               j                         j                  | _         t	        j
                  d| j                         s|rt        d| j                    d      t        d| j                    d       | j                  s*| j                   | _        t        d| j                   d       | j                  t        v r#t        j                  d| j                  d      |ry	| j                  sg }d
 t               j                         D        D ]&  }|j                  t        v s|j!                  |       ( |st        d      || _        t        ddj#                  d |D              z          | j$                  sM| j                  D ]  }|j                  dk(  r	d| _         n|j                  dv r	d| _         n|j                  dk(  r	d| _         n|j                  dk(  r	d| _         n|j                  dk(  r	d| _         n|j                  t&        v r	d| _         n{|j                  dk(  r	d| _         nc|j                  dk(  r	d| _         nK|j                  dk(  r	d| _         n3|j                  d k(  r	d!| _         n|j                  d"k(  sd#| _         n | j$                  st        d$      t        d%| j$                  z          y	y	)&z`
    Here we autodetect options for args not passed in so don't have to
    think about it.
    z[a-zA-Z_][a-zA-Z0-9]*zName of current directory "zM" is not usable as a sample project name.
Specify a project name with --name.zUsing "z." (name of current directory) as project name.z0" (project name) as name of executable to build.zExecutable name zI is reserved for Meson internal use. Refusing to init an invalid project.Nc              3  B   K   | ]  }|j                         s|  y wN)is_file).0fs     r$   	<genexpr>z%autodetect_options.<locals>.<genexpr>m   s     =!=s   zdNo recognizable source files found.
Run meson init in an empty directory to create a sample project.zDetected source files:  c              3  2   K   | ]  }t        |        y wrQ   )r   )rS   ss     r$   rU   z%autodetect_options.<locals>.<genexpr>t   s     2La3q62Ls   r*   r5   >   r-   r2   r8   r.   r7   r/   r9   r+   r6   r?   r1   r<   r,   r;   r0   r>   r3   r:   r4   r=   z5Can't autodetect language, please specify it with -l.zDetected language: )r   r   resolvestemrematch
SystemExitrJ   r   r
   r   MesonExceptionr   iterdirsuffixLANG_SUFFIXESappendjoinr   FORTRAN_SUFFIXES)rL   sampler   rT   s       r$   autodetect_optionsrf   W   s   
 <<v~~',,xx/>6:7<<. IC C D D~%STU$\\**++[\]33%%(89K9K8N OM 'M N 	N!#=TV^^-= 	#Axx=("	#  ` a a#'#((2L82L*LLM!! !	Axx4#& xx?*#( xx5 #' xx5 #) xx4#& xx++#, xx5 #) xx4#) xx5 #+ xx7"#) xx7"#) C!	D TUU#g&6&667K r#   c                6   | j                  dddt        d       | j                  ddt        j                  d	       | j                  d
dd       | j                  ddd       | j                  ddd       | j                  ddt	        t
              d       | j                  dddd       | j                  ddd        | j                  d!d"dd#       | j                  d$t        d%d&t         d'(       | j                  d)t        d*t                 y+),z\
    Here we add args for that the user can passed when making a new
    Meson project.
    r   
sourcefile*z@source files. default: all recognized files in current directory)metavarnargsr   help-Cr   z#directory to cd into before running)destactionrl   z-nz--namez0project name. default: name of current directory)rl   z-ez--executablez&executable name. default: project namez-dz--depszdependencies, comma-separatedz-lz
--languagez=project language. default: autodetected based on source files)choicesrl   z-bz--build
store_truezbuild after generation)ro   rl   z
--builddirr   zdirectory for build)defaultrl   z-fz--forcez2force overwrite of existing files and directories.z--type)r   rB   zproject type. default: z based project)rr   rp   rl   z	--versionzproject version. default: N)add_argumentr   r   RealPathActionsortedLANG_SUPPORTEDDEFAULT_PROJECTDEFAULT_VERSION)parsers    r$   add_argumentsrz      sK   
 
L$  VX  Y
40G0GB  D
h-_`
n3[\
h-LM
lF>4J  RQ  R
iC[\
g<QR
iCwx
/C\e|  ~M  }N  N\  d]  ^
_E_`o_pCqrr#   c                   t        | j                        j                         st        j                  d       t        j                  | j                         t        d      s7t        | d       | j                  st        d       d| _	        t        |        nFt        |        t        d      j                         r| j                  st        d      t        |        | j                   rt        | j"                        j%                         r6| j                  r*t        d	       t'        j(                  | j"                         t        d
       t+        j,                         d| j"                  gz   }t/        j0                  |      }|j2                  rt        t!        j4                  | j"                        }t7        j8                  d|j:                  j<                  j?                  t+        j@                  d                  }t+        jB                  |      }|r)tE        jF                  tE        jH                  d      d       tK               d| j"                  gz   }t/        j0                  |      }|j2                  rt        y)z8
    Here we generate the new Meson sample project.
    zSProject source root directory not found. Run this command in source directory root.ri   T)re   z.Defaulting to generating a C language project.r5   zmeson.buildz5meson.build already exists. Use --force to overwrite.z,Build directory already exists, deleting it.zBuilding...setupr   vsenvzINFO:z1automatically activated MSVC compiler environmentrm   r   )&r   r   existssysexitoschdirr   rf   r   rJ   rN   rR   r   r]   r   r   r   is_dirshutilrmtreer   get_meson_command
subprocessrun
returncodeloadTcastenvironmentcoredata
get_option	OptionKeysetup_vsenvr	   loggreenr   )rL   cmdretb
need_vsenvvsenv_actives         r$   r   r      s    

""$fgHHWZZ9740BC"Gg7#&&(TUU7#}}  !((*w}}@AMM'**+m((*gw7G7G-HHnnS!>>JJw''(VVFAMM$:$:$E$EhFXFXY`Fa$bc
++J7HHTZZ(*]^ng&6&677nnS!>>r#   )rL   r   returnNone)F)rL   r   re   r   r   r   )ry   z'argparse.ArgumentParser'r   r   )rL   r   r   int),__doc__
__future__r   pathlibr   enumr   r   r   r   r   r[   r   typingr   
mesonbuildr   r   r	   mesonbuild.coredatar
   mesonbuild.environmentr   #mesonbuild.templates.mesontemplatesr   "mesonbuild.templates.samplefactoryr   TYPE_CHECKINGargparsetyping_extensionsr   r   r   rd   ra   rv   rw   rx   rA   rK   rN   rf   rz   r   r"   r#   r$   <module>r      s    1 "     
 	 	   , , 6 / B ???3H  8 _brreD C8Ns$'r#   