
    eCiO                       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	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 ddlmZ ddlmZ dd	lmZ  ej        d
          Zg dZ eej                            dd                    ZdZd Z ddZ!ddZ"d Z#d Z$ddZ%d Z&d Z'd Z(d Z)d Z*d Z+ddZ, G d d           Z- G d! d"e-          Z. G d# d$e-          Z/ G d% d&e	          Z0 G d' d(e-          Z1 G d) d*e-          Z2 G d+ d,e-          Z3 G d- d.e-          Z4 G d/ d0e.e2          Z5 G d1 d2e-          Z6 G d3 d4e/e4e.          Z7 G d5 d6e3e/e4e.          Z8 G d7 d8e8          Z9 G d9 d:e8          Z: G d; d<e/          Z; G d= d>e3e.          Z< G d? d@e.          Z= G dA dBe3          Z> G dC dDe3          Z? G dE dFe3          Z@ G dG dHe3          ZA G dI dJe1e.e/          ZB G dK dLe1e.e/          ZC G dM dNe1e.          ZD G dO dPe.          ZE G dQ dRe.          ZF G dS dTe-          ZG G dU dVe.          ZH G dW dXe.          ZI G dY dZe.          ZJ G d[ d\e-          ZK G d] d^e/e4e.          ZL G d_ d`e-          ZM G da dbe-          ZN G dc dde-          ZO G de dfe-          ZP G dg dhePe.          ZQ G di djePe.          ZR G dk dlePe.          ZS G dm dneS          ZT G do dpeS          ZU G dq dreS          ZV G ds dteS          ZW G du dve3          ZX G dw dxe-          ZY G dy dze/          ZZd{ Z[d| Z\dd}Z]d~ Z^ ej_                    d             Z`d ZadS )    N)IntEnumauto)iglob)time   )buildingcachediagnosticssharedutils)settings)ToolchainProfiler)	read_filesystem_libs)zsocket.czsocketpair.cz
shutdown.czbind.cz	connect.czlisten.czaccept.czgetsockname.czgetpeername.czsend.czrecv.czsendto.cz
recvfrom.cz	sendmsg.cz	recvmsg.czgetsockopt.czsetsockopt.czfreeaddrinfo.czgethostbyaddr.czgethostbyaddr_r.czgethostbyname.czgethostbyname_r.czgethostbyname2.czgethostbyname2_r.czin6addr_any.czin6addr_loopback.cz	accept4.cEMCC_USE_NINJA0z/emsdk/emscriptenc                 H    t          j        |           fd|D             S )Nc                 P    g | ]"}t           j                            |          #S  )ospathjoin).0fsrcdirs     5/b/s/w/ir/x/w/install/emscripten/tools/system_libs.py
<listcomp>z!files_in_path.<locals>.<listcomp>1   s)    	5	5	5a"',,vq
!
!	5	5	5    r   path_from_root)r   	filenamesr   s     @r   files_in_pathr"   /   s-    %%&	5	5	5	59	5	5	55r   r   c                     t          j        |           }t          t          j                            ||          d          }t          fd|D                       S )NT)	recursivec              3   ^   K   | ]'}t           j                            |          v#|V  (d S Nr   r   basename)r   r   excludess     r   	<genexpr>zglob_in_path.<locals>.<genexpr>7   s=      HHaBG$4$4Q$7$7x$G$G$G$G$G$GHHr   )r   r    r   r   r   r   sorted)r   glob_patternr)   r   filess     `  r   glob_in_pathr.   4   sX    %%&
V\22d
C
C
C%	HHHH5HHH	H	HHr   FTc                    g d}t           j        r|s|dt           j        z   gz  }t           j        st           j        r|ddgz  }|r|dgz  }t           j        r |dt          t           j                  z   gz  }t          j                    }t          j	        
                    ||           }|d| dt           d| dt           d	t           gz  }|S )
N)z-gz-sSTRICTz-Werrorz-flto=-fPICz-sRELOCATABLEz-DEMSCRIPTEN_DYNAMIC_LINKINGz-sMEMORY64=z-ffile-prefix-map==z-fdebug-compilation-dir=)r   LTORELOCATABLEMAIN_MODULEMEMORY64strr   r    r   r   relpathDETERMINISTIC_PREFIX)	build_dirforce_object_files
preprocessflags
source_dirrelative_source_dirs         r   get_base_cflagsr?   :   s    (
'
'%\ ', '	h%&&E 0X1 0
 
g''E 0.//e 6	mc("344455E#%%*
I>>DDD.BDDM!4MM7KMM=';==? ?% 
,r   c                  *    t          j        d          S )Nbuild)r	   get_pathr   r   r   get_build_dirrC   S   s    		 	  r   c                  Z    t           j                                        } dD ]	}|| v r| |= 
| S )N)CFLAGSCXXFLAGSLDFLAGSEMCC_CFLAGSEMCC_AUTODEBUGEMCC_FORCE_STDLIBSEMCC_ONLY_FORCED_STDLIBSEMMAKEN_JUST_CONFIGURE)r   environcopy)safe_envopts     r   	clean_envrQ   W   s>    
 Z__((  c h
3-	/r   c                     t                       t                      }t          j        | t	                      |           t
                              d| dt                      |z
  dd           d S )N)envcwdz	compiled z inputs in z.2fs)ensure_sysrootr   r   run_multiple_processesrQ   loggerinfo)commands
num_inputsr9   
start_times       r   run_build_commandsr]   h   sm     vv*ikkyIIII++K*KK*1DKKKKLLLLLr   c                 V    t           j                            |           }|dv rd|z   S |S )z*Sort object files that we pass to llvm-ar.>   vmlock.oAAA_r'   )filenamer(   s     r   objectfile_sort_keyrb   r   s4    ( Wh''(HOr   c                 H   t          j        |           }t          |t                    }|dv rUt	          |          dk    r+|d         | k    rt          j        |d         |            dS dS t          j        ||            dS |dk    sJ t          j	        d| |           dS )z-Create a library from a set of input objects.key)z.bc.or   r   .acrN)
r   suffixr+   rb   lenshutilcopyfiler   link_to_objectemar)libnameinputsri   s      r   
create_librq      s    <  &&1222&}
6{{a	g		q	7+++++ 
	 fg.....T>>>>M$(((((r   c                  Z    t           j                            t                      d          S )Nbuild.ninja)r   r   r   rC   r   r   r   get_top_level_ninja_filert      s    	moo}	5	55r   c                     dd| dt          j                     g}t          j        r|                    d           t          j        |t                                 d S )Nninjaz-Cz-jz-v)rS   )r   get_num_coresr   PRINT_SUBPROCSappend
check_callrQ   )r9   cmds     r   	run_ninjar|      s_    	$	#?(;(=(=#?#?@# JJtCY[[))))))r   c                     t           j                            |           r|t          |           v rd S t	          | d          5 }|                    |dz              d d d            d S # 1 swxY w Y   d S )Na
)r   r   isfiler   openwrite)
ninja_filetargetr   s      r   ensure_target_in_ninja_filer      s    W^^J Fi
.C.C$C$C
FJ GGFTM                 s   A))A-0A-c                 Z    |                      dd          } t          j        dd|           S )z)Escape a path to be used in a ninja file.\/z([ :$])z$\1)replaceresub)r   s    r   escape_ninja_pathr      s+     
dC	 	 $	
FD	)	))r   c                    |g }t           j        dk    rt          j        nt          j        }d ||           d ||           dt          j         dt          j         dt          j	         d}t          j        |          }t           j                            |          }	|dk    ret          |           d	k    sJ t          | d
                   }
t          j        |
          dz   }|dt          |           d|
 dz  }|d| dz  }nyg }| D ]%}t          j        |                                          }t           j                            |	|dz             }d
}||v r/|d	z  }t           j                            |	| d| d          }||v /|                    |           t          j        |          }|xdk    r d}|}nxdk    r d}|}ndk    rd}|}n	 d}|}|dt          |           d| dt          |           dz  }|r# |||          }||k    r|d ||           z  }|dz  }'t'          |t(                    }d                    d |D                       }|dt          |           d| dz  }t          j        ||           t-          t/                      dt          |                      d S )Nposixzi# Automatically generated by tools/system_libs.py.  DO NOT EDIT

ninja_required_version = 1.5

ASFLAGS = z

CFLAGS = z
EMCC = z
EMXX = z
EMAR = a  

rule cc
  depfile = $out.d
  command = $EMCC -MD -MF $out.d $CFLAGS -c $in -o $out
  description = CC $out

rule cxx
  depfile = $out.d
  command = $EMXX -MD -MF $out.d $CFLAGS -c $in -o $out
  description = CXX $out

rule asm
  command = $EMCC $ASFLAGS -c $in -o $out
  description = ASM $out

rule asm_cpp
  depfile = $out.d
  command = $EMCC -MD -MF $out.d $CFLAGS -c $in -o $out
  description = ASM $out

rule direct_cc
  depfile = $with_depfile
  command = $EMCC -MD -MF $with_depfile $CFLAGS -c $in -o $out
  description = CC $out

rule archive
  # Workaround command line too long issue (https://github.com/ninja-build/ninja/pull/217) by using a response file.
  rspfile = $out.rsp
  rspfile_content = $in
  command = $EMAR cr $out @$rspfile
  description = AR $out

rf   r   r   z.dzbuild z: direct_cc r   z  with_depfile = __.sasm.Sasm_cpp.ccccxxz:  z  CFLAGS = rd   c              3   4   K   | ]}t          |          V  d S r&   )r   )r   os     r   r*   z$create_ninja_file.<locals>.<genexpr>  s+      ==(++======r   z
: archive z	subninja )r   nameshlexr   
subprocesslist2cmdliner   EMCCEMXXEMARr   ri   r   dirnamerj   r   unsuffixed_basenamelowerry   r+   rb   
write_filer   rt   )input_filesra   ro   cflagsasflagscustomize_build_flagsjoin_cmdoutri   r9   
input_filedepfileobjectssrcobject_basenamer   object_uuidextr{   r<   custom_flagss                        r   create_ninja_filer      sn   _G7g--UZZ:3J(*	
 8G*	 *	 (6

*	 *	 	*	 *	 	*	 *	 	*	 *	 *	#V <  &gooh'')t^^{q    ";q>22J'
33d:GJ%g..JJJJJJJC*w****CCG    
 1#66<<>>o
',,y/D"8
9
9akLLqGLL$I$I+$I$I$IJJ LL nnQLcTTTT#%%TTTT#%%TT#%%#%	N'**NNcNN4Ec4J4JNNNNc	 8,,UC885  
7xx5577
7#	TkccW"5666Ghh==W=====GE%g..EE'EEEEC8S!!!688:cFWX`FaFa:c:cdddddr   c                      e Zd ZU dZdZedz  ed<   dZg dZg Z	e
e         ed<   dZedz  ed<   g Ze
e         dz  ed<   dZedz  ed	<   dZe
e         dz  ed
<   dZd Zd Zd Zd Zd%dZd Zd Zd Zd Zd Zd Zd Zd%dZd Zed             Zd Z d Z!d Z"d Z#d Z$ed             Z%ed              Z&ed!             Z'ed"             Z(ed#             Z)ed$             Z*dS )&Librarya
  
  `Library` is the base class of all system libraries.

  There are two types of libraries: abstract and concrete.
    * An abstract library, e.g. MTLibrary, is a subclass of `Library` that
      implements certain behaviour common to multiple libraries. The features
      of multiple abstract libraries can be used through multiple inheritance.
    * A concrete library, e.g. libc, is a subclass of `Library` that describes
      how to build a particular library, and its properties, such as name and
      dependencies.

  This library system is meant to handle having many versions of the same library,
  which we call *variations*. For example, some libraries (those that inherit
  from MTLibrary), have both single-threaded and multi-threaded versions.

  An instance of a `Library` subclass represents a specific variation of the
  library. Instance methods perform operations relating to this variation.
  For example, `get_cflags()` would return the emcc flags needed to build this
  variation, and `build()` would generate the library file for this variation.
  The constructor takes keyword arguments that defines the variation.

  Class methods perform tasks relating to all variations. For example,
  `variations()` returns a list of all variations that exists for this library,
  and `get_default_variation()` returns the variation suitable for the current
  environment.

  Other class methods act upon a group of libraries. For example,
  `Library.get_all_variations()` returns a mapping of all variations of
  existing libraries.

  To add a new type of variation, you must add an parameter to `__init__` that
  selects the variant. Then, override one of `vary_on` or `variations`, as well
  as `get_default_variation`.

  If the parameter is boolean, overriding `vary_on` to add the parameter name
  to the returned list is sufficient:

    @classmethod
    def vary_on(cls):
      return super().vary_on() + ['my_parameter']

  Otherwise, you must override `variations`:

    @classmethod
    def variations(cls):
      return [{'my_parameter': value, **other} for value, other in
              itertools.product([1, 2, 3], super().variations())]

  Overriding either `vary_on` or `variations` allows `embuilder.py` to know all
  possible variations so it can build all of them.

  You then need to modify `get_default_variation` to detect the correct value
  for your new parameter based on the settings:

    @classmethod
    def get_default_variation(cls, **kwargs):
      return super().get_default_variation(my_parameter=settings.MY_PARAMETER, **kwargs)

  This allows the correct variation of the library to be selected when building
  code with Emscripten.
  Nr   F)-O2z-Wallz-fno-unroll-loopsincludessrc_dir	src_filessrc_globsrc_glob_excludec                 2    | j         st          d          dS )a*  
    Creates a variation of this library.

    A variation is a specific combination of settings a library can have.
    For example, libc++-mt-noexcept is a variation of libc++.
    There might be only one variation of a library.

    The constructor keyword arguments will define what variation to use.

    Use the `variations` classmethod to get the list of all possible constructor
    arguments for this library.

    Use the `get_default_variation` classmethod to construct the variation
    suitable for the current invocation of emscripten.
    z&Cannot instantiate an abstract libraryN)r   NotImplementedErrorselfs    r   __init__zLibrary.__init__  s*      9 J HIIIJ Jr   c                     dS )z
    Whether this library can be used in the current environment.

    For example, libmalloc would override this and return False
    if the user requested no malloc.
    Tr   r   s    r   can_usezLibrary.can_use  s	     4r   c                     dS )z
    Whether this library can be built in the current environment.

    Override this if, for example, the library can only be built on WASM backend.
    Tr   r   s    r   	can_buildzLibrary.can_build  s	     4r   c                 R    t          j        |                                            d S r&   )r	   
erase_filerB   r   s    r   erasezLibrary.erase  s!    	T]]__%%%%%r   c                 R    t          j        |                                 |          S )Nabsolute)r	   get_lib_nameget_filename)r   r   s     r   rB   zLibrary.get_path  s$    d//11HEEEEr   c                 |    t          j        |                                 | j        t          dk    t                    S )zs
    Gets the cached path of this library.

    This will trigger a build if this library is not in the cache.
       forcequiet)r	   getrB   do_build	USE_NINJAr   s    r   rA   zLibrary.build  s,     9T]]__dm9>QZ[[[[r   c                 |    t          j        |                                 | j        t          dk    t                    S )Nr   r   )r	   r   rB   do_generater   r   s    r   generatezLibrary.generate  s+    9T]]__d&6i1nT]^^^^r   c                     |                                  }|                                 dk    r|S t          j        |          }d|                    d          z   S )z|
    Gets the link flags needed to use the library.

    This will trigger a build if this library is not in the cache.
    rg   z-llib)rA   get_extr   r   removeprefix)r   fullpathbases      r   get_link_flagzLibrary.get_link_flag  sR     zz||H||~~o$X..D$##E****r   c                     | j         rg| j        r| j        rt          d          | j        rt	          | j         | j                  S | j        r"t          | j         | j        | j        pd          S t                      )z
    Gets a list of source files for this library.

    Typically, you will use `src_dir`, `src_files`, `src_glob` and `src_glob_exclude`.
    If those are insufficient to describe the files needed, you can override this method.
    z*Cannot use src_files and src_glob togetherr   )r   r   r   	Exceptionr"   r.   r   r   r   s    r   	get_fileszLibrary.get_files  s     | V	 FDM FDEEE	 VT\4>:::= VDL$-9N9TRTUUU


r   c                 H   t                       t          j        |           || _        |                                 }t          | j        d          }|                                 }t          j        	                    |d          }t          |||||| j                   d S )NFr;   rs   )r   r   )rV   r   safe_ensure_dirsr9   
get_cflagsr?   r   r   r   r   r   customize_build_cmd)r   r9   ro   r   r   r   r   s          r   generate_ninjazLibrary.generate_ninja  s    	9%%%DN__Fdn???G..""Ki77Jk:wgkg  A  A  A  A  A  Ar   c                 X   t          t          j                            dd                    }|| _        i }g }t                      }|                                 }|                                 D ]}t          j	        |          }|dv rt          j        }	nt          j        }	|	dg}	|dk    r|	t          | j        d          z  }	n|	|z  }	|                     |	|          }	t          j        |                                          }
t          j                            ||
dz             }||v rQd	}||v r/|d
z  }t          j                            ||
 d| d          }||v /|                    |	|d|gz              n|rt          j                            ||          }t          j        |          }|                    t/          |	          g                               |           t          j                            |t          j        |          dz             }n|                    |	|d|gz              |                    |           |rt3          d
t5          |          dt          j                    z  z            }|                                D ]l\  }	}t;          |	          }	t=          d	t5          |          |          D ]9}||||z            }|                    t?          j         |	|z                        :mtC          |t5          |          |           |S )z
    Returns a list of compiled object files for this library.

    By default, this builds all the source files returned by `self.get_files()`,
    with the `cflags` returned by `self.get_cflags()`.
    EMCC_BATCH_BUILD1>   r   r   r   z-cr   Fr   rf   r   r   r   z-or   )r[   r9   )"intr   rM   r   r9   setr   r   r   ri   r   r   r   r?   r   r   r   r   r   ry   r7   normalize_path
setdefaulttupleaddmaxrj   rw   itemslistranger   'get_command_with_possible_response_filer]   )r   r9   batch_inputsbatchesrZ   r   r   r   r   r{   r   r   r   
chunk_sizesrcsi
chunk_srcss                    r   build_objectszLibrary.build_objects  s    rz~~&8#>>??LDNGHeeG__F~~ ( (Lc	"	"	"kk$Kc	 	t~%@@@@v$$S#..c1#66<<>>o
',,y/D"8
9
9a	
g 7ll

+gll9&K&KK&K&K&KLL! 7ll 	sD!n,---- 	. gooc9--"3''5::r**11#666GLLE$=c$B$BT$IJJsD!n,---kk!nnnn 
^ q#g,,1u/B/D/D+DEFFj}} ^ ^)#t3iiq#d))Z00 	^ 	^AAa*n,-*
//(J3Q[K[\\
]
]
]
]	^ xCLLINNNNNr   c                     |S )zAllows libraries to customize the build command used on per-file basis.

    For example, libc uses this to replace -Oz with -O2 for some subset of files.r   )r   r{   	_filenames      r   r   zLibrary.customize_build_cmd)  s	     Jr   c                    ||                      d          k    sJ t          j                            t	                      |                                           }t          r+|                     ||           |st          |           dS dS |dz  }t          j
        |           t          ||                     |                     t          j        st          j        |           dS dS )z4Builds the library and returns the path to the file.Tr   z-tmpN)rB   r   r   r   rC   get_base_namer   r   r|   r   r   rq   r   r   DEBUG
delete_dir)r   out_filenamegenerate_onlyr9   s       r   r   zLibrary.do_build/  s    4==$=777777]__d.@.@.B.BCCI $
)\222 ) 
 6iY'''t11)<<===\ $#####$ $r   c                 4    |                      |d           d S )NT)r  )r   )r   r  s     r   r   zLibrary.do_generate@  s    MM,dM33333r   c                 l    g }| j         d d d         D ] }||j                            |g           z  }!|S )N)__mro____dict__r   )clsattrresultitems       r   _inherit_listzLibrary._inherit_listC  sH     FDDbD! , ,!!$+++ffMr   c                     |                      d          }|t          | j        | j                  z  }| j        r"|d |                      d          D             z  }|S )z
    Returns the list of flags to pass to emcc when building this variation
    of the library.

    Override and add any flags as needed to handle new variations.
    r   )r:   c                 <    g | ]}d t          j        |          z   S )z-Ir   )r   r   s     r   r   z&Library.get_cflags.<locals>.<listcomp>X  s(    XXXA,Q///XXXr   r   )r  r?   r9   r:   r   )r   r   s     r   r   zLibrary.get_cflagsM  sj     ))F
odnAXYYYYF} YXX9K9KJ9W9WXXXXfMr   c                     | j         S )zD
    Returns the base name of the library without any suffixes.
    )r   r   s    r   get_base_name_prefixzLibrary.get_base_name_prefix[  s     9r   c                 *    |                                  S )z
    Returns the base name of the library file.

    This will include suffixes such as -mt, but will not include a file extension.
    )r  r   s    r   r   zLibrary.get_base_namea  s     $$&&&r   c                     dS )zA
    Return the appropriate file extension for this library.
    rg   r   r   s    r   r   zLibrary.get_exti  s	     4r   c                 T    |                                  |                                 z   S )zQ
    Return the full name of the library file, including the file extension.
    )r   r   r   s    r   r   zLibrary.get_filenameo  s#     $,,..00r   c                     g S )a'  
    Returns a list of strings that are the names of boolean constructor
    arguments that defines the variations of this library.

    This is used by the default implementation of `cls.variations()` to generate
    every possible combination of boolean values to pass to these arguments.
    r   )r
  s    r   vary_onzLibrary.vary_onu  s	     Ir   c                     |                                  fdt          j        ddgt                              D             S )a*  
    Returns a list of keyword arguments to pass to the constructor to create
    every possible variation of this library.

    By default, this is every possible combination of boolean values to pass
    to the list of arguments returned by `vary_on`, but you can override
    the behaviour.
    c           	      N    g | ]!}t          t          |d                     "S )T)strict)dictzip)r   togglesr  s     r   r   z&Library.variations.<locals>.<listcomp>  sB     C C CDWgd33344 C C Cr   FT)repeat)r  	itertoolsproductrj   )r
  r  s    @r   
variationszLibrary.variations  s_     kkmmGC C C CudmCLLAAAC C C Cr   c                      | di |S )a  
    Construct the variation suitable for the current invocation of emscripten.

    Subclasses should pass the keyword arguments they introduce to the
    superclass version, and propagate **kwargs. The base class collects
    all the keyword arguments and creates the instance.
    r   r   )r
  kwargss     r   get_default_variationzLibrary.get_default_variation  s     3====r   c              #   t   K   | V  |                                  D ]}|                                E d{V  dS )zEReturns all the classes in the inheritance tree of the current class.N)__subclasses__get_inheritance_tree)r
  subclasss     r   r'  zLibrary.get_inheritance_tree  s]       III&&(( 1 1..00000000001 1r   c                     i }|                                  D ]S}|j        rJ|                                D ]5} |di |}|                                r|||                                <   6T|S )a  
    Gets all the variations of libraries in the inheritance tree of the current
    library.

    Calling Library.get_all_variations() returns the variations of ALL libraries
    that can be built as a dictionary of variation names to Library objects.
    r   )r'  r   r!  r   r   )r
  r  libraryr<   	variations        r   get_all_variationszLibrary.get_all_variations  s     F++-- : :	 :'')) 	: 	:Eg&&&&)  "" :09F9**,,-Mr   c                    t          | d          spi | _        |                                 D ]T}|j        rK|                                }|                                r#|                                r|| j        |j        <   U| j        S )z
    Gets all libraries suitable for the current invocation of emscripten.

    This returns a dictionary of simple names to Library objects.
    useable_variations)hasattrr.  r'  r   r$  r   r   )r
  r(  r*  s      r   get_usable_variationszLibrary.get_usable_variations  s     3,-- <!c..00 < <(= 	<2244'   <W__%6%6 <4;C"8=1!!r   F)+__name__
__module____qualname____doc__r   r6   __annotations__never_forcer   r   r   r   r   r   r   r:   r   r   r   r   rB   rA   r   r   r   r   r   r   r   r   classmethodr  r   r  r   r   r   r  r!  r$  r'  r,  r0  r   r   r   r   r     s        < <D $d
 + 100& (DI '3: ")T#Y"""(C$J'+DI$+++ J J J&    & & &F F F F\ \ \_ _ _+ + +     $	A 	A 	AD D DL  $ $ $ $"4 4 4   ;    ' ' '  1 1 1   ; C C ;C   ; 1 1 ;1   ;" " " ;" " "r   r   c                        e Zd Z fdZ fdZ fdZe fd            Ze fd            Ze fd            Z	 xZ
S )	MTLibraryc                     |                     d          | _        |                     d          o| j         | _         t                      j        di | d S )Nis_mtis_wwr   )popr<  r=  superr   r   r#  	__class__s     r   r   zMTLibrary.__init__  sU    G$$DJG$$7TZDJEGGvr   c                 ~    t                                                      }| j        r|ddgz  }| j        r|dgz  }|S )N-pthread-sWASM_WORKERS)r?  r   r<  r=  r   r   rA  s     r   r   zMTLibrary.get_cflags  sO    WW!!Fz /-..fz #!""fMr   c                 x    t                                                      }| j        r|dz  }| j        r|dz  }|S )Nz-mtz-ww)r?  r   r<  r=  r   r   rA  s     r   r   zMTLibrary.get_base_name  sC    77  ""Dz 
emdz 
emdKr   c                 N    t                                                      ddgz   S )Nr<  r=  r?  r  r
  rA  s    r   r  zMTLibrary.vary_on  s!    77??111r   c                 ~     t                      j        dt          j        t          j        ot          j         d|S )Nr<  r=  r   )r?  r$  r   PTHREADSSHARED_MEMORYr
  r#  rA  s     r   r$  zMTLibrary.get_default_variation  sI    (577( "<8+<'<  	  r   c                 \    t                                                      }d |D             S )Nc                 2    g | ]}|d          r|d         |S rL  r   r   combos     r   r   z(MTLibrary.variations.<locals>.<listcomp>  s*    RRReU7^R5>RERRRr   r?  r!  r
  combosrA  s     r   r!  zMTLibrary.variations  s/    WW!!F SRvRRRRr   )r2  r3  r4  r   r   r   r8  r  r$  r!  __classcell__rA  s   @r   r:  r:    s            
         2 2 2 2 ;2     ; S S S S ;S S S S Sr   r:  c                   f     e Zd Z fdZ fdZ fdZe fd            Ze fd            Z xZ	S )DebugLibraryc                 n    |                     d          | _         t                      j        di | d S Nis_debugr   )r>  r]  r?  r   r@  s     r   r   zDebugLibrary.__init__  s9    JJz**DMEGGvr   c                 b    t                                                      }| j        s|dgz  }|S )N-DNDEBUG)r?  r   r]  rE  s     r   r   zDebugLibrary.get_cflags  s3    WW!!F= fMr   c                 `    t                                                      }| j        r|dz  }|S )N-debug)r?  r   r]  rG  s     r   r   zDebugLibrary.get_base_name  s1    77  ""D} 
hdKr   c                 L    t                                                      dgz   S )Nr]  rI  rJ  s    r   r  zDebugLibrary.vary_on  s    77??
|++r   c                 N     t                      j        ddt          j        i|S r\  )r?  r$  r   
ASSERTIONSrO  s     r   r$  z"DebugLibrary.get_default_variation  s(    (577(PP(2EPPPPr   
r2  r3  r4  r   r   r   r8  r  r$  rW  rX  s   @r   rZ  rZ    s                     , , , , ;, Q Q Q Q ;Q Q Q Q Qr   rZ  c                   b    e Zd ZdZ e            Z e            Z e            Z e            ZdS )
ExceptionsaV  
  This represents exception handling mode of Emscripten. Currently there are
  three modes of exception handling:
  - NONE: Does not handle exceptions. This includes -fno-exceptions, which
    prevents both throwing and catching, and -fignore-exceptions, which only
    allows throwing, but library-wise they use the same version.
  - EMSCRIPTEN: Emscripten provides exception handling capability using JS
    emulation. This causes code size increase and performance degradation.
  - WASM_LEGACY: Wasm native exception handling support (legacy)
  - WASM: Wasm native exception handling support
  N)	r2  r3  r4  r5  r   NONE
EMSCRIPTENWASM_LEGACYWASMr   r   r   rg  rg    sF        
 
 
$tvv*+	$$$r   rg  c                   f     e Zd Z fdZ fdZ fdZe fd            Ze fd            Z xZ	S )ExceptionLibraryc                 n    |                     d          | _         t                      j        di | d S Neh_moder   r>  rp  r?  r   r@  s     r   r   zExceptionLibrary.__init__  s9    ::i((DLEGGvr   c                    t                                                      }| j        xt          j        k    r |dgz  }nGxt          j        k    r |dgz  }n/xt          j        k    r	 |ddgz  }nt          j        k    r|ddgz  }|S )N-fno-exceptionsz-sDISABLE_EXCEPTION_CATCHING=0z-fwasm-exceptions-sWASM_LEGACY_EXCEPTIONS-sWASM_LEGACY_EXCEPTIONS=0)r?  r   rp  rg  rh  ri  rj  rk  rE  s     r   r   zExceptionLibrary.get_cflags  s    WW!!F
,:????$%% :    344!:!!!!&(BCC???&(DEEMr   c                     t                                                      }| j        xt          j        k    r |dz  }n+xt          j        k    r |dz  }nt          j        k    r|dz  }|S )Nz	-noexceptz-legacyexceptz-wasmexcept)r?  r   rp  rg  rh  rj  rk  rG  s     r   r   zExceptionLibrary.get_base_name,  sm    77  ""D ,:????!:!!!!???Kr   c                     t                                                      }d |D             d |D             z   d |D             z   d |D             z   S )Nc                 >    g | ]}t          dd t          j        i|S rp  r   )r  rg  rh  rR  s     r   r   z/ExceptionLibrary.variations.<locals>.<listcomp><  -    HHHT33*/3U33HHHr   c                 >    g | ]}t          dd t          j        i|S ry  r  rg  ri  rR  s     r   r   z/ExceptionLibrary.variations.<locals>.<listcomp>=  .    NNNeT99*/9599NNNr   c                 >    g | ]}t          dd t          j        i|S ry  r  rg  rj  rR  s     r   r   z/ExceptionLibrary.variations.<locals>.<listcomp>>  .    OOOuT::*0:E::OOOr   c                 >    g | ]}t          dd t          j        i|S ry  r  rg  rk  rR  s     r   r   z/ExceptionLibrary.variations.<locals>.<listcomp>?  rz  r   rT  rU  s     r   r!  zExceptionLibrary.variations9  sw    WW!!FHHHHHNNvNNNOOOOOOP IHHHHI Jr   c                     t           j        r&t           j        rt          j        }n6t          j        }n)t           j        dk    rt          j        }nt          j        } t                      j
        dd|i|S )Nr   rp  r   )r   WASM_EXCEPTIONSWASM_LEGACY_EXCEPTIONSrg  rj  rk  DISABLE_EXCEPTION_CATCHINGrh  ri  r?  r$  r
  r#  rp  rA  s      r   r$  z&ExceptionLibrary.get_default_variationA  sm     &		( "(/		,	1	1gg%g(577(CCCFCCCr   
r2  r3  r4  r   r   r   r8  r!  r$  rW  rX  s   @r   rm  rm    s                     J J J J ;J 
D 
D 
D 
D ;
D 
D 
D 
D 
Dr   rm  c                   f     e Zd Z fdZ fdZ fdZe fd            Ze fd            Z xZ	S )SjLjLibraryc                 n    |                     d          | _         t                      j        di | d S ro  rq  r@  s     r   r   zSjLjLibrary.__init__P  s9    ::i((DLEGGvr   c                     t                                                      }| j        xt          j        k    r	 |ddgz  }n/xt          j        k    r	 |g dz  }nt          j        k    r|g dz  }|S )Nz-sSUPPORT_LONGJMP=emscriptenz-sDISABLE_EXCEPTION_THROWING=0)-sSUPPORT_LONGJMP=wasmrt  -sDISABLE_EXCEPTION_THROWING-D__WASM_SJLJ__)r  ru  r  r  )r?  r   rp  rg  ri  rj  rk  rE  s     r   r   zSjLjLibrary.get_cflagsU  s    WW!!F
, :    135 	5!:!!!! & & & 	& ??? & & & 	& Mr   c                     t                                                      }| j        xt          j        k    r |dz  }nt          j        k    r|dz  }|S )Nz-legacysjljz	-wasmsjlj)r?  r   rp  rg  rj  rk  rG  s     r   r   zSjLjLibrary.get_base_nameg  sT    77  ""D ,!:!!!!???Kr   c                     t                                                      }d |D             d |D             z   d |D             z   S )Nc                 >    g | ]}t          dd t          j        i|S ry  r|  rR  s     r   r   z*SjLjLibrary.variations.<locals>.<listcomp>u  r}  r   c                 >    g | ]}t          dd t          j        i|S ry  r  rR  s     r   r   z*SjLjLibrary.variations.<locals>.<listcomp>v  r  r   c                 >    g | ]}t          dd t          j        i|S ry  r  rR  s     r   r   z*SjLjLibrary.variations.<locals>.<listcomp>w  rz  r   rT  rU  s     r   r!  zSjLjLibrary.variationsr  s]    WW!!FNNvNNNOOOOOPHHHHHI Jr   c                     t           j        dk    r&t           j        rt          j        }nt          j        }nt          j        } t                      j        dd|i|S )Nwasmrp  r   )	r   SUPPORT_LONGJMPr  rg  rj  rk  ri  r?  r$  r  s      r   r$  z!SjLjLibrary.get_default_variationy  sY    6))		( "(/%g(577(CCCFCCCr   r  rX  s   @r   r  r  O  s            
    $	 	 	 	 	 J J J J ;J D D D D ;D D D D Dr   r  c                       e Zd Zg dZg dZdS )MuslInternalLibrary)z!system/lib/libc/musl/src/internal system/lib/libc/musl/src/includesystem/lib/libc/musl/includesystem/lib/libcsystem/lib/pthread)z-std=c99z-D_XOPEN_SOURCE=700z-Wno-unused-resultN)r2  r3  r4  r   r   r   r   r   r  r    s0          (  &&&r   r  c                   f     e Zd Z fdZ fdZ fdZe fd            Ze fd            Z xZ	S )AsanInstrumentedLibraryc                 p    |                     dd          | _         t                      j        di | d S )Nis_asanFr   )r>  r  r?  r   r@  s     r   r   z AsanInstrumentedLibrary.__init__  s;    ::i//DLEGGvr   c                 b    t                                                      }| j        r|dgz  }|S )Nz-fsanitize=address)r?  r   r  rE  s     r   r   z"AsanInstrumentedLibrary.get_cflags  s5    WW!!F| '%&&fMr   c                 `    t                                                      }| j        r|dz  }|S )Nz-asan)r?  r   r  rG  s     r   r   z%AsanInstrumentedLibrary.get_base_name  0    77  ""D| 
godKr   c                 L    t                                                      dgz   S )Nr  rI  rJ  s    r   r  zAsanInstrumentedLibrary.vary_on  s    77??	{**r   c                 N     t                      j        ddt          j        i|S )Nr  r   )r?  r$  r   USE_ASANrO  s     r   r$  z-AsanInstrumentedLibrary.get_default_variation  s(    (577(MM1BMfMMMr   re  rX  s   @r   r  r    s                     + + + + ;+ N N N N ;N N N N Nr   r  c                       e Zd Zd ZdZg dZdZdZddgZg dZ	 e
ede		          Ze e
ed          z  Ze e
ed
          z  Ze edg d          z  ZdS )libcompiler_rtT)-fno-builtinr_  z-DCOMPILER_RT_HAS_ATOMICS=1z#system/lib/compiler-rt/lib/builtinsz"system/lib/compiler-rt/lib/profiler  system/lib/compiler-rt/include)zgcc_personality_v0.czextendbfsf2.cztruncdfbf2.cztruncxfbf2.cztruncsfbf2.cztrunctfbf2.cz
crtbegin.czcrtend.czdivxc3.czextendhfxf2.czextendxftf2.cz	fixxfdi.cz	fixxfti.czfixunsxfdi.czfixunsxfsi.czfixunsxfti.czfloatdixf.czfloattixf.czfloatundixf.czfloatuntixf.czmulxc3.cz	powixf2.cztrunctfxf2.cztruncxfhf2.c*.cr)   *.cppzsystem/lib/compiler-rt)zstack_ops.Szstack_limits.Szemscripten_setjmp.czemscripten_exception_builtins.czemscripten_tempret.sz__c_longjmp.Sz__trap.cr   r!   N)r2  r3  r4  r   r:   r   r   profile_src_dirr   r)   r.   r   r"   r   r   r   r  r    s        	$ FFF&1'8/!AB(  (< l7EH===)||OU333)||OW555)}}#  
	 
	 
	 
	)))r   r  c                       e Zd Zd ZdZdgZdS )	libnoexitr  zatexit_dummy.cN)r2  r3  r4  r   r   r   r   r   r   r  r    s         	$' )))r   r  c                   *    e Zd ZdZdZdgZg dZd ZdS )llvmlibclibllvmlibcTsystem/lib/llvm-libc)-Os-DLIBC_NAMESPACE=__llvm_libcz-DLLVM_LIBCz-DLIBC_COPT_PUBLIC_PACKAGINGc                    t          dd          }|t          dd          z  }|t          dd| j        rddgng           z  }|t          d	d          z  }|t          d
d          z  }|t          dd          z  }|t          dd          z  }|t          dd          z  }|t          dd          z  }|t          dd          z  }|t          ddg d          z  }|t          ddddg          z  }|t          dd          z  }|S )Nzsystem/lib/llvm-libc/src/assertr  z system/lib/llvm-libc/src/complex**/*.cppzsystem/lib/llvm-libc/src/stringz
memset.cppz
memcpy.cppr  z system/lib/llvm-libc/src/intypesz system/lib/llvm-libc/src/stringszsystem/lib/llvm-libc/src/errnozsystem/lib/llvm-libc/src/mathzsystem/lib/llvm-libc/src/wcharzsystem/lib/llvm-libc/src/setjmpzsystem/lib/llvm-libc/src/stdlib)zat_quick_exit.cppzquick_exit.cppz
atexit.cppzexit.cppz	_Exit.cppz
getenv.cppz%system/lib/llvm-libc/src/math/genericz
atan2l.cppzexp_utils.cppz-system/lib/llvm-libc/src/__support/StringUtil)r.   r  r   r-   s     r   r   zllvmlibc.get_files  st   :GDDE	\<jIIIE	\;Zrvr~  SGS_amRnRn  EG  H  H  H  HE	\<gFFFE	\<jIIIE	\:JGGGE	\97CCCE	\:GDDDE	\;WEEEE	\;ZHHHE	\;W P^ P^ P^ _ _ _ _E 
\A:YegvXwxxxxE	\I:VVVELr   N)r2  r3  r4  r   r7  r   r   r   r   r   r   r  r    s@        	$+$%(aaa&    r   r  c                   J     e Zd Zd Zg dZeg dz  Z fdZd Zd Zd Z xZ	S )libcr  -fno-inline-functionsr  )z-Wno-ignored-attributesz-Wno-macro-redefined-Wno-shift-op-parenthesesz-Wno-string-plus-intz-Wno-missing-bracesz-Wno-logical-op-parenthesesz-Wno-bitwise-op-parentheses-Wno-unused-but-set-variable-Wno-unused-variablez-Wno-unused-labelz-Wno-pointer-signc                 l    |                                  | _         t                      j        di | d S Nr   )get_libcall_filesnon_lto_filesr?  r   r@  s     r   r   zlibc.__init__'  s:    //11DEGGvr   c                    g d}t          d|          }t          ddg          }t          dg d          }t          dg d	          }|t          d
dg          z  }t          dddg          }||z   |z   |z   |z   S )N).zfmin.czfminf.czfminl.czfmax.czfmaxf.czfmaxl.czfmod.czfmodf.czfmodl.czlogf.czlogf_data.czlog2f.czlog2f_data.czlog10.czlog10f.czexp.cz
exp_data.czexp2.czexp2f.czexp2f_data.czexp10.czexp10f.czldexp.czldexpf.czldexpl.czscalbn.cz__fpclassifyl.cz__signbitl.cz__signbitf.cz__signbit.cz__math_divzero.cz__math_divzerof.cz__math_oflow.cz__math_oflowf.cz__math_uflow.cz__math_uflowf.cz__math_invalid.cz__math_invalidf.cz__math_invalidl.czpow.cz
pow_data.czlog.cz
log_data.czlog2.czlog2_data.cz	scalbnf.csystem/lib/libc/musl/src/mathr  system/lib/libc/musl/src/exitatexit.cr  )emscripten_memcpy.cemscripten_memset.cemscripten_memcpy_bulkmem.Semscripten_memset_bulkmem.Semscripten_scan_stack.cemscripten_get_heap_size.cemscripten_memmove.csystem/lib/libc/musl/src/stdio)z__towrite.cz__overflow.czfwrite.czfputs.czgetc.czfputc.czfgets.czputc.czputc_unlocked.cz	putchar.czputchar_unlocked.czprintf.czputs.cz__lockfile.csystem/lib/libc/musl/src/stringzstrlen.czsystem/lib/libc/musl/src/errnoz__errno_location.cz
strerror.cr"   )r   
math_files
exit_filesother_filesiprintf_fileserrno_filess         r   r  zlibc.get_libcall_files+  s      J* $CzZZZJ,,     J  ) ) )* * *K "+7 7 78 8 8M ],   M
  +%|46 6 6K 
"[0=@;NNr   c           	        	 g }t          j        d          }g d		g dz  		t          z  	| j        r	g dz  	|t	          dg d          z  }n2	dgz  	|t	          d	g d
          z  }|t	          dg d          z  }	g dz  	t          	          	t          j        |          D ]\  }}}	fd|D             }|D ]}|                    |           |D ]O}|	                    d          r8|	vr4|
                    t          j                            |||                     P|t	          dg d          z  }|t	          dg d          z  }|t	          dg d          z  }|t	          ddg          z  }|t	          ddg          z  }|t	          dg d          z  }|t	          dg d          z  }|t	          dg d          z  }|t	          dg d           z  }t          j        st          j        r|t	          dd!g          z  }|t	          dd"g          z  }|t!          d#d$          z  }| j        D ]+}t          j                            |          s
J |            ,|S )%Nzsystem/lib/libc/musl/src)ipcpasswdsignalschedr   linuxaioexitlegacymqsetjmpldsomalloc)zmemcpy.czmemset.cz	memmove.czgetaddrinfo.czgetnameinfo.czres_query.czres_querydomain.czproto.czppoll.cz	syscall.czpopen.czpclose.czgetgrouplist.czinitgroups.cz	wordexp.cztimer_create.czgetauxval.clookup_name.czfork.czvfork.czposix_spawn.czposix_spawnp.czexecve.czwaitid.csystem.cz_Fork.cz__reset_tls.cz__init_tls.cz__libc_start_main.c)zclone.cpthread_create.cpthread_kill.cpthread_sigmask.cz__set_thread_area.cz
synccall.cz__syscall_cp.cz__tls_get_addr.cz__unmapself.czsyscall_cp.cztls.czpthread_setname_np.czpthread_getname_np.cr  )zlibrary_pthread.czem_task_queue.cz
proxying.czproxying_legacy.czthread_mailbox.cr  r  zemscripten_thread_init.czemscripten_thread_state.Szemscripten_futex_wait.czemscripten_futex_wake.czemscripten_yield.cr  threadzsystem/lib/libc/musl/src/thread))zpthread_self.czpthread_cleanup_push.czpthread_attr_init.czpthread_attr_destroy.czpthread_attr_get.czpthread_attr_setdetachstate.czpthread_attr_setguardsize.czpthread_attr_setinheritsched.czpthread_attr_setschedparam.czpthread_attr_setschedpolicy.czpthread_attr_setscope.czpthread_attr_setstack.czpthread_attr_setstacksize.czpthread_getattr_np.czpthread_getconcurrency.czpthread_getcpuclockid.czpthread_getschedparam.czpthread_setschedprio.czpthread_setconcurrency.czdefault_attr.czcall_once.cztss_create.cztss_delete.cz	tss_set.czcnd_broadcast.czcnd_destroy.cz
cnd_init.czcnd_signal.czcnd_timedwait.cz
cnd_wait.czmtx_destroy.cz
mtx_init.cz
mtx_lock.czmtx_timedlock.czmtx_trylock.czmtx_unlock.czthrd_create.czthrd_exit.czthrd_join.czthrd_sleep.czthrd_yield.c)zlibrary_pthread_stub.czpthread_self_stub.czproxying_stub.czpow_small.czlog_small.czlog2_small.cc                     g | ]}|v |	S r   r   )r   dignores     r   r   z"libc.get_files.<locals>.<listcomp>  s    333aqF{{{{{r   r   system/lib/libc/musl/src/time)zclock_settime.czasctime_r.cz	asctime.czctime.cz
difftime.czftime.czgmtime.czlocaltime.cznanosleep.czclock.czclock_nanosleep.czclock_getres.czclock_gettime.cz	ctime_r.cztimespec_get.czutime.cz__map_file.cz
strftime.c__tz.cz__tm_to_secs.cz__year_to_secs.cz__month_to_secs.cz
wcsftime.czsystem/lib/libc/musl/src/legacy)zgetpagesize.czerr.czeuidaccess.czsystem/lib/libc/musl/src/linux)z
getdents.czgettid.czutimes.czstatx.czwait4.czwait3.czsystem/lib/libc/musl/src/malloczreallocarray.czsystem/lib/libc/musl/src/schedzsched_yield.cr  )zabort.cz_Exit.cr  zat_quick_exit.czquick_exit.czsystem/lib/libc/musl/src/ldso)zdladdr.cz	dlerror.czdlsym.cz	dlclose.czsystem/lib/libc/musl/src/signal)zblock.czgetitimer.czkillpg.czsetitimer.cz
sigorset.czsigandset.czsigaddset.czsigdelset.czsigemptyset.czsigisemptyset.czsigfillset.czsigismember.czsiginterrupt.czsignal.czsigprocmask.cz
sigrtmax.cz
sigrtmin.cz	sigwait.czsigwaitinfo.cr  )zemscripten_console.czemscripten_fiber.cr  r  r  r  r  r  zemscripten_mmap.cr  zemscripten_time.cmktime.czkill.cr  r  zraise.czsigaction.czsigtimedwait.czwasi-helpers.cr  z	dynlink.czthread_profiler.czsystem/lib/libc/compatr  )r   r    LIBC_SOCKETSr<  r"   r   r   walkremoveendswithry   r   r   r   r3   r4   r.   r  exists)
r   
libc_filesmusl_srcdirdirpathdirnamesr!   r  rr   r  s
            @r   r   zlibc.get_filest  s   J&'ABBK  F     F  lFz T    f M!
 
 
   jj" 
fM.+
 +
 +
- - - -j\ M!
 
 
   j <<<<F[[F(*(<(< C C$933338333f  ! C C!::d 	C


BGLLgqAA
B
B
BC
 -,
 
 
   J8 -.<<<> > > >J --YYY[ [ [ [J -.#$& & & &J --"#% % % %J -,WWWY Y Y YJ -,CCCE E E EJ -.
 
 
   J0 -
 
 
   J2  Sx3 SM'8[MRRRRj-!&') ) ) )J ,7???J
  " "W^^A!!!!!r   c                 T    || j         v rd |D             }d |D             }|dgz  }|S )Nc                 <    g | ]}|                     d           |S z-flto
startswithr   r~   s     r   r   z,libc.customize_build_cmd.<locals>.<listcomp>u  )    99911<<#8#89Q999r   c                 <    g | ]}|                     d           |S z-Or  r  s     r   r   z,libc.customize_build_cmd.<locals>.<listcomp>v  )    66611<<#5#56Q666r   r   r  r   r{   ra   s      r   r   zlibc.customize_build_cmdm  sH    4%%% :9999c66666c	eWncJr   )
r2  r3  r4  r   r   r   r  r   r   rW  rX  s   @r   r  r  
  s         
$ <;;& 	 " " " "&    GO GO GORw w wr      r   r  c                   F     e Zd Zd Zg dZ fdZd Zd Zd Z fdZ	 xZ
S )	libc_optz)r  r  r  z-DEMSCRIPTEN_OPTIMIZE_FOR_OZc                 l     t                      j        di | |                                 | _        d S r  )r?  r   r  r  r@  s     r   r   zlibc_optz.__init__  s:    EGGv//11Dr   c                 X    t          dg d          }t          dg d          }||z   S )Nr  )r  r  r  r  r  r  r  )r   	mem_filesr  s      r   r  zlibc_optz.get_libcall_files  s\     ) ) )* * *I *>>>@ @ @J z!!r   c                 X    |                                  }t          ddg          }||z   S )Nr  zmemcmp.cr  )r  r"   )r   libcall_filesr  s      r   r   zlibc_optz.get_files  s>    **,,M ,  I 9$$r   c                 T    || j         v rd |D             }d |D             }|dgz  }|S )Nc                 <    g | ]}|                     d           |S r   r  r  s     r   r   z1libc_optz.customize_build_cmd.<locals>.<listcomp>  r  r   c                 <    g | ]}|                     d           |S r  r  r  s     r   r   z1libc_optz.customize_build_cmd.<locals>.<listcomp>  r  r   r   r  r	  s      r   r   zlibc_optz.customize_build_cmd  sF    4%%%99999c66666c	eWncJr   c                     t                                                      o<t          j        dk    o,t          j         ot
          j                            d           S )Nr   rJ   )r?  r   r   SHRINK_LEVELLINKABLEr   rM   r   r   rA  s    r   r   zlibc_optz.can_use  sV     77?? K!6!!; KK&(jnn5I&J&J"JKr   )r2  r3  r4  r   r   r   r  r   r   r   rW  rX  s   @r   r  r  ~  s        	$[[[&2 2 2 2 2" " " % % %  K K K K K K K K Kr   r  c                   .     e Zd Zd ZdgZd Z fdZ xZS )libprintf_long_doublez-DEMSCRIPTEN_PRINTF_LONG_DOUBLEc                 &    t          ddg          S )Nr  z
vfprintf.cr  r  r   s    r   r   zlibprintf_long_double.get_files  s!    -." " " "r   c                 \    t                                                      ot          j        S r&   )r?  r   r   PRINTF_LONG_DOUBLEr  s    r   r   zlibprintf_long_double.can_use  s    77??<!<<r   r2  r3  r4  r   r   r   r   rW  rX  s   @r   r  r    sT        	 $-.&" " "
= = = = = = = = =r   r  c                        e Zd Zd ZdgZ fdZ fdZ fdZe fd            Z	e fd            Z
d Z fdZ xZS )	libwasm_workersr  c                 n    |                     d          | _         t                      j        di | d S Nstubr   )r>  is_stubr?  r   r@  s     r   r   zlibwasm_workers.__init__  s9    ::f%%DLEGGvr   c                     t                                                      }| j        r|dgz  }|dgz  }|dgz  }n|ddgz  }t          j        r|dgz  }| j        s|dgz  }|S )Nz-D_DEBUGz!-Wno-tautological-pointer-comparez-O0r_  -Ozr0   rD  )r?  r   r]  r   r4   r#  rE  s     r   r   zlibwasm_workers.get_cflags  s    WW!!F} 
$f 455f ffU##f 	f< #!""fMr   c                 `    t                                                      }| j        r|dz  }|S )Nz-stub)r?  r   r#  rG  s     r   r   zlibwasm_workers.get_base_name  r  r   c                 L    t                                                      dgz   S )Nr"  rI  rJ  s    r   r  zlibwasm_workers.vary_on  s    77??x''r   c                 P     t                      j        ddt          j         i|S r!  )r?  r$  r   WASM_WORKERSrO  s     r   r$  z%libwasm_workers.get_default_variation  s+    (577(RR(2G.GR6RRRr   c                 F    g }| j         rdg}nddg}t          d|          S )Nzlibrary_wasm_worker_stub.czlibrary_wasm_worker.czwasm_worker_initialize.Szsystem/lib/wasm_workerr  )r#  r"   r  s     r   r   zlibwasm_workers.get_files  sK    E| $ee
 	 "e %   r   c                 x    t                                                      ot          j         ot          j         S r&   )r?  r   r   SINGLE_FILEr3   r  s    r   r   zlibwasm_workers.can_use  s-    77??VX%9!9V(BV>VVr   )r2  r3  r4  r   r   r   r   r   r8  r  r$  r   r   rW  rX  s   @r   r  r    s        	$ (        &     ( ( ( ( ;( S S S S ;S  W W W W W W W W Wr   r  c                   0     e Zd Zd Zg dZd Z fdZ xZS )
libsockets)r  r  r  r  c                 .    t          dt                    S )Nz system/lib/libc/musl/src/networkr  )r"   r  r   s    r   r   zlibsockets.get_files  s    -   r   c                 ^    t                                                      ot          j         S r&   r?  r   r   PROXY_POSIX_SOCKETSr  s    r   r   zlibsockets.can_use  s"    77??AX%A!AAr   r  rX  s   @r   r.  r.    s`        	$XXX&  
B B B B B B B B Br   r.  c                   0     e Zd Zd ZddgZd Z fdZ xZS )libsockets_proxyr  r  c                 ,    t          j        d          gS )Nz0system/lib/websocket/websocket_to_posix_socket.cr   r   s    r   r   zlibsockets_proxy.get_files  s     !STTUUr   c                 \    t                                                      ot          j        S r&   r1  r  s    r   r   zlibsockets_proxy.can_use  s    77??=!==r   r  rX  s   @r   r4  r4    sZ        	$*+&V V V> > > > > > > > >r   r4  c                   6     e Zd Zd ZdZdgZdZd Z fdZ xZ	S )crt1r  zcrt1.cTc                     dS Nrf   r   r   s    r   r   zcrt1.get_ext      4r   c                 \    t                                                      ot          j        S r&   r?  r   r   STANDALONE_WASMr  s    r   r   zcrt1.can_use!      77??9!99r   
r2  r3  r4  r   r   r   r:   r   r   rW  rX  s   @r   r8  r8    s^        	$'j)  : : : : : : : : :r   r8  c                   6     e Zd Zd ZdZdgZdZd Z fdZ xZ	S )crt1_reactorr  zcrt1_reactor.cTc                     dS r:  r   r   s    r   r   zcrt1_reactor.get_ext,  r;  r   c                 \    t                                                      ot          j        S r&   r=  r  s    r   r   zcrt1_reactor.can_use/  r?  r   r@  rX  s   @r   rB  rB  %  s_        	$' )  : : : : : : : : :r   rB  c                   6     e Zd Zd ZdZdgZdZd Z fdZ xZ	S )crt1_proxy_mainr  zcrt1_proxy_main.cTc                     dS r:  r   r   s    r   r   zcrt1_proxy_main.get_ext:  r;  r   c                 \    t                                                      ot          j        S r&   )r?  r   r   PROXY_TO_PTHREADr  s    r   r   zcrt1_proxy_main.can_use=  s    77??:!::r   r@  rX  s   @r   rF  rF  3  s_        	$'"#)  ; ; ; ; ; ; ; ; ;r   rF  c                   <     e Zd Zd ZdgZdZdgZdZd Z fdZ	 xZ
S )crtbeginrC  r  zemscripten_tls_init.cTc                     dS r:  r   r   s    r   r   zcrtbegin.get_extI  r;  r   c                 \    t                                                      ot          j        S r&   )r?  r   r   rN  r  s    r   r   zcrtbegin.can_useL  s    77??7!77r   )r2  r3  r4  r   r   r   r   r:   r   r   rW  rX  s   @r   rK  rK  A  sf        	$<& '&')  8 8 8 8 8 8 8 8 8r   rK  c                   @     e Zd ZdZg dZdgZ fdZ fdZd Z xZ	S )	libcxxabi	libc++abi)r%  r  -D_LIBCPP_BUILDING_LIBRARYz-D_LIBCXXABI_BUILDING_LIBRARYz$-DLIBCXXABI_NON_DEMANGLING_TERMINATE
-std=c++23system/lib/libcxx/srcc                 n     t                      j        di | | xj        t          j        z  c_        d S r  )r?  r   r]  r   EXCEPTION_STACK_TRACESr@  s     r   r   zlibcxxabi.__init__\  s9    EGGv 	MMX44MMMMr   c                 Z   t                                                      }| j        s| j        s|                    d           | j        xt          j        k    r |                    d           n9t          j        k    r*|                    d           |                    d           |S )Nz-D_LIBCXXABI_HAS_NO_THREADSz-D_LIBCXXABI_NO_EXCEPTIONS-D__EMSCRIPTEN_EXCEPTIONS__z-DLIBCXXABI_SILENT_TERMINATE)	r?  r   r<  r=  ry   rp  rg  rh  ri  rE  s     r   r   zlibcxxabi.get_cflagse  s    WW!!F: 3dj 3mm1222
,:????23333   3444 	4555Mr   c                     g d}| j         xt          j        k    r |dgz  }nHxt          j        k    r |dgz  }n0xt          j        k    rnxt          j        k    rn n	 |g dz  }n	 J t          d|          S )N)zabort_message.cppzcxa_aux_runtime.cppzcxa_default_handlers.cppzcxa_demangle.cppzcxa_guard.cppzcxa_handlers.cppzcxa_virtual.cppzcxa_thread_atexit.cppzfallback_malloc.cppzstdlib_new_delete.cppzstdlib_exception.cppzstdlib_stdexcept.cppzstdlib_typeinfo.cppzprivate_typeinfo.cppzcxa_exception_js_utils.cppz__cpp_exception.Szcxa_noexception.cppzcxa_exception_emscripten.cpp)zcxa_exception_storage.cppzcxa_exception.cppzcxa_personality.cppFzsystem/lib/libcxxabi/srcr  )rp  rg  rh  ri  rj  rk  r"   )r   r!   s     r   r   zlibcxxabi.get_filess  s      I$ ,:????+,,		 :    455		!:!!!!OJOOOOOOO 
 
 
 	
		
 u'   r   )
r2  r3  r4  r   r   r   r   r   r   rW  rX  s   @r   rO  rO  P  s        	$  & &&(5 5 5 5 5    # # # # # # #r   rO  c                   2    e Zd ZdZg dZddgZdZdZg dZdS )libcxxlibc++)	r%  r  z-DLIBCXX_BUILDING_LIBCXXABI=1rQ  z(-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONSz-Wno-unqualified-std-cast-callz-Wno-unknown-warning-optionrR  r  rS  r  r  )zxlocale_zos.cppzmbsnrtowcs.cppzwcsnrtombs.cppzint128_builtins.cppzlibdispatch.cppzlocale_win32.cppzthread_win32.cppsupport.cppzcompiler_rt_shims.cppztime_zone.cppztzdb.cppztzdb_list.cppN)	r2  r3  r4  r   r   r   r   r   r   r   r   r   rZ  rZ    sO        	$  & &'=>(#'(  r   rZ  c                   R     e Zd Zd ZdZg dZdZdgZdgZ fdZ	 fdZ
 fdZ xZS )		libunwindT)r%  r  z-D_LIBUNWIND_HIDE_SYMBOLSzsystem/lib/libunwind/srcsystem/lib/libunwind/includezUnwind-wasm.cc                 :     t                      j        di | d S r  )r?  r   r@  s     r   r   zlibunwind.__init__  s&    EGGvr   c                     t                                                      o| j        t          j        t          j        fv S r&   )r?  r   rp  rg  rj  rk  r  s    r   r   zlibunwind.can_use  s-    77??Z*2H*/1Z!ZZr   c                 Z   t                                                      }|                    d           | j        s| j        s|                    d           | j        xt          j        k    r |                    d           n$t          j        k    r|                    d           |S )Nr_  z-D_LIBUNWIND_HAS_NO_THREADSz-D_LIBUNWIND_HAS_NO_EXCEPTIONSrW  )	r?  r   ry   r<  r=  rp  rg  rh  ri  rE  s     r   r   zlibunwind.get_cflags  s    WW!!F
MM*: 3dj 3mm1222
,:????67777   3444Mr   )r2  r3  r4  r   r:   r   r   r   r   r   r   r   rW  rX  s   @r   r^  r^    s        	$ HHH&&' --()    [ [ [ [ [
 
 
 
 
 
 
 
 
r   r^  c                        e Zd Zd Zg dZdZ fdZd Z fdZd Z	 fdZ
 fdZe fd	            Ze fd
            Ze fd            Z xZS )	libmalloc)r  -Wno-unused-functionr  r  Tc                    |                     d          | _        | j        dvrt          d          |                     d          | _        |                     d          | _        |                     d          | _        |                     d          p| j        p| j        | _         t                      j        di | d S )	Nr  )dlmallocemmalloczemmalloc-debugemmalloc-memvalidateemmalloc-verboseemmalloc-memvalidate-verbosemimallocnonezrmalloc must be one of "emmalloc[-debug|-memvalidate][-verbose]", "mimalloc", "dlmalloc" or "none", see settings.js
is_tracingmemvalidateverboser]  r   )	r>  r  r   rn  ro  rp  r]  r?  r   r@  s     r   r   zlibmalloc.__init__  s    **X&&DK{  e  e  e  K  L  L  Ljj..DOzz-00D::i((DLJJz**Nd.>N$,DMEGGvr   c                     | j                             dd                              dd                              dd          }t          j        dddd|                   }t          j        d	          }||gS )
Nz-memvalidate z-verbosera  
system/libz
dlmalloc.cz
emmalloc.c)rg  rh  system/lib/libc/sbrk.c)r  r   r   r    )r   malloc_baser  sbrks       r   r   zlibmalloc.get_files  s    +%%nb99AA*bQQYYZbdfggK!,L1 11  F  899DD>r   c                     t                                                      }| j        r|dgz  }| j        r|dgz  }| j        r|ddgz  }n|dgz  }| j        r|dgz  }|S )Nz-DEMMALLOC_MEMVALIDATEz-DEMMALLOC_VERBOSEz-UNDEBUGz-DDLMALLOC_DEBUGr_  z	--tracing)r?  r   ro  rp  r]  rn  rE  s     r   r   zlibmalloc.get_cflags  s    WW!!F +)**f| '%&&f} /00fff fMr   c                     d| j         z  S )Nzlib%s)r  r   s    r   r  zlibmalloc.get_base_name_prefix  s    T[  r   c                     t                                                      }| j        r| j        s| j        s|dz  }| j        r|dz  }|S )Nra  z-tracing)r?  r   r]  ro  rp  rn  rG  s     r   r   zlibmalloc.get_base_name  sX    77  ""D} T- dl 
hd 
jdKr   c                 `    t                                                      ot          j        dvS )N>   rm  rl  r?  r   r   MALLOCr  s    r   r   zlibmalloc.can_use  s$    77??L8L!LLr   c                 N    t                                                      g dz   S )N)r]  rn  ro  rp  rI  rJ  s    r   r  zlibmalloc.vary_on  s#    77??SSSSSr   c           	           t                      j        dt          j        t          j        t          j        dt          j        v dt          j        v d|S )Nro  rp  )r  r]  rn  ro  rp  r   )r?  r$  r   r|  rd  EMSCRIPTEN_TRACINGrO  s     r   r$  zlibmalloc.get_default_variation  sW    (577( _",8?28?*  	  r   c                     t                                                      }d |D             d |D             z   d |D             z   d |D             z   d |D             z   S )Nc                 J    g | ] }|d          
|d         t          dddi|!S )ro  rp  r  rg  r   r  rR  s     r   r   z(libmalloc.variations.<locals>.<listcomp>-  A    www%}I]wfklufvwT---u--wwwr   c                 J    g | ] }|d          
|d         t          dddi|!S )ro  rp  r  rh  r   r  rR  s     r   r   z(libmalloc.variations.<locals>.<listcomp>.  r  r   c                 J    g | ] }|d          
|d         t          dddi|!S )ro  rp  r  rk  r   r  rR  s     r   r   z(libmalloc.variations.<locals>.<listcomp>/  sd      D  D  DeY^_lYm  Drw  yB  sC  DTAA7A5AA  D  D  Dr   c                 J    g | ] }|d          
|d         t          dddi|!S )ro  rp  r  ri  r   r  rR  s     r   r   z(libmalloc.variations.<locals>.<listcomp>0  sD    eQVWdQenst}n~T99/9599r   c                 J    g | ] }|d          
|d         t          dddi|!S )rp  ro  r  rj  r   r  rR  s     r   r   z(libmalloc.variations.<locals>.<listcomp>1  sC    {{{%US\M]{fklyfz{T55+5u55{{{r   rT  rU  s     r   r!  zlibmalloc.variations*  s    WW!!Fww6wwwww6wwwx D  Dv  D  D  DD @v@ |{6{{{	| }r   )r2  r3  r4  r   r   r:   r   r   r   r  r   r   r8  r  r$  r!  rW  rX  s   @r   rd  rd    s;       	$kkk& 
 
 
 
 
      ! ! !    M M M M M T T T T ;T     ; } } } } ;} } } } }r   rd  c                        e Zd Zd Zg dZdZdgZdZ eddg d          Z	e	 e
j        d	          gz  Z	e	 e
j        d
          gz  Z	e	 e
j        d          gz  Z	 fdZ xZS )libmimalloc)
r  re  r  r  z-Wno-deprecated-pragmaz-DEMMALLOC_NO_STD_EXPORTSz-DMI_MALLOC_OVERRIDEz-DMI_DEBUG=0r_  z-DMI_LIBC_MUSLTsystem/lib/mimalloc/includezsystem/lib/zsystem/lib/mimalloc/srcr  )zalloc-override.czfree.czpage-queue.czstatic.c)r   r,   r)   z#system/lib/mimalloc/src/prim/prim.czsystem/lib/emmalloc.crt  c                 d    t                                                      ot          j        dk    S )Nrl  r{  r  s    r   r   zlibmimalloc.can_use^  s#    77??>J!>>r   )r2  r3  r4  r   r   r:   r   r   r.   r   r   r    r   rW  rX  s   @r   r  r  4  s        	$  &* +,( 'l	"GGG	  ) $$%JKKLL)$$%<==>>)$$%=>>??)? ? ? ? ? ? ? ? ?r   r  c                   $    e Zd Zd ZddgZdZdgZdS )libalr  r  rs  zal.cN)r2  r3  r4  r   r   r   r   r   r   r   r  r  b  s*        	$*+&'h)))r   r  c                   ~     e Zd Zd ZdZg dZddgZ fdZ fdZ fdZ	e
 fd            Ze
 fd	            Z xZS )
libGLzsystem/lib/gl)zgl.czwebgl1.czlibprocaddr.czwebgl2.cr%  r  c                 >   |                     d          | _        |                     d          | _        |                     d          | _        |                     d          | _        |                     d          | _         t                      j        di | d S )N	is_legacy	is_webgl2is_ofbis_full_es3is_enable_get_proc_addressr   )r>  r  r  r  r  r  r?  r   r@  s     r   r   zlibGL.__init__r  s    ZZ,,DNZZ,,DN**X&&DKzz-00D&,jj1M&N&ND#EGGvr   c                     t                                                      }| j        r|dz  }| j        r|dz  }| j        r|dz  }| j        r|dz  }| j        r|dz  }|S )Nz-emuz-webgl2z-ofbz	-full_es3z-getprocaddr)r?  r   r  r  r  r  r  rG  s     r   r   zlibGL.get_base_namez  s    77  ""D~ 
fnd~ 
id{ 
fnd 
kd& 
ndKr   c                     t                                                      }| j        r|dgz  }|d| j        rdnd gz  }| j        r|dgz  }| j        r|dgz  }| j        r|dgz  }|S )Nz-DLEGACY_GL_EMULATION=1z-DMAX_WEBGL_VERSION=r   r   z&-D__EMSCRIPTEN_OFFSCREEN_FRAMEBUFFER__z-D__EMSCRIPTEN_FULL_ES3__z-DGL_ENABLE_GET_PROC_ADDRESS=1)r?  r   r  r  r  r  r  rE  s     r   r   zlibGL.get_cflags  s    WW!!F~ ,*++f
B4>&@aaqBBCCF{ ;9::f .,--f& 3122fMr   c                 N    t                                                      g dz   S )Nr  r  r  r  r  rI  rJ  s    r   r  zlibGL.vary_on  s#    77??pppppr   c           	           t                      j        dt          j        t          j        dk    t          j        t          j        t          j        d|S )Nr   r  r   )r?  r$  r   LEGACY_GL_EMULATIONMAX_WEBGL_VERSIONOFFSCREEN_FRAMEBUFFERFULL_ES3GL_ENABLE_GET_PROC_ADDRESSrO  s     r   r$  zlibGL.get_default_variation  sU    (577( ,*a/+#!)!D  	  r   )r2  r3  r4  r   r   r   r   r   r   r   r8  r  r$  rW  rX  s   @r   r  r  j  s        	$'???)*+&             q q q q ;q     ;    r   r  c                   t     e Zd Zd ZdZ fdZ fdZe fd            Z fdZ	d Z
e fd            Z xZS )	libembindTc                 p    |                     dd          | _         t                      j        di | d S )N	with_rttiFr   )r>  r  r?  r   r@  s     r   r   zlibembind.__init__  s;    ZZU33DNEGGvr   c                     t                                                      }|                    d           | j        s|ddgz  }|S )Nz
-std=c++20z	-fno-rttiz%-DEMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0)r?  r   ry   r  rE  s     r   r   zlibembind.get_cflags  sJ    WW!!F
MM,> GEFFfMr   c                 L    t                                                      dgz   S )Nr  rI  rJ  s    r   r  zlibembind.vary_on  s    77??},,r   c                 `    t                                                      }| j        r|dz  }|S )Nz-rtti)r?  r   r  rG  s     r   r   zlibembind.get_base_name  s0    77  ""D~ 
godKr   c                 ,    t          j        d          gS )Nzsystem/lib/embind/bind.cppr   r   s    r   r   zlibembind.get_files  s     !=>>??r   c                 N     t                      j        ddt          j        i|S )Nr  r   )r?  r$  r   USE_RTTIrO  s     r   r$  zlibembind.get_default_variation  s(    (577(OO83DOOOOr   )r2  r3  r4  r   r7  r   r   r8  r  r   r   r$  rW  rX  s   @r   r  r    s        	$+         - - - - ;-    @ @ @ P P P P ;P P P P Pr   r  c                   "    e Zd Zd ZdZdgZd ZdS )libfetchTr  c                 ,    t          j        d          gS )Nz#system/lib/fetch/emscripten_fetch.cr   r   s    r   r   zlibfetch.get_files  s     !FGGHHr   Nr2  r3  r4  r   r7  r   r   r   r   r   r  r    s:        	$+ (I I I I Ir   r  c                   "    e Zd Zd ZdZdgZd ZdS )libstb_imageTthird_partyc                 ,    t          j        d          gS )Nzsystem/lib/stb_image.cr   r   s    r   r   zlibstb_image.get_files  s     !9::;;r   Nr  r   r   r   r  r    s4        	$+_(< < < < <r   r  c                        e Zd Zd ZddgZddgZ fdZ fdZ fdZe	 fd            Z
e	 fd	            Zd
 Zd Z xZS )	libwasmfsrs  
-std=c++17system/lib/wasmfsr  c                 n    |                     d          | _         t                      j        di | d S Nignore_caser   )r>  r  r?  r   r@  s     r   r   zlibwasmfs.__init__  s:    zz-00DEGGvr   c                 b    t                                                      }| j        r|dgz  }|S )Nz-DWASMFS_CASE_INSENSITIVE)r?  r   r  rE  s     r   r   zlibwasmfs.get_cflags  s6    WW!!F .,--fMr   c                 `    t                                                      }| j        r|dz  }|S )Nz-icase)r?  r   r  rG  s     r   r   zlibwasmfs.get_base_name  s2    77  ""D 
hdKr   c                 L    t                                                      dgz   S )Nr  rI  rJ  s    r   r  zlibwasmfs.vary_on  s    77??..r   c                 N     t                      j        ddt          j        i|S r  )r?  r$  r   CASE_INSENSITIVE_FSrO  s     r   r$  zlibwasmfs.get_default_variation  s)    (577(\\X5Q\U[\\\r   c                 T    t          dg d          }|t          dg d          z   S )Nsystem/lib/wasmfs/backends)zfetch_backend.cppzignore_case_backend.cppzjs_file_backend.cppzmemory_backend.cppznode_backend.cppzopfs_backend.cppr  r  )	zfile.cppzfile_table.cppz
js_api.cppzemscripten.cppz	paths.cppzspecial_files.cppr\  zsyscalls.cppz
wasmfs.cppr  )r   backendss     r   r   zlibwasmfs.get_files  sZ    )' ' '( ( (H m ! ! !
" 
" 
" 
" 
"r   c                     t           j        S r&   )r   WASMFSr   s    r   r   zlibwasmfs.can_use  s
    ?r   )r2  r3  r4  r   r   r   r   r   r   r8  r  r$  r   r   rW  rX  s   @r   r  r    s        	$|,&!#78(             / / / / ;/ ] ] ] ] ;]" " "*      r   r  c                   "    e Zd Zd ZdZdgZd ZdS )libwasmfs_no_fsr  zno_fs.cc                 4    t           j        ot           j         S r&   )r   r  FORCE_FILESYSTEMr   s    r   r   zlibwasmfs_no_fs.can_use  s    ?<8#<<<r   N)r2  r3  r4  r   r   r   r   r   r   r   r  r    s4        	$'k)= = = = =r   r  c                   ,    e Zd Zd ZddgZdgZd Zd ZdS )libwasmfs_noderawfsrs  r  r  c                 &    t          ddg          S )Nr  znoderawfs_root.cppr  r  r   s    r   r   zlibwasmfs_noderawfs.get_files%  s"    )'(* * * *r   c                 2    t           j        ot           j        S r&   )r   r  	NODERAWFSr   s    r   r   zlibwasmfs_noderawfs.can_use*  s    ?1x11r   N)r2  r3  r4  r   r   r   r   r   r   r   r   r  r    sI        	$|,&!"(* * *
2 2 2 2 2r   r  c                   (    e Zd Zd ZdgZddgZdZdZdS )libhtml5r  r%  r  zsystem/lib/html5r  N)r2  r3  r4  r   r   r   r   r   r   r   r   r  r  .  s0        	$ (*+&'(((r   r  c                       e Zd ZdgZdZdS )CompilerRTLibraryr  TN)r2  r3  r4  r   r:   r   r   r   r  r  7  s         & r   r  c                   &    e Zd Zd ZdZdgZdZdgZdS )libubsan_minimal_rtTsystem/lib/compiler-rt/libz(system/lib/compiler-rt/lib/ubsan_minimalzubsan_minimal_handlers.cppN)r2  r3  r4  r   r7  r   r   r   r   r   r   r  r  >  s-        	$+*+(6'+,)))r   r  c                   4    e Zd Zd ZddgZdZddgZdZdZdgZ	d	S )
libsanitizer_common_rtr  r  Tz-D_LARGEFILE64_SOURCEz-Wno-formatz+system/lib/compiler-rt/lib/sanitizer_commonr  zsanitizer_common_nolibc.cppN)
r2  r3  r4  r   r   r7  r   r   r   r   r   r   r   r  r  G  sK        	!$*!(+
 & :'(34r   r  c                       e Zd ZdZdgZdZdS )SanitizerLibraryTr  r  N)r2  r3  r4  r7  r   r   r   r   r   r  r  Z  s         +*+((((r   r  c                   (    e Zd Zd ZdgZdgZdZdgZdS )libubsan_rtr  z-DUBSAN_CAN_USE_CXXABIz system/lib/compiler-rt/lib/ubsanzubsan_diag_standalone.cppN)r2  r3  r4  r   r   r   r   r   r   r   r   r  r  a  s3        	$ ($%&.'12r   r  c                       e Zd Zd ZdZdZdS )liblsan_common_rtsystem/lib/compiler-rt/lib/lsanzlsan_common*.cppN)r2  r3  r4  r   r   r   r   r   r   r  r  j  s        	$-'(((r   r  c                   $    e Zd Zd ZdgZdZg dZdS )
liblsan_rtr  r  )zlsan_common.cppzlsan_common_mac.cppzlsan_common_linux.cppzlsan_common_emscripten.cppN)r2  r3  r4  r   r   r   r   r   r   r   r  r  q  s4        	$ (-'4 4 4r   r  c                       e Zd Zd ZdgZdZdS )
libasan_rtr  zsystem/lib/compiler-rt/lib/asanN)r2  r3  r4  r   r   r   r   r   r   r  r  z  s         	$ (-'''r   r  c                        e Zd Zd ZdZg dZdZ fdZ fdZ fdZ	e
 fd            Ze
 fd            Zd	 Z fd
Z xZS )libstandalonewasmTr  rs  c                     |                     d          | _        |                     d          | _        |                     d          | _         t	                      j        di | d S )Nis_mem_growis_purenocatchr   )r>  r  r  r  r?  r   r@  s     r   r   zlibstandalonewasm.__init__  s`    zz-00D::i((DL::i((DLEGGvr   c                     t                                                      }| j        r|dz  }| j        r|dz  }| j        r|dz  }|S )Nz-nocatchz-memgrowz-pure)r?  r   r  r  r  rG  s     r   r   zlibstandalonewasm.get_base_name  sY    77  ""D| 
jd 
jd| 
godKr   c                     t                                                      }|ddgz  }| j        r|dgz  }| j        r|dgz  }| j        r|                    d           |S )Nr_  z-DEMSCRIPTEN_STANDALONE_WASMz-DEMSCRIPTEN_MEMORY_GROWTHz-DEMSCRIPTEN_PURE_WASIz-DEMSCRIPTEN_NOCATCH)r?  r   r  r  r  ry   rE  s     r   r   zlibstandalonewasm.get_cflags  s{    WW!!F
z9::F /-..f| +)**f| ,mm*+++Mr   c                 N    t                                                      g dz   S )Nr  r  r  rI  rJ  s    r   r  zlibstandalonewasm.vary_on  s#    77??DDDDDr   c                      t                      j        dt          j        t          j        pt          j        t          j        ot          j         d|S )Nr  r   )r?  r$  r   ALLOW_MEMORY_GROWTH	PURE_WASIGROWABLE_ARRAYBUFFERSr  r  rO  s     r   r$  z'libstandalonewasm.get_default_variation  sW    (577( . BH$B1R(:R6R  		  r   c                     t          dg d          }|t          dg d          z  }|t          dddg          z  }|S )	Nzsystem/lib/standalone)zstandalone.czstandalone_wasm_stdio.cz__main_void.cr  r  )	z__secs_to_tm.cr  zgettimeofday.czlocaltime_r.cz
gmtime_r.cr  z
strptime.cztimegm.cztime.cr  zassert.czexit.cr  r  s     r   r   zlibstandalonewasm.get_files  s    $$ $ $% % %E 
],  
 
 
 
E 
],x(* * * *E Lr   c                 \    t                                                      ot          j        S r&   r=  r  s    r   r   zlibstandalonewasm.can_use  r?  r   )r2  r3  r4  r   r:   r   r   r   r   r   r8  r  r$  r   r   rW  rX  s   @r   r  r    s        	$;;;&'        	 	 	 	 	 E E E E ;E     ;  2: : : : : : : : :r   r  c                   4     e Zd Zd ZddgZdZdgZ fdZ xZS )	libjsmathr  r  rs  zjsmath.cc                 \    t                                                      ot          j        S r&   )r?  r   r   JS_MATHr  s    r   r   zlibjsmath.can_use  s    77??1!11r   )	r2  r3  r4  r   r   r   r   r   rW  rX  s   @r   r  r    sT        	$*+&'l)2 2 2 2 2 2 2 2 2r   r  c                   $    e Zd Zd ZdZdgZddgZdS )libstubsr  r  zemscripten_syscall_stubs.czemscripten_libc_stubs.cN)r2  r3  r4  r   r   r   r   r   r   r   r  r    s+        	$'01(+-FG)))r   r  c                 (  	
 g | j         rS t                      t                                          
g t          j                            d          }t          j                            d          }|rt          j        dd           |dk    rd 
	                                D             n||
                    d          rt                              d            d,
fd
	| j        sjt          j        r d           t          j        sGt          j        r$t          j        r d           n# d           nt          j        r d           t          j        rS 
fd}| j        r |             S t          j        pt          j        pt          j        		fd}|r! d            |              |             S t          j        r! d            d            d           t          j        r d           t          j        r d           t          j        dk    r6t          j        s*t          j                            d          s d           t          j        r d           t          j        r d           | j        syt          j        s d            d           t          j         dk    r, d           t          j        rtC          j"        d           nt          j         d k    r d!            d           t          j#        r d"           t          j#        s	r" d#           t          j$        r d$           t          j%        r d%           n d&           t          j&        r%t          j'        st          j(        s d'd()           t          j)        r"t          j*        s d*            d+            |              |             S )-NrJ   rK   
deprecatedz\EMCC_ONLY_FORCED_STDLIBS is deprecated.  Use `-nostdlib` to avoid linking standard librariesr   c                 &    g | ]\  }}|j         |S r   )r7  )r   r   r   s      r   r   z$get_libs_to_link.<locals>.<listcomp>  s#    ZZZidC#/ZTZZZr   ,zforcing stdlibs: Fc                 j   |          }|j         v rd S                     |j                    t                              d|j         d|                                d           |j         v o|                                dk    }                    |                                |p|f           d S )Nz
including z ()rg   )r   r   rX   debugr   r   ry   r   )ro   whole_archiver   need_whole_archivealready_includedforce_includelibs_to_linksystem_libs_maps       r   add_libraryz%get_libs_to_link.<locals>.add_library	  s    
'
"C
x###f"""
LLL#2B2B2D2D2D2DEFFF]2Ls{{}}7L**,,m.Q?QRSSSSSr   rK  r8  rB  rF  c                  Z    D ]&} | vrt          j        d|             |            'd S )Nzinvalid forced library: %s)r   exit_with_error)forcedr  r   r  s    r   add_forced_libsz)get_libs_to_link.<locals>.add_forced_libs"	  sN      		&	&:FCCCk& r   c                     t           j        r!                    d             d           n,t           j        r                     d             d           t           j        dk    r  d           nt           j        dk    r  d           t           j        st           j        r  d           r  d           d S d S )	Nr  r  r   r  r   r  r  r  )r   r  ry   USE_LSANUBSAN_RUNTIME)r  r   sanitizes   r   add_sanitizer_libsz,get_libs_to_link.<locals>.add_sanitizer_libs.	  s      <(((k,		  <(((k,""k'((((		1	$	$k-    'H- 'k%&&& ,k*+++++, ,r   r  r  r  r  r  r  r   r  r  r  r  r  rl  r  z2mimalloc is not compatible with -fsanitize=addressrm  rd  r[  rP  r^  r4  r.  r  T)r  r  r  r1  )+nostdlibr   r   r0  r   rM   r   r
   warningr   splitrX   r  nostartfilesr   rN  SIDE_MODULEr>  EXPECT_MAINrI  nodefaultlibsr	  r  r
  AUTO_NATIVE_LIBRARIESr  r  r  r  ALLOW_UNIMPLEMENTED_SYSCALLSnolibcEXIT_RUNTIMEr|  r   r  LINK_AS_CXXr  r2  r)  r,  r3   r  r  )optionsr   only_forcedr  r  r  r  r   r  r  r  s        @@@@@@r   get_libs_to_linkr    s*   , UU1133/ -
*..-
.
.%
 
9::+ F   'E  F  F  F
c\\ZZ?+@+@+B+BZZZMMKK$$M 6
LL4]44555	T 	T 	T 	T 	T 	T 	T 	T 	T 
	 ' k* '		! ' 	&
+f




+n
%
%
%
%$ '%&&& 
        OM("3Mx7M(, , , , , , ,&  K !!!O# KKK
  K   )K'(((a(9	,	-	-  K %K#$$$* K
	 
  k+K*$$k-   		 TRSSS	F	"	"k++ K X K k+! K"####K 7H$8 7AU 7 K!6666_  $ %k#$$$K/	r   c                 H   t          |           }t          j        st          j        rd |D             S g }d}|D ]P\  }}|r|s|                    d           d}|r|s|                    d           d}|                    |           Q|r|                    d           |S )Nc                     g | ]
}|d          S )r   r   )r   ls     r   r   zcalculate.<locals>.<listcomp>	  s    '''QAaD'''r   Fz--whole-archiveTz--no-whole-archive)r  r   r  r  ry   )r  r  retin_groupr   r  s         r   	calculater!  	  s    !'**,
  ((. ('','''' 	#(".  d ( 	jj"###h * 	jj%&&&hJJt %JJ#$$$	*r   c                    t          j        |d           t          j        |           D ]}|r
|j        |v rt           j                            | |j                  }t           j                            ||j                  }|                                rt          |||           ~t          j	        ||           d S )NT)exist_ok)
r   makedirsscandirr   r   r   is_dirsafe_copytreer   	safe_copy)r   dstr)   entrysrcnamedstnames         r   r'  r'  	  s     +cD!!!!z# ( (e EJ(**gll3
++Ggll3
++G||~~ (GWh////ogw''''( (r   c                    dddddddddd	}t          j                    }|                                D ]L\  }}t          j        |          }t
          j                            ||          }t          ||dh           Mt          j        d          }t          j	        d          }t          ||           t          j        d          }t          j	        d	          }t          ||           t          j        d
          }	t          j
        |	t          j        dt          j         dt          j         dt          j         d                     t          j
        | d           | S )Nrr  zc++/v1)	zsystem/includer  r_  z!system/lib/libc/musl/arch/genericz$system/lib/libc/musl/arch/emscriptenr  zsystem/lib/libcxx/includezsystem/lib/libcxxabi/includer  zalltypes.h.inr  zsystem/lib/pkgconfigzlib/pkgconfigz
system/binbinzemscripten/version.hzW  /* Automatically generated by tools/system_libs.py */
  #define __EMSCRIPTEN_major__ z 
  #define __EMSCRIPTEN_minor__ z
  #define __EMSCRIPTEN_tiny__ z
  x)r	   get_include_dirr   r   r    r   r   r   r'  get_sysroot_dirr   textwrapdedentEMSCRIPTEN_VERSION_MAJOREMSCRIPTEN_VERSION_MINOREMSCRIPTEN_VERSION_TINY)
stampinstall_dirstarget_include_dirr   destpkgconfig_srcpkgconfig_destbin_srcbin_destversion_files
             r   install_system_headersr@  	  s   &($&)+ -/$&!)$,#% , ,..%%'' 9 9ic4

s
#
#C7<<*D11D#t&788888&'=>>-(99.~... ..'"5))(""" &'=>>,< 2 % >2 2 !& >2 2  %<	2 2 2 " "    5#	,r   c                  >    t          j        dt          d           d S )Nzsysroot_install.stampzsystem headers)what)r	   r   r@  r   r   r   rV   rV   	  s"    )#%;BRSSSSSSr   c                      t           sJ t                      } t          j                            |           r.t          t          j                            |                      d S d S r&   )r   rt   r   r   r   r|   r   )top_level_ninjas    r   build_deferredrE  	  sZ    	,../W^^O$$ 0bgooo../////0 0r   )r   )FTr&   )NN)br  loggingr   r   r   rk   r   r2  enumr   r   globr   r   rr  r   r	   r
   r   r   r   toolchain_profilerr   r   	getLoggerrX   r  r   rM   r   r   r8   r"   r.   r?   rC   rQ   r]   rb   rq   rt   r|   r   r   r   r   r:  rZ  rg  rm  r  r  r  r  r  r  r  r  r  r  r.  r4  r8  rB  rF  rK  rO  rZ  r^  rd  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r'  r@  profilerV   rE  r   r   r   <module>rL     s        				 				                            9 9 9 9 9 9 9 9 9 9 9 9 9 9       1 1 1 1 1 1      		=	)	)D D D C
/5566	 + 6 6 6
I I I I   2! ! !  "M M M M  6) ) ) 6 6 6* * *  * * *ce ce ce ceLc" c" c" c" c" c" c" c"L'S 'S 'S 'S 'S 'S 'S 'STQ Q Q Q Q7 Q Q Q4       $3D 3D 3D 3D 3Dw 3D 3D 3Dl3D 3D 3D 3D 3D' 3D 3D 3Dl    '    N N N N Ng N N N65	 5	 5	 5	 5	Y 5	 5	 5	p! ! ! ! ! ! ! !    |4i   8n n n n n"n n nh2K 2K 2K 2K 2K 2K 2K 2Kj
= 
= 
= 
= 
=D 
= 
= 
=:W :W :W :W :Wl :W :W :WzB B B B B$i B B B	> 	> 	> 	> 	>y 	> 	> 	>: : : : : : : :: : : : :& : : :; ; ; ; ;) ; ; ;8 8 8 8 8" 8 8 8F F F F F )\ F F FR% % % % %y, % % %P     )   BO} O} O} O} O}	 O} O} O}d+? +? +? +? +?) +? +? +?\    G   8 8 8 8 8I 8 8 8vP P P P P	 P P PBI I I I Iy I I I< < < < <7 < < <5 5 5 5 55y 5 5 5v= = = = =g = = =2 2 2 2 2' 2 2 2     w          - - - - -+Y - - -5 5 5 5 5.	 5 5 5&    ()   3 3 3 3 3" 3 3 3         (      4 4 4 4 4! 4 4 4. . . . .! . . .J: J: J: J: J:+ J: J: J:Z2 2 2 2 2 2 2 2H H H H H| H H Hb b bJ  6( ( ( (&, , ,^ T T T0 0 0 0 0r   