
    eCi+Y                        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mZ ddl	m
Z
mZmZ ddlmZmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZmZmZ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*m+Z+  ej,        d          Z-ej.        /                     ej0        d                    r;ej.        /                     ej0        d                    rddl1Z1 e1j2                     ddhZ3dhZ4h dZ5dddddddddddddddd d!d"d#d$d%ej6        he3z  Z7h d&Z8e G d' d(e
                      Z9e G d) d*                      Z: G d+ d,          Z;d- Z< e&j=                    d.             Z>d/ Z? e&j@        d0          d1             ZA e&j@        d2          d3             ZBeCd4k    rR	  ejD         e>ejE                             dS # eF$ r) e-G                    d5            ejD        d6           Y dS w xY wdS )7a9  emcc - compiler helper script
=============================

emcc is a drop-in replacement for a compiler like gcc or clang.

See  emcc --help  for details.

emcc can be influenced by a few environment variables:

  EMCC_DEBUG - "1" will log out useful information during compilation, as well as
               save each compiler step as an emcc-* file in the temp dir
               (by default /tmp/emscripten_temp). "2" will save additional emcc-*
               steps, that would normally not be separately produced (so this
               slows down compilation).
    N)	dataclass)Enumautounique)	buildingcachecmdlinecompileconfigdiagnosticssharedsystem_libsutils)CLANG_FLAGS_WITH_ARGSoptions)substitute_response_files)COMPILE_TIME_SETTINGSdefault_settingsettingsuser_settings)DEBUGDYLIB_EXTENSIONSin_temp)ToolchainProfiler)exit_with_errorget_file_suffix	read_fileunsuffixed_basenameemccz.gitzbootstrap.pyz.iz.iiz.s>   .H.h.HH.hh.HPP.HXX.hpp.hxxz.cz.cppm.pcmz.cppz.cxxz.ccz.c++z.CPPz.CXXz.Cz.CCz.C++z.mz.miz.mmz.mii.bcz.llz.S>   --bind--emrun--pre-js	--closure	--oformat	--post-js--embed-file--js-library--output-eol--output_eol--shell-file--cpuprofiler--exclude-file--js-transform--preload-file--extern-pre-js--extern-post-js--threadprofiler--emit-symbol-map--profiling-funcs--proxy-to-worker--source-map-base--use-preload-plugins--ignore-dynamic-linkingc                   J    e Zd Z e            Z e            Z e            ZdS )ModeN)__name__
__module____qualname__r   COMPILE_ONLYPOST_LINK_ONLYCOMPILE_AND_LINK     (/b/s/w/ir/x/w/install/emscripten/emcc.pyrC   rC   S   s4         ,466.TVVrK   rC   c                   (    e Zd ZU dZeed<   eed<   dS )LinkFlagzUsed to represent a linker flag.

  The flag value is stored along with a bool that distingingishes input
  files from non-files.

  A list of these is return by separate_linker_flags.
  valueis_fileN)rD   rE   rF   __doc__str__annotations__intrJ   rK   rL   rN   rN   ]   s.           
***,,,,,rK   rN   c                       e Zd Zd ZdS )	EmccStatec                 P    t           j        | _        t          |          | _        d S N)rC   rI   modetuple	orig_args)selfargss     rL   __init__zEmccState.__init__k   s    %DI4[[DNNNrK   N)rD   rE   rF   r^   rJ   rK   rL   rV   rV   j   s#        ! ! ! ! !rK   rV   c                    d }t          |           }t          j        | d          5 }|                    t	          j        d          t          j                            |d                     t          j
                                        d          5 }t          |d          5 }d}d }|D ])}	|}
d}|	                    d          rt          |	          d	k    r8|	                    d
          r#|                    d           |	dd          }	d}d}
|r!t          j                            |	          }	d}|	                    d          sZ|
sX ||	          }|                    |dz              |                    |	t          j                            ||                     n|                    |	dz              |
r|	t           v rd}|	d
k    rd}+	 d d d            n# 1 swxY w Y   |                    |t          j                            |d                     d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nc                     t           j                            t           j                            |                     } t           j                            |           d         } | dd          } | S )N   )ospathnormpathabspath
splitdrive)filenames    rL   make_relativez,create_reproduce_file.<locals>.make_relativer   sQ    w 9 9::Hw!!(++A.H|HOrK   wzemscripten-version.txtzversion.txtz.tar)suffixFz--reproduce=   -oz-o
   T-
zresponse.txt)r   tarfileopenaddr   path_from_rootrb   rc   joinr   get_temp_filesget_file
startswithlenwritebasenamer   )namer]   rh   rootreproduce_filersp_namerspignore_next
output_argargignorerelpaths               rL   create_reproduce_filer   q   s>      
T	"	"$|D# ,G.u+,DEErw||TXZgGhGhiii			 	 	)	)	)	8	8 )GH# &#
 "	 "	C&+^^N++ XX\\cnnT22\IIfabb'CJF 
 '""3''CJ$$ "V "#mC((GIIgn%%%sBGLLw$?$?@@@@IIcDj!!! )))KD[[JE"		& & & & & & & & & & & & & & &P 27<<n#E#EFFFS)G )G )G )G )G )G )G )G )G )G )G )G )G )G )G,G ,G ,G ,G ,G ,G ,G ,G ,G ,G ,G ,G ,G ,G ,G ,G ,G ,Gs[   A.I	H1'D2G&H1&G**H1-G*.7H1%I	1H5	5I	8H5	9I		IIc                 r   t           j        rt           j        }nt           j        }t	          |           dk    ri| d         dk    r]t          t          j                    t          j	                   t          j
        |dgt          j                    z   d          j        S t          j                            d          x}r| t#          j        |          z  } t&          rDt(                              dt#          j        |            d	t          j                     d
           | dd          } 	 t1          |           } n&# t2          $ r}t5          |           Y d }~nd }~ww xY wd| v r?t          t7          t9          j        d                               t          d           dS t=          |           }t          j        |j                   }t           j!        st          j"                     d| v r1t          t          j                               t          d           dS d| v rt          t8          j#                   dS d| v sd| v sd| v r"t          t          j$                               dS d| v sd| v rCt          dtJ          j&                    t          dtO          j(        d                      dS d| v sd| v r]tS          j*        d            tV          j,        -                                d         }t          |.                    d                     dS d | D             }|r|d                             d           d         }tO          j(        d          }	t          j/                            |	|          }
t          j/        0                    |
          rt          |
           nt          |           dS d!t          j        v rt5          d"           d#t          j        v rt5          d$           d%t          j        v rt5          d&           d't          j        v rt          j        d'         tb          _2        tS          j*        tf                     ti          |           d(| v stk          d) | D                       rDt          j6        |gt          j7        tq          |                     z   | z              J d*            d+| v rAt          j7        d, | D                       }t          t#          j        |                     dS tb          j2        rts          tb          j2        |            |j:        tv          j<        k    rt	          tb          j=                  dk    rt5          d-           t}          |          d         }d. |D             }dd/l?m@} |A                    tb          j=        d         tb          |           dS t          tb          ||          }|j:        tv          jC        k    r!dd/l?m@} |D                    tb          |          S t(          E                    d0           dS )1Nrk   ra   z-v)fileF)checkEMCC_CFLAGSzinvocation: z (in )z--helpzdocs/emcc.txtz
------------------------------------------------------------------

emcc: supported targets: llvm bitcode, WebAssembly, NOT elf
(autoconf likes to see elf above to enable shared object support)
r   z	--versionzCopyright (C) 2025 the Emscripten authors (see AUTHORS.txt)
This is free and open source software under the MIT license.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
z-dumpversionz-dumpmachinez-print-target-triplez--print-target-triplez-print-search-dirsz--print-search-dirszprograms: =zlibraries: =T)absolutez-print-libgcc-file-namez--print-libgcc-file-namelibcompiler_rtc                 <    g | ]}|                     d           |S ))z-print-file-name=z--print-file-name=rw   .0as     rL   
<listcomp>zmain.<locals>.<listcomp>  s*    bbb15`(a(abQbbbrK   =EMMAKEN_NO_SDKziEMMAKEN_NO_SDK is no longer supported.  The standard -nostdlib and -nostdinc flags should be used insteadEMMAKEN_COMPILERzw`EMMAKEN_COMPILER` is no longer supported.
Please use the `LLVM_ROOT` and/or `COMPILER_WRAPPER` config settings insteadEMMAKEN_CFLAGSzI`EMMAKEN_CFLAGS` is no longer supported, please use `EMCC_CFLAGS` insteadEMCC_REPRODUCEz-print-resource-dirc              3   @   K   | ]}|                     d           V  dS )z--print-prog-nameNr   r   s     rL   	<genexpr>zmain.<locals>.<genexpr>"  s0      )Z)ZPQ!,,7J*K*K)Z)Z)Z)Z)Z)ZrK   exec_process should not return--cflagsc              3   &   K   | ]}|d k    |V  dS )r   NrJ   )r   xs     rL   r   zmain.<locals>.<genexpr>)  s&      CCa1
??????CCrK   z(--post-link requires a single input filec                     g | ]	}|j         
S rJ   rO   r   fs     rL   r   zmain.<locals>.<listcomp>4  s    000q17000rK   )linkzstopping after compile phase)Fr   run_via_emxx	CLANG_CXXCLANG_CCrx   printr	   version_stringsysstderr
check_callr
   get_target_flags
returncoderb   environgetshlexsplitr   loggerwarningrt   getcwdr   OSErrorr   r   r   rs   rV   parse_argumentsr[   SKIP_SUBPROCScheck_sanityEMSCRIPTEN_VERSIONget_llvm_targetr   	LLVM_ROOTr   get_lib_dirr   limit_settingsr   Libraryget_usable_variationsget_pathrc   isfiler   	reproducer   phase_setupanyexec_process
get_cflagsrZ   r   rY   rC   rH   input_filesseparate_linker_flagstoolsr   run_post_linkphase_compile_inputsrI   rundebug)r]   clangr   estatenewargscompiler_rtprint_file_namelibnamesystem_libpathfullpathcflagslinker_argsr   s                 rL   mainr      s6    EEOE 	YY!^^Q4	'
 
"
"4444eT]W-E-G-GGuUUU`` JNN=111[ %EK$$$D
 I
NNG%*T"2"2GGGGGHHH 
abb$
$T**DD	   A  
)E(99
:
:;;;	     1 D//%#EO44'		 
 D	'
 
"
"###	    
 1t	%
"###1t5==AX\`A`A`	&
 
"
"###1T!!%:d%B%B	
*(
*
*+++	
;*D999
;
;<<<1$&&*D*L*LD!!!%;;==>NOK	+



-
-...1bbbbb/ b!'',,Q/G&555Nw||NG44H	w~~h HooooGnnn1 ##  A  A  A2:%% c d d d ##_```##
#34G /000ed""c)Z)ZUY)Z)Z)Z&Z&Z"
'"4U4[["A"AADHIII222254 CC4CCCCCF	%*V

1 3'+T222
Z4&&&
71$$@AAA'003K00K000Kw*1-wDDD1 %WeW==+
Z4(((88G[)))
LL/0001s   0E   
E#
EE#c                 f    g }g dfd	}d}t          t                               D ]|rd}          t          v rd} fd}                    d          rdk    rMt          j                                      s!t          j        dfvrt          d            |d           dk    r |            | |                                           d          r,	                    d	          d
d         D ]} ||           dk    r | |                       dk    s                    d          r |           3                    d          s8dvr4|
                               |r|
                     |                       |fS )zProcess argument list separating out compiler args and linker args.

  - Linker flags include input files and are returned a list of LinkFlag objects.
  - Compiler flags are those to be passed to `clang -c`.
  Fc                 N                         t          | |                     d S rX   )appendrN   )flagrP   r   s     rL   add_link_argz+separate_linker_flags.<locals>.add_link_argQ  s'    xg../////rK   Tc                  l    t                    dz   k    rt          d  d           dz            S )Nra   zoption 'z' requires an argument)rx   r   )r   ir   s   rL   get_next_argz+separate_linker_flags.<locals>.get_next_arg^  s@    	WQ		>3>>>???QU^rK   rn   zr%s: No such file or directory ("%s" was expected to be an input file, based on the commandline arguments provided)-zz-Wl,,ra   Nz-Xlinker-s)z-lz-Lz--js-library=r   z-url   )z	-nostdlibz-nostartfilesz-nolibcz-nodefaultlibsr   )F)rangerx   r   rw   rb   rc   existsdevnullr   r   r   )	r   compiler_argsr   skipr   r   r   r   r   s	   `     @@@rL   r   r   G  sY    -+0 0 0 0 0 0 
$W #- #-a d
!*C
###d      
 >># -#** W^^C   XSS0A%A%A  M  OR  TW  	X  	X  	Xl3	l3l<<>>""""			 -))C..$  $T	
		l<<>>""""	'PQQl3^^D!! -c1r&r&r3	 -\\^^,,,		##rK   setupc                    t          d t          j        D                       }t          j        rt          j        | _        nO|s<t          j        s0t          j        s$t          j	        st          j
        st          j        rt          j        | _        | j        t          j        k    rVt          D ]#}|t          vrt          j        dd|z             $| j        D ]#}|t$          v rt          j        dd|z             $t&          j        rdt&          _        dt          v rt&          j        t&          _        t&          j        st&          j        rdt&          _        dt          v r=dt          v r4t          d         d	v rt          j        d
d           nt5          d           t&          j        rdt&          _        t&          j        rt          j        d          dk    rt5          d           t          j        d          dk    rt5          d           dt          v s	dt          v rt          j        dd           dt&          _        dt&          _        t          j        d          dk    rt          j        dd           t          j        d          dk    rt5          d           t&          j        rt&          j        st5          d           t          j         !                    d          rtE          dd           t&          j#        r.t          j         !                    d          rt5          d           t&          j$        dk    r^t          j        d          dk    rt5          d            t          j        d          dk    rt5          d!           tE          dd           t&          j$        dk    r(t&          j        rdt&          _$        d"S dt&          _$        d"S d"S )#z`Second phase: configure and setup the compiler based on the specified settings and arguments.
  c              3   B   K   | ]}t          |          t          v V  d S rX   )r   HEADER_EXTENSIONSr   s     rL   r   zphase_setup.<locals>.<genexpr>  s0      __a/!,,0AA______rK   zunused-command-line-argumentz/linker setting ignored during compilation: '%s'z,linker flag ignored during compilation: '%s'ra   USE_PTHREADSDISABLE_EXCEPTION_CATCHINGEXCEPTION_CATCHING_ALLOWED)02
deprecatedz[DISABLE_EXCEPTION_CATCHING=X is no longer needed when specifying EXCEPTION_CATCHING_ALLOWEDzPDISABLE_EXCEPTION_CATCHING and EXCEPTION_CATCHING_ALLOWED are mutually exclusiver   r   zEDISABLE_EXCEPTION_CATCHING=0 is not compatible with -fwasm-exceptionsDISABLE_EXCEPTION_THROWINGzEDISABLE_EXCEPTION_THROWING=0 is not compatible with -fwasm-exceptionsr   znyou no longer need to pass DISABLE_EXCEPTION_CATCHING or DISABLE_EXCEPTION_THROWING when using Wasm exceptionsASYNCIFY1z|ASYNCIFY=1 is not compatible with -fwasm-exceptions. Parts of the program that mix ASYNCIFY and exceptions will not compile.SUPPORT_LONGJMP
emscriptenzCSUPPORT_LONGJMP=emscripten is not compatible with -fwasm-exceptionsa  DISABLE_EXCEPTION_THROWING was set (probably from -fno-exceptions) but is not compatible with enabling exception catching (DISABLE_EXCEPTION_CATCHING=0). If you don't want exceptions, set DISABLE_EXCEPTION_CATCHING to 1; if you do want exceptions, don't link with -fno-exceptionswasm64MEMORY64wasm32z/wasm32 target is not compatible with -sMEMORY64wasmzESUPPORT_LONGJMP=wasm cannot be used with DISABLE_EXCEPTION_THROWING=0zESUPPORT_LONGJMP=wasm cannot be used with DISABLE_EXCEPTION_CATCHING=0N)%r   r   r   	post_linkrC   rH   rY   dash_cdash_Ssyntax_onlydash_Edash_MrG   r   r   r   r   r[   LINK_ONLY_FLAGSr   SIDE_MODULERELOCATABLEr   PTHREADSWASM_WORKERSSHARED_MEMORYr   r   r   WASM_EXCEPTIONSr   r   targetrw   r   r   r   )r   has_header_inputskeyr   s       rL   r   r   }  s
   
 __7K^_____ #$EJJ #GN #gn #@S #W^We #ipiw #"EJ
Z4$$$ E E	)	)	)*=C	E 	E 	E  B B			*:S@	B 	B 	B  H}$$ -H  (/ H!]227SWd7d7d 12j@@,  )F  G  G  G  Ghiii( ,*+H' ]566#==]^^^566#==]^^^ $}448TXe8e8e&  #S  T  T  T*+H'*+H'$$++&  #a  b  b  b*++|;;[\\\( o1T o  n  o  o  o^x(( #J""" G7>44X>> GEFFF ''
 566#==]^^^ 566#==]^^^0!444 "" .!'h!-h	 #"rK   zcompile inputsc                    	
 t           j        rt           j        g
nt           j        g
t          j        rEt                              dt          j                   
                    dt          j                   t          j
                     
fd
fd
fdj        t          j        k    r j        rBt           j                  dk    r*t           j        sdj        vrt'          j        dd	           t+          d
  j        D                       r             |z   }n             |z   }t          j        |           J d            j        t          j        k    sJ  j        rJ t5          |          \  	}i fdfd	 fd}|D ]}|j        s
|j        }t          |          }|t:          t<          z  v s j        r|dk    r ||          |_        O|t>          v rt                              d|            vtA          j!        |          rt                              d|             j"        r ||          |_        |dk    rtG          d           ֌d |D             S )Nzusing compiler wrapper: %sr   c                  <     t          j        j                  z   S rX   )r
   r   r[   compilerr   s   rL   get_clang_commandz/phase_compile_inputs.<locals>.get_clang_command  s    g(9999rK   c                  <     t          j        j                  z   S rX   )r
   get_clang_flagsr[   r  s   rL   get_clang_command_preprocessedz<phase_compile_inputs.<locals>.get_clang_command_preprocessed  s    g-eo>>>>rK   c                  0     t          j                    z   S rX   )r
   r   )r  s   rL   get_clang_command_asmz3phase_compile_inputs.<locals>.get_clang_command_asm  s    g.0000rK   r)   z
-emit-llvmr   z.bc output file suffix used without -flto or -emit-llvm.  Consider using .o extension since emcc will output an object file, not a bitcode filec              3   B   K   | ]}t          |          t          v V  d S rX   )r   ASSEMBLY_EXTENSIONS)r   r   s     rL   r   z'phase_compile_inputs.<locals>.<genexpr>  s0      
R
R?1!44
R
R
R
R
R
RrK   Fr   c                     | vrd| <   | S d|          z  }| xx         dz  cc<   t           j                            |           \  }}||z   |z   S )Nra   z_%d)rb   rc   splitext)r{   unique_suffixbaseext
seen_namess       rL   
uniquenamez(phase_compile_inputs.<locals>.uniquename  sq    :jkJt,,Mt  &&ID#-#%%rK   c                 X    t          |           dz   }t           |                    S )N.o)r   r   )
input_fileobjfiler  s     rL   get_object_filenamez1phase_compile_inputs.<locals>.get_object_filename  s-    !*--4G::g&&'''rK   c                 t   t                               d|              |           }t          |           }|t          v r             }n0|t          v r             }n             }|dk    rd |D             }|d| d|gz   z  }	j        dk    r2|dddt          |           d	z   gz  }|dd
dt          |           d	z   gz  }t          j        |           t          j	        sRt          j                            |          sJ 	j        r*t          j        |t!          j        |           dz              |S )Nzcompiling source file: r(   c                 <    g | ]}|                     d           |S )z-fprebuilt-module-path=r   )r   cs     rL   r   zEphase_compile_inputs.<locals>.compile_source_file.<locals>.<listcomp>"  s*    MMMQQ\\2K%L%LMqMMMrK   z-crl   z-gsplit-dwarfz-Xclangz-split-dwarf-filez.dwoz-split-dwarf-outputr!  )r   r   r   r  PREPROCESSED_EXTENSIONSrequested_debugr   r   r   r   rb   rc   r   
save_tempsshutilcopyfiler   )
r"  output_filer  cmdcompile_argsr  r  r  r$  r   s
       rL   compile_source_filez1phase_compile_inputs.<locals>.compile_source_file  sv   
LL7:77888%%j11K
*
%
%C
!!!!!##cc	'	'	'**,,ccc	MM#MMM<4T;???C/11 
i,i9LZ9X9X[a9abbc	i.	;Nz;Z;Z]c;cddc
c SW^^K(((((		 SU%>z%J%JT%QRRRrK   zusing shared library: zusing static library: rn   z3-E or -x required when input is from standard inputc                     g | ]	}|j         
S rJ   r   r   s     rL   r   z(phase_compile_inputs.<locals>.<listcomp>G  s    	'	'	'a!'	'	'	'rK   )$r   r   r   r   r   COMPILER_WRAPPERr   r   insertr   ensure_sysrootrY   rC   rG   r-  r   r   LTOr[   r   r   allr   r   rI   r   r   rP   rO   SOURCE_EXTENSIONSr  r   r   is_arinput_languager   )r   r   r   r.  r   r0  r   r"  file_suffixr/  r  r  r  r  r$  r  r  s   ``       @@@@@@@@rL   r   r     si    ! !HH H 0
LL-v/FGGGOOAv.///: : : : : :? ? ? ? ? ?1 1 1 1 1 Z4$$$ uw/BCCuLLU]UaLfrz  {J  gJ  gJ&  #t  u  u  u

R
Rg>Q
R
R
RRR *!!##g-cc')c
22225 
t,	,	,	,	,^	3G<<,
 *	& 	& 	& 	& 	&( ( ( ( (         :   c; J!*--K'*===='.=U`diUiUi%%j11cii	(	(	(ll8J889999	
	#	# ll8J889999		 %%j11cii	s		KLLLL 	'	';	'	'	''rK   __main__KeyboardInterruptra   )HrQ   loggingrb   r   r+  r   rp   dataclassesr   enumr   r   r   r   r   r   r	   r
   r   r   r   r   r   tools.cmdliner   r   tools.response_filer   tools.settingsr   r   r   r   tools.sharedr   r   r   tools.toolchain_profilerr   tools.utilsr   r   r   r   	getLoggerr   rc   r   rs   	bootstrapr   r(  r  r   r   r7  r  rC   rN   rV   r   profiler   r   profile_blockr   r   rD   exitargvr<  r   rJ   rK   rL   <module>rL     s4      				   



  ! ! ! ! ! ! # # # # # # # # # #
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 9 8 8 8 8 8 8 8 9 9 9 9 9 9 Z Z Z Z Z Z Z Z Z Z Z Z 9 9 9 9 9 9 9 9 9 9 6 6 6 6 6 6 X X X X X X X X X X X X		6	"	" 7>>&%&v..// BGNNCW5CWXfCgCg4h4h )/- f NNN 	6665&&&$vW\uf*         4    	 	 	 	 	 	 	 	! ! ! ! ! ! ! !4G 4G 4Gn [ [ [|3$ 3$ 3$l ! ))\. \. *)\.~ ! !122i( i( 32i(X zCHTT#(^^	   
LL$%%%CHQKKKKKK s   (G *G65G6