o
    ¢Ùldh8  ã                   @  s˜  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	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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 m!Z!m"Z" d
dl#m$Z$ g d¢Z%ddddœZ&dd„ Zdd„ Z'd:dd„Z(dZ)d;dd„Z*dd„ Z+dd„ Z,d d!„ Z-d"d#„ Z.d$d%„ Z/d&d'„ Z0d(d)„ Z1d*d+„ Z2d,d-„ Z3d.d/„ Z4d0d1„ Z5d2d3„ Z6d4d5„ Z7d6d7„ Z8d8d9„ Z9dS )<é    )ÚannotationsN)Úglob)ÚPath)Údetect_ninja)ÚMesonExceptionÚRealPathActionÚ	quiet_gitÚwindows_proof_rmtreeÚsetup_vsenvÚ	OptionKey)Úadd_arguments)Úwrap)ÚmlogÚbuildÚcoredataé   )Úrun_exe)ÚgztarÚxztarÚzipz.tar.gzz.tar.xzú.zipc                 C  sV   | j ddtdd | j dddd | j d	d
dd | j dddd | j dddd d S )Nú-CÚwdz#directory to cd into before running)ÚdestÚactionÚhelpz--allow-dirtyÚ
store_truez8Allow even when repository contains uncommitted changes.)r   r   z	--formatsr   zZComma separated list of archive types to create. Supports xztar (default), gztar, and zip.)Údefaultr   z--include-subprojectszEInclude source code of subprojects that have been used for the build.z
--no-testsz)Do not build and test generated packages.)Úadd_argumentr   )Úparser© r    úfhome/ych/rk3568/buildroot/output/rockchip_rk3568/host/lib/python3.10/site-packages/mesonbuild/mdist.pyr   -   s   
ÿÿÿÿ
ÿr   c              	   C  sv   | d }t  ¡ }| t| dƒ ¡ ¡ t|ddd}| d | ¡ tj	 
| ¡¡¡ W d   ƒ d S 1 s4w   Y  d S )Nz
.sha256sumÚrbÚwzutf-8)Úencodingz{} *{}
)ÚhashlibZsha256ÚupdateÚopenÚreadÚwriteÚformatÚ	hexdigestÚosÚpathÚbasename)ÚfnameZhashnameÚmÚfr    r    r!   Úcreate_hash:   s    "ýr2   ÚHEADc                 C  s    dddd|g}|d ur|  dd|› d¡ |d ur | d|g¡ t ¡ "}tj|| |d	 | d
¡ tj|d}|j	|d W d   ƒ d S 1 sIw   Y  d S )NÚgitÚarchivez--formatÚtaré   z	--prefix=ú/z--)ÚcwdÚstdoutr   )Úfileobj)r-   )
ÚinsertÚextendÚtempfileÚTemporaryFileÚ
subprocessÚ
check_callÚseekÚtarfiler'   Ú
extractall)ÚsrcÚdistdirÚrevisionÚprefixÚsubdirÚcmdr1   Útr    r    r!   Úcopy_gitD   s   

"ürL   zPRepository has uncommitted changes that will not be included in the dist tarballÚallow_dirtyÚboolc                 C  s2   |r	t  | ¡ d S t  | d d ¡ t d¡ d S )NÚ
z:Use --allow-dirty to ignore the warning and proceed anywayr   )r   ÚwarningÚerrorÚsysÚexit)ÚmsgrM   r    r    r!   Úhandle_dirty_optR   s   rU   c                 C  sÎ   t j | d¡}t j |¡sd S g d¢}tj|| dd ¡ }|D ]E}|d d… }|dd …  dd¡\}}	|	 dd¡d }
|dkrIt	 
d	|
›d
¡ q|dv rWtd	|
›d|jƒ tt j | |
¡|||
d qd S )Nz.gitmodules)r4   Ú	submoduleÚstatusz--cachedz--recursiveT)r9   Úuniversal_newlinesr   ú r   ú-z
Submodule z3 is not checked out and cannot be added to the dist>   ÚUú+zF has uncommitted changes that will not be included in the dist tarball)rG   rH   )r,   r-   ÚjoinÚexistsr@   Úcheck_outputÚ
splitlinesÚsplitÚrsplitr   rP   rU   rM   rL   )rE   rF   ÚoptionsÚmodule_filerJ   ZmodlistrV   rW   Zsha1ÚrestÚsubpathr    r    r!   Úprocess_submodulesY   s    õrg   c           
   	   C  sô   t j |¡sJ ‚i }||d< | |d< ||d< |D ]_}|jr#|j|vr#q| |jd¡}t j ||¡|d< t j | |¡|d< t j ||¡|d< d |j¡}td	|›ƒ zt||ƒ}	|	d
krat	 
d¡ W q tyw   td|›ƒ t	 
d¡ Y qw d S )NZMESON_DIST_ROOTZMESON_SOURCE_ROOTZMESON_BUILD_ROOTÚ ZMESON_PROJECT_DIST_ROOTZMESON_PROJECT_SOURCE_ROOTZMESON_PROJECT_BUILD_ROOTrY   zRunning custom dist script r   zDist script errored outzFailed to run dist script r   )r,   r-   ÚisabsZ
subprojectÚgetr]   Zcmd_argsÚprintr   rR   rS   ÚOSError)
Úsrc_rootÚbld_rootZ	dist_rootÚdist_scriptsÚsubprojectsÚenvÚdrI   ÚnameÚrcr    r    r!   Úrun_dist_scriptsm   s0   

€þóru   c                 C  sF   t ddg| ddd  ¡ }|st| ƒS tt|ƒjƒ}t| ƒj|d  S )Nz	rev-parsez--show-prefixT)Úcheckr   )r   Ústripr   ÚlenÚparents)rm   rH   Zprefix_levelr    r    r!   Úgit_root„   s
   rz   c                 C  s   t g d¢| ƒd S )zœ
    Checks if meson.build file at the root source directory is tracked by git.
    It could be a subproject part of the parent project git repository.
    )zls-filesz--error-unmatchzmeson.buildr   )r   ©rm   r    r    r!   Úis_git   s   r|   c                 C  s   t  dd| dddg¡}|dkS )z2Check whether there are uncommitted changes in gitr4   r   z
diff-indexz--quietr3   r   )r@   Úcall)rm   Úretr    r    r!   Úgit_have_dirty_index”   s   r   c                 C  s¾   t | ƒr
tt|jƒ tj |¡rt|ƒ t| ƒ}| 	| ¡r(t 
|¡ t| |ƒ n/t| ƒ |¡}|d }tj |¡r=t|ƒ t 
|¡ t||t|ƒd t||ƒ |¡ t|ƒ t| ||ƒ d S )Nz-tmp)rI   )r   rU   Úmsg_uncommitted_changesrM   r,   r-   r^   r	   rz   ÚsamefileÚmakedirsrL   r   Úrelative_toÚstrÚrenamerg   )rm   rF   rc   Z	repo_rootrI   Ztmp_distdirr    r    r!   Úprocess_git_project™   s"   


r†   c                 C  sÆ   t j || ¡}t|||ƒ | ¡ D ](}	t j ||	¡}
t j ||	¡}t j |¡r(qt|
ƒr3t|
||ƒ qt |
|¡ qt	|||||ƒ g }|D ]}|t
|  }tj|||| d | |¡ qFt|ƒ |S )N)Úroot_dirÚbase_dir)r,   r-   r]   r†   Úvaluesr^   r|   ÚshutilÚcopytreeru   Úarchive_extensionÚmake_archiveÚappendr	   )Ú	dist_nameÚarchivesrm   rn   Údist_subro   rp   rc   rF   r-   Zsub_src_rootZsub_distdirÚoutput_namesÚaÚcompressed_namer    r    r!   Úcreate_dist_git­   s$   r•   c                 C  s   t j t j | d¡¡S )Nz.hg)r,   r-   Úisdirr]   r{   r    r    r!   Úis_hgÂ   s   r—   c                 C  s   t  dd| dg¡}d|vS )z1Check whether there are uncommitted changes in hgÚhgú-RÚsummarys   commit: (clean))r@   r_   )rm   Úoutr    r    r!   Úhg_have_dirty_indexÅ   s   rœ   c                 C  s´  t |ƒr
tt|jƒ |rt d¡ tj|dd tj 	|| d ¡}|d }|d }	tj 	|| d ¡}
t
 dd	d
|dddd|d |g
¡ g }d|v rƒdd l}| |d¡#}t|dƒ}t ||¡ W d   ƒ n1 sjw   Y  W d   ƒ n1 syw   Y  | |¡ d|v r½t |	d¡#}t|dƒ}t ||¡ W d   ƒ n1 s¤w   Y  W d   ƒ n1 s³w   Y  | |	¡ t |¡ d|v rØt
 dd	d
|ddd|
g¡ | |
¡ |S )Nz4dist scripts are not supported in Mercurial projectsT)Úexist_okz.tarz.xzz.gzr   r˜   r5   r™   z-Sz-tr6   z-Xz
/.hg[a-z]*r   r   Úwbr"   r   r   )rœ   rU   r€   rM   r   rP   r,   r‚   r-   r]   r@   rA   Úlzmar'   rŠ   ÚcopyfileobjrŽ   ÚgzipÚunlink)r   r   rm   rn   r‘   ro   rc   ZtarnameZxznameZgznameZzipnamer’   rŸ   ZxfZtfÚzfr    r    r!   Úcreate_dist_hgÊ   sB   
	
ÿÿ€ 
ÿ€ 


r¤   c                 C  s¢   t  | d||g ¡dkrtdƒ dS t j||ddkr!tdƒ dS t j|dg |ddkr3tdƒ dS tj ¡ }||d	< t j|d
g ||ddkrOtdƒ dS dS )Nz--backend=ninjar   z,Running Meson on distribution package failedr   )r9   z)Compiling the distribution package failedÚtestz5Running unit tests on the distribution package failedZDESTDIRÚinstall)r9   rq   z*Installing the distribution package failed)r@   r}   rk   r,   ÚenvironÚcopy)Úmeson_commandÚunpacked_src_dirÚbuilddirÚ
installdirÚ
ninja_argsZmyenvr    r    r!   Úrun_dist_stepsï   s   
r®   c                 C  s  t d| › ƒ tj |d¡}tj |d¡}tj |d¡}|||fD ]}tj |¡r-t|ƒ t |¡ q!tƒ }	t 	| |¡ t
tj |d¡ƒ}
t|
ƒdksMJ ‚|
d }|dg7 }|t|ƒ7 }||7 }t|||||	ƒ}|dkrut d	|› ƒ |S t|ƒ t|ƒ t|ƒ t d
| › dƒ |S )NzTesting distribution package zdist-unpackz
dist-buildzdist-installÚ*r   r   ÚsetupzDist check build directory was zDistribution package z tested)rk   r,   r-   r]   r^   r	   Úmkdirr   rŠ   Úunpack_archiver   rx   Úcreate_cmdline_argsr®   )Zpackagenamer©   Úextra_meson_argsrn   ZprivdirZ	unpackdirr«   r¬   Úpr­   Zunpacked_filesrª   r~   r    r    r!   Ú
check_dist   s2   
ür¶   c                 C  sR   t  ¡ }t|ƒ | g ¡}t |¡ t | |¡ |j t	dƒd¡ t
 t |¡¡S )NZbackendrh   )ÚargparseÚArgumentParserÚmsetup_argparseÚ
parse_argsr   Zparse_cmd_line_optionsZread_cmd_line_fileZcmd_line_optionsÚpopr   Úshlexra   Zformat_cmd_line_options)rn   r   Úargsr    r    r!   r³     s   

r³   c                 C  sZ   g }| j  d¡D ]}|tvrt d|› dt› d¡ | |¡ qt|ƒdkr+t d¡ |S )Nú,zValue "z" not one of permitted values Ú.r   zNo archive types specified.)Úformatsra   Úarchive_choicesrR   rS   rŽ   rx   )rc   ÚresultÚir    r    r!   Údetermine_archives_to_generate%  s   
rÄ   c              	   C  s°  t | jƒd d }| ¡ std| j›dƒ‚t | j¡}t d|jj	 
tdƒ¡¡}t|ƒ ddlm} |jj}|jj}tj |d¡}tj |d	¡}|jd
 |j }	t| ƒ}
i }g }| jrtj ||j¡}|jD ]}t ||¡}tj |j|¡||< qg| d¡ t|ƒrt|	|
||||j|| ƒ}nt |ƒr¨|rœt!dƒ dS t"|	|
||||j| ƒ}nt!dƒ dS |d u r´dS d}| j#sÄt$|d |ƒ |||ƒ}|dkrÖ|D ]}t%|ƒ t!d|ƒ qÊ|S )Nzmeson-privatez	build.datz
Directory z- does not seem to be a Meson build directory.rN   Zvsenvr   )Úget_meson_commandz
meson-distrZ   z-Dwrap_mode=nodownloadzC--include-subprojects option currently not supported with Mercurialr   z5Dist currently only works with Git or Mercurial reposZCreated)&r   r   Úis_filer   r   ÚloadÚTÚcastÚenvironmentr   Z
get_optionr   r
   Úmesonbuild.mesonlibrÅ   Ú
source_dirÚ	build_dirr,   r-   r]   Úproject_nameZproject_versionrÄ   Zinclude_subprojectsÚsubproject_dirrp   r   Zget_directoryrŽ   r|   r•   ro   r—   rk   r¤   Zno_testsr¶   r2   )rc   Z	buildfileÚbZ
need_vsenvrÅ   rm   rn   Zpriv_dirr‘   r   r   rp   r´   rÏ   ÚsubÚ	directoryÚnamesrt   rs   r    r    r!   Úrun/  sP   

rÔ   )r3   NN)rM   rN   ):Ú
__future__r   r·   r¡   r,   rR   r¼   rŠ   r@   rC   r>   r%   ÚtypingrÈ   r   Úpathlibr   Zmesonbuild.environmentr   rË   r   r   r   r	   r
   r   Zmesonbuild.msetupr   r¹   Zmesonbuild.wrapr   Z
mesonbuildr   r   r   Zscripts.meson_exer   rÁ   rŒ   r2   rL   r€   rU   rg   ru   rz   r|   r   r†   r•   r—   rœ   r¤   r®   r¶   r³   rÄ   rÔ   r    r    r    r!   Ú<module>   sZ    þ


	%	
