
    %g-                        d 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mZmZ ddlmZ ddlmZmZmZ  ej.                         dk(  rd	nd
Zej2                  dkD  Zd(dZdededee   fdZ	 d)dedededededdfdZd)dededdfdZ dededefdZ!defdZ"d*dedededdfdZ#dedefdZ$defdZ%dedefd Z&d!ededefd"Z'd#eeef   ddfd$Z(deeef   fd%Z)d(d&Z*e+d'k(  r e*        yy)+a%  
Download and install a C++ toolchain.
Currently implemented platforms (platform.system)
    Windows: RTools 3.5, 4.0 (default)
    Darwin (macOS): Not implemented
    Linux: Not implemented
Optional command line arguments:
   -v, --version : version, defaults to latest
   -d, --dir : install directory, defaults to '~/.cmdstan
   -s (--silent) : install with /VERYSILENT instead of /SILENT for RTools
   -m --no-make : don't install mingw32-make (Windows RTools 4.0 only)
   --progress : flag, when specified show progress bar for RTools download
    N)OrderedDict)sleep)AnyDictList)_DOT_CMDSTAN)pushdvalidate_dirwrap_url_progress_hookWindowsz.exe l        returnc                      t        d       y)zPrint usage.ar  Arguments:
        -v (--version) :CmdStan version
        -d (--dir) : install directory
        -s (--silent) : install with /VERYSILENT instead of /SILENT for RTools
        -m (--no-make) : don't install mingw32-make (Windows RTools 4.0 only)
        --progress : flag, when specified show progress bar for RTools download
        -h (--help) : this message
        N)print     \/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/cmdstanpy/install_cxx_toolchain.pyusager   !   s    			r   dirsilentc                    g }t        j                         dk(  rrt        j                  j	                  t        j                  j                  |             \  }} | j                  d      r| dd } d|rdnddd	d
dj                  |       ddg}|S )zAssemble config info.r   \   Nz/SP-z/VERYSILENTz/SILENTz/SUPPRESSMSGBOXESz/CURRENTUSERzLANG="English"z	/DIR="{}"z/NOICONSz
/NORESTART)platformsystemospath
splitdriveabspath
startswithformat)r   r   config_s       r   
get_configr$   /   s    FI%##BGGOOC$893>>$ab'C#Ms#	
 Mr   installation_dirinstallation_fileversionverbosec           	         t        d      5  t        dj                  t        j                  j                  |      d                |g}|j                  t        | |             t        dj                  |             t        j                  |dt        j                  t        j                  t        j                  t        j                        }|j                         e|j                  rH|j                  j!                         j#                  d      j%                         }|r|rt        |d	       |j                         e|j'                         \  }}	|j(                  rzt        d
j                  |j(                               |	r(t        |	j#                  d      j%                                t+        | |      rt        d       t-        j.                  d       ddd       t+        | |      rt        j0                  |       t        dj                  t        j                  j                  |      d                y# 1 sw Y   exY w)z$Install specified toolchain version..z Installing the C++ toolchain: {}r    Ncwdstdinstdoutstderrenvutf-8Tflushz"Installation failed: returncode={}z6Installation files found at the installation location.   zInstalled {})r	   r   r!   r   r   splitextextendr$   join
subprocessPopenDEVNULLPIPEenvironpollr/   readlinedecodestripcommunicate
returncodeis_installedsysexitremove)
r%   r&   r'   r   r(   cmdprocoutputr#   r0   s
             r   install_versionrK   C   s    
s .55  !23A6	

 !!

:.78chhsm$$????


 iik!{{--/66w?EEGg&-	 iik!
 $$&	6??6==dooNOfmmG,2245,g6NOHHQK;> $g.
		#$	.

 0 01B CA F
GHC s   D:IBIItoolchain_locc                    dj                  t        t        j                  t        j
                  j                  | t        rdndd      t        j
                  j                  | dd      gt        j                  j                  dd      j                  d      z                     t        j                  d<   dd	t        rd
nddg}t        d      5  t        dj                  |             t        j                  |dt        j                  t        j                  t        j                  t        j                        }|j!                         e|j"                  rH|j"                  j%                         j'                  d      j)                         }|r|rt        |d       |j!                         e|j+                         \  }}|j,                  rct        dj/                  |j,                               |r(t        |j'                  d      j)                                t1        j2                  d       ddd       t        d       y# 1 sw Y   xY w)z,Install mingw32-make for Windows RTools 4.0.;mingw_64mingw_32binusrPATHr   pacmanz-Syzmingw-w64-x86_64-makezmingw-w64-i686-makez--noconfirmr*   r+   Nr,   r2   Tr3   z/mingw32-make installation failed: returncode={}r5   zInstalled mingw32-make.exe)r8   listr   fromkeysr   r   	IS_64BITSr=   getsplitr	   r   r9   r:   r;   r<   r>   r/   r?   r@   rA   rB   rC   r!   rE   rF   )rL   r(   rH   rI   rJ   r#   r0   s          r   install_mingw32_makerZ   o   s     GGLL%&/
Z
 GGLLu= **..,22378
	
BJJv  	#,2G	C 
s chhsm$$????


 iik!{{--/66w?EEGg&-	 iik!
 $$&	6??AHHOO
 fmmG,2245HHQK12 

&'3 s   C"I	3BI		Ic           	         t        j                         dk(  r|dv rt        j                  j	                  t        j                  j                  | d            syt        j                  j	                  t        j                  j                  | t        rdndddt        z               S |dv rNt        j                  j	                  t        j                  j                  | t        rd	nd
ddt        z               S yy)z'Returns True is toolchain is installed.r   )353.5rQ   FrO   rP   zg++)404.04mingw64mingw32)r   r   r   r   existsr8   rW   	EXTENSION)rL   r'   s     r   rD   rD      s    I%m#77>>"'',,}e"DE77>>!"+JI%	  **77>>!!*I	I%	  r   c                  4    t        j                         dk(  ryy)z!Windows version hardcoded to 4.0.r   r_   r   r   r   r   r   r   latest_versionrg      s    I%r   filenameurlprogressc                     t        dj                  |              t        d      D ]5  }	 |rt               }nd}t        j
                  j                  || |      } n t        d
j                  |              y# t        j                  j                  $ rg}t        d       t        |       |dk  r-t        dj                  |dz                t        d       Y d}~t        j                  d	       Y d}~d}~ww xY w)zDownload toolchain from URL.zDownloading C++ toolchain: {}   N)rh   
reporthookz Failed to download C++ toolchain   zretry ({}/5)r   r5   zDownload successful, file: {})r   r!   ranger   urllibrequesturlretrieveerrorURLErrorr   rE   rF   )rh   ri   rj   iprogress_hookr#   errs          r   retrieve_toolchainrx      s    	
)
0
0
:;1X 	 6 8 $**h= + A $ 

)
0
0
:; ||$$ 	45#J1un++AE23aHHQKK	s   1A99C=AC8C88C=c                 R    t        j                         dk(  r| dv rd} | S | dk(  rd} | S )z&Return maj.min part of version string.r   )r`   r^   r_   r\   r]   rf   )r'   s    r   normalize_versionrz      s8    I%k!G N _GNr   c                  4    t        j                         dk(  ryy)zReturn toolchain name.r   RToolsr   rf   r   r   r   get_toolchain_namer}      s    I%r   c                 l    d}t        j                         dk(  r| dk(  rt        rd}|S d}|S | dk(  rd}|S )zReturn URL for toolchain.r   r   r_   zAhttps://cran.r-project.org/bin/windows/Rtools/rtools40-x86_64.exez?https://cran.r-project.org/bin/windows/Rtools/rtools40-i686.exer]   z:https://cran.r-project.org/bin/windows/Rtools/Rtools35.exe)r   r   rW   )r'   ri   s     r   get_urlr      sP    
CI%eY
 J X J NCJr   namec                 |    d}t        j                         dk(  r"dj                  | |j                  dd            }|S )zToolchain version.r   r   z{}{}r*   )r   r   r!   replace)r   r'   toolchain_folders      r   get_toolchain_versionr      s9    I%!==wsB/GHr   argsc           	         t        j                         dvr t        dt        j                                t               }| d   }|
t	               }t        |      }t        dj                  ||             t        |      }d| v r| d   }nd}| d   }|At        j                  j                  t        j                  j                  d	t                    }t        |       t        d
j                  |             d| v r| d   }nd}t        j                         dk(  rd| v }d| vr	|dv rd}nd}t        ||      }t!        |      5  t#        ||      rt        dj                  |             nat        j                  j%                  |      rt'        j(                  |d       t+        |t,        z   ||       t/        ||t,        z   |||       d| vrrt        j                         dk(  r[|dv rWt        j                  j%                  t        j                  j                  |ddd            rt        d       nt1        ||       ddd       y# 1 sw Y   yxY w)zMain.>   r   zQDownload for the C++ toolchain on the current platform has not been implemented: r'   NzC++ toolchain '{}' version: {}r(   Fr   ~zInstall directory: {}rj   r   r   )r_   r`   r^   z"C++ toolchain {} already installed)ignore_errors)rj   zno-makera   rQ   zmingw32-make.exez"mingw32-make.exe already installed)r   r   NotImplementedErrorr}   rg   rz   r   r!   r   r   r   
expanduserr8   r   r
   r   r	   rD   rc   shutilrmtreerx   rd   rK   rZ   )	r   	toolchainr'   ri   r(   install_dirrj   r   r   s	            r   run_rtools_installr     s/   +!!!)!2 35
 	

 #$I9oG "(G	
*
1
1)W
EF
'
CDy/u+Kgg((c<)HI	
!
(
(
56T
#I%T!4G/A$AF,Y@	{	 @('26==>NOPww~~./.eD 9,cH   9, T!"i/..ww~~$i8J
 :;$%5w?9@ @ @s   C?IIc                  t   t        j                         } | j                  ddd       | j                  ddd       | j                  dd	d
d       | j                  dddd       | j                  dd
d       | j                  dd
d       t        | j	                  t
        j                  dd              S )Nz	--versionz-vzversion, defaults to latest)helpz--dirz-dz*install directory, defaults to '~/.cmdstanz--silentz-s
store_truez6install with /VERYSILENT instead of /SILENT for RTools)actionr   z	--no-makez-mstore_falsez4don't install mingw32-make (Windows RTools 4.0 only)z	--verbosez<flag, when specified prints output from RTools build processz
--progressz;flag, when specified show progress bar for CmdStan downloadr   )argparseArgumentParseradd_argumentvars
parse_argsrE   argv)parsers    r   parse_cmdline_argsr   P  s    $$&F
T0MN
H   E	   C	   K  
 J  
 !!#((12,/00r   c                  *    t        t                      y )N)r   r   r   r   r   __main__r   o  s    )+,r   r   )r   N)F)T),__doc__r   r   r   r   r9   rE   urllib.requestrp   collectionsr   timer   typingr   r   r   	cmdstanpyr   cmdstanpy.utilsr	   r
   r   r   rd   maxsizerW   r   strboolr$   rK   rZ   rD   rg   rx   rz   r}   r   r   r   r   r   __name__r   r   r   <module>r      s    	    
  #  " " " G G%hoo'94F"	KK%	C  $s) 2 )I)I)I )I 	)I
 )I 
)IX0( 0(d 0(t 0(f c d 8 < <3 <$ <$ <0s s C S S  c c F@T#s(^ F@ F@R1DcN 1>- zJ r   