
    eCiY                     z   U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZ d dlmZ g Zi Zeeef         ed<    e            Z i Z!ej"        #                    ej"        $                    e%                    Z& ej'        d	          Z(d
 Z)d Z*d Z+d Z,d Z-d Z.d*dZ/d Z0 ej1                    d             Z2d Z3d Z4d Z5 G d d          Z6 G d d          Z7d Z8d+dZ9d Z:d Z;d Z<d  Z=d! Z>d*d"Z?d+d#Z@d$ ZAd% ZBd& ZCd' ZDd( ZEd) ZF e2             dS ),    N)	signature)Path)urlopen)cacheconfigsharedsystem_libsutils)settings)ToolchainProfilerports_by_nameportsc                 f    t           |          }|j        rt          |           t           |          S |S N)r   is_externalload_external_portnameports     8/b/s/w/ir/x/w/install/emscripten/tools/ports/__init__.pyget_port_by_namer   %   s5    	t	$	 tK    c                    t                               |           |                     d          |_        t	          |d          |_        | |_        |t          |j        <   |j        rt          | |           d S t          | |           d S )Ncontrib.EXTERNAL_PORT)
r   append
startswith
is_contribhasattrr   r   r   init_external_portinit_local_portr   s     r   	init_portr"   .   s    ,,tOOJ//$/T?33$$)!-		  tT"""""D$r   c                 D    t          d          s fd_        nj         fd_        t          d          sd _        t          d          sd _        t          d          sg _        t          d	          sd
 _        t          d          si _        t          d          s
fd_        j                                        D ]6\  }}|t          v rt          j        d|z             j        |ft          |<   7t                     d S )Nneededc                     t           v S r   ports_neededsr   s    r   <lambda>z!init_local_port.<locals>.<lambda><   s    DL0 r   c                 ,     |           pt           v S r   r&   )r)   r   r$   s    r   r*   z!init_local_port.<locals>.<lambda>?   s    FF1II=)= r   process_dependenciesc                     dS Nr    xs    r   r*   z!init_local_port.<locals>.<lambda>A   s    ! r   linker_setupc                     dS r.   r/   )r1   ys     r   r*   z!init_local_port.<locals>.<lambda>C   s    Q r   depsprocess_argsc                     g S r   r/   r0   s    r   r*   z!init_local_port.<locals>.<lambda>G   s    " r   variantsshowc                  8     j          d j          d j         dS Nz (--use-port=z; )r   LICENSEr   s   r   r*   z!init_local_port.<locals>.<lambda>L   s&    49OO49OOOOO r   zduplicate port variant: `%s`)r   r$   r,   r2   r5   r6   r8   r9   itemsport_variantsr
   exit_with_errorr   validate_port)r   r   variantextra_settingsr$   s   ``  @r   r!   r!   :   sY   	x	 	  >0000DKK[F=====DK	-	.	. , +D	~	&	& '&D	v		 DI	~	&	& %$D	z	"	" DM	v		 POOOODI!%!4!4!6!6 9 9g~-:WDEEE"i8M'r   c                     t           j                            | |          }t           j                            |          }|j                            |           |S r   )	importlibutilspec_from_file_locationmodule_from_specloaderexec_module)module_name	port_filespecr   s       r   load_port_modulerP   V   sI    		/	/Y	G	G$		(	(	.	.$+$	+r   c           	         | j         }t                              || j        | j                  }t
          j                            t                                          || j	                  }t          d| |          }t                              |            dD ]1}t          ||          st          ||t          | |                     2t!          ||           |st                              |           d S d S )Nztools.ports.external.URLDESCRIPTIONr>   )r   Portsfetch_port_artifactr   SHA512ospathjoinget_dir	PORT_FILErP   r   remover   setattrgetattrr"   clear_project_build)external_portr   
up_to_daterN   
local_portas         r   r   r   ]   s    		$((}/JML`aa*gll5==??D-2IJJ) > > >	JJ*,,}, 8 8a:q!! 8j!W]A66777D*	 $	d#####$ $r   c                      g d}|D ]"}t          |          sJ dd|            # fd_        fd_        d S )N)rW   r\   rS   rT   r>   port  is missing c                     t           v S r   r&   r(   s    r   r*   z$init_external_port.<locals>.<lambda>o   s    $,. r   c                  8     j          d j          d j         dS r;   r=   r?   s   r   r*   z$init_external_port.<locals>.<lambda>p   s&    MMMMdlMMM r   )r   r$   r9   )r   r   expected_attrsrd   s   ``  r   r    r    k   ss    KKK. A Aa4@@@aa@@@@....$+MMMM$)))r   c                     |st          j        |           }|t          v rt          j        d|  d| d           t	          d| |           }t          ||           |S )Nzport path [`z$`] is invalid: duplicate port name ``ztools.ports.)r
   unsuffixed_basenamer   rB   rP   r"   )rY   r   r   s      r   	load_portrn   s   sx    	 +$T**D	]	ZZZSWZZZ[[[	///	6	6$D$	+r   c                     g d}| j         r|g dz  }t          | d          r|dgz  }|D ]"}t          | |          sJ d| d|            #d S )N)getclearr9   rR   handle_optionsOPTIONSrf   rg   )r   r   )r   rj   rd   s      r   rC   rC   }   s    +++.	_ 87777NT#$$ "yk!N A Aa4@@@aa@@@@A Ar   c                     t          j        t                    D ]P} |                     d          r| dk    rt	          t           j                            t          |                      Qt           j                            t          d          }t          j        |          D ]c} |                     d          r| dk    rdt          j        |           z   }t	          t           j                            ||           |           dd S )N.pyz__init__.pycontribr   )	rX   listdir	ports_direndswithrn   rY   rZ   r
   
unsuffixed)filenamecontrib_dirr   s      r   
read_portsr}      s    *Y'' 1 1hU## x='@'@bgll9h//0000Y	22+*[)) 9 9hU## x='@'@(222Dbgll;1148888	9 9r   c              #      K   t          j        |           D ]-\  }}}|D ]$}t           j                            ||          V  %.d S r   )rX   walkrY   rZ   )dirnamerY   _filesr   s        r   get_all_files_underr      sb      (( % %ndAu % %GLLt$$$$$$%% %r   c                    t           j                            |           sJ t           j                            |          sJ d t          |           D             }d t          |          D             }t	          |d           }t	          |d           }t          j        dg|R   t          j        dg|R   |d         |d         k    S )	Nc              3   X   K   | ]%}|t           j                            |          fV  &d S r   rX   rY   getmtime.0r1   s     r   	<genexpr>zdir_is_newer.<locals>.<genexpr>   7      JJ!a!!!$$%JJJJJJr   c              3   X   K   | ]%}|t           j                            |          fV  &d S r   r   r   s     r   r   zdir_is_newer.<locals>.<genexpr>   r   r   c                     | d         S N   r/   fs    r   r*   zdir_is_newer.<locals>.<lambda>   
    ! r   keyc                     | d         S r   r/   r   s    r   r*   zdir_is_newer.<locals>.<lambda>   r   r   znewest_a: %s %sznewest_b: %s %sr   )rX   rY   existsr   maxloggerdebug)dir_adir_bfiles_afiles_bnewest_anewest_bs         r   dir_is_newerr      s    								JJ/B5/I/IJJJ'JJ/B5/I/IJJJ'nn---(nn---(, ,8,,,,, ,8,,,,	!x{	""r   c                     t           j                            |          r,t          j        |           t          j        |          k    rdS t          j        | |           dS )aB  Just like shutil.copyfile, but will do nothing if the destination already
  exists and has the same contents as the source.

  In the case where a library is built in multiple different configurations,
  we want to avoids racing between processes that are reading headers (without
  holding the cache lock) (e.g. normal compile steps) and a process that is
  building/installing a new flavor of a given library.  In this case the
  headers will be "re-installed" but we skip the actual filesystem mods
  to avoid racing with other processes that might be reading these files.
  N)rX   rY   r   r
   read_binaryshutilcopyfile)srcdests     r   
maybe_copyr      sW     W^^D e/448I$8O8OOO
F/#tr   c                   r   e Zd ZU dZed             Zedd            Zed             Zedd            Zeg g g g g g fd            Z	ed	             Z
ed
             Zed             Z e            Zee         ed<   edd            Zedd            Zed             Zed             Zed             ZdS )rU   zMemscripten-ports library management (https://github.com/emscripten-ports).
  c                  J    t          j        |  }t          j        |           |S r   )r   get_include_dirr
   safe_ensure_dirspartsr   s     r   r   zPorts.get_include_dir   s%    #U+G	7###Nr   Nc                     |st           j                            |           }t                              |          }t
                              d|            t          j        | |dt                     dS )zDLike install_headers but recursively copied all files in a directoryzinstalling headers: T)dirs_exist_okcopy_functionN)
rX   rY   basenamerU   r   r   r   r   copytreer   )src_dirtargetr   s      r   install_header_dirzPorts.install_header_dir   sn      )w((f  ((D
LL...///
OGTZPPPPPPr   c                 .   t          j                    }t          j                            |t          j                            |                    }t          j        |d           t          | t          j                            ||                     d S )NTexist_ok)r   get_sysroot_dirrX   rY   rZ   r   makedirsr   )r{   r   sysroot
target_dirs       r   install_filezPorts.install_file   sn    #%%Ggrwv'>'>??JK
T****xgv6677777r   *.hc           
         t                               d           t                                          }t          j                            |          sJ |r4t          j                            ||          }t          j	        |           t          j
        t          j                            | |                    }|sJ d|              |D ]}t                               dt          j                            |t          j                            |                    z              t          |t          j                            |t          j                            |                               d S )Ninstall_headerszno headers found to install in zinstalling: )r   r   rU   r   rX   rY   r   rZ   r
   r   globr   r   )r   patternr   r   matchesr   s         r   r   zPorts.install_headers   s,   
LL"###  ""D7>>$ #W\\$''dT"""iWg6677G???g????7 = =ll>BGLLrw7G7G7J7J$K$KKLLLBGLLrw'7'7':':;;<<<<= =r   c	           	      H    t          t          |                              t          t          j        d                    dz                      }	|	                    t          j        d                              dd                              dd          }	t          j        	                    t                                          ||	          }
t                              d| d| d	|
            |r fd
|D             }ng }t          j                   D ]\  }}}|D ]}||v r|                    |           |D ]ht!          j                  }|dv rNt%          fd|D                       s3|                    t          j        	                    |                     it)          j        |
          dd z   gz   |z   }|D ]}|                    d|z              t(          j        rt          j        |
d           t          j        	                    |
d          }t)          j                     t)          j        ||||           t          j        d          st)          j        |
           n!g }g }|D ]}t          j                            |           }t          j        	                    |
|          dz   }t          j                            |          }t          j        |d           t<          j        d|d|g|z   }t!          j        |          dv rt<          j         |d<   ||z  }|                    |           |                    |           t)          j!        |tE          |                     t)          j#        ||           |S )NTlibr   z.a z-emscriptenzbuild_port:  z in c                 P    g | ]"}t           j                            |          #S r/   )rX   rY   rZ   )r   r)   r   s     r   
<listcomp>z$Ports.build_port.<locals>.<listcomp>   s)    5551bgll7A&&555r   )z.c.cppc              3       K   | ]}|v V  	d S r   r/   )r   excludedr   s     r   r   z#Ports.build_port.<locals>.<genexpr>   s'      .].]8A.].].].].].]r   z-O2-Ir   zbuild.ninja)cflagsEMBUILDER_PORT_BUILD_DEFERREDz.oz-cz-o)z.ccz.cxxr   r   )
num_inputs)$strr   relative_tor   get_sysrootreplacerX   seprY   rZ   rU   get_build_dirr   r   r   r]   r
   suffixanyr   r	   get_base_cflags	USE_NINJAr   ensure_sysrootcreate_ninja_filegetenv	run_ninjarelpathr   r   EMCCEMXXrun_build_commandslen
create_lib)r   output_path	port_nameincludesflagscxxflagsexclude_filesexclude_dirssrcsmangled_name	build_dirrootdirsr   exextr   include
ninja_filecommandsobjectsr   r   objr   cmdr   s   `                         @r   
build_portzPorts.build_port   s   tK((44T%:KD:Q:Q5R5RUZ5Z[[\\L''44<<T2FFNN}^`aaLU0022I|LLI
LLH	HHKHHYHHIII /5555555ddd!ww// / /
$e 	 	B4ZZKKOOO 	/ 	/AQ#N""3.].].].]}.].].]+]+]"KKT1--...	/
 (33udWn6MMPUUF $ $mmD7N#### 3k)d++++7<<	=99j """#D*k&QQQQY677 )i(((hg 
 
#'//#w//gll9g..5'//#&&
Gd++++{D#tS1F:< 777;#a&
/#s$X#d))DDDD['222r   c                  p    t          j        j        t          j        g| R  }t          j        |           |S r   )rX   rY   rZ   r   PORTSr
   r   r   s     r   r[   zPorts.get_dir  s3    gl6<0%000G	7###Nr   c                  `    t                                           } t          j        |            d S r   )rU   r[   r
   
delete_dir)r   s    r   erasezPorts.erase  s&    mmooG	Wr   c                  (    t          j                    S r   )r	   r   r/   r   r   r   zPorts.get_build_dir  s    $&&&r   
name_cachec                     t                                           t           j        vrZt                              d             t                              d d           t           j                                        t          j                            d          }|rt          	                    d|z             d |
                    d          D             }|D ]\  }} |k    rt                                         }|st          j        d z             t          |d	          st          j        d
  d           |j        }t          j                            |          }d  d| d d| d| d}	t          j                            |          r-t'          ||          rt          	                    |	            dS t)          j        d          5  t          j                            |          r9t'          ||          s)t          	                    |	           	 ddd            dS t          	                    d  d| d d| d	           t          j                   t/          j        ||           	 ddd            dS # 1 swxY w Y   Ɖ                    d          d         }
|

                    dd          d         }dz   |z    fd}t          j                            d           fd}fd} |            rdS t)          j                     t)          j        d          5  t          j                                      rZ |            r	 ddd           dS t          	                    d            t          j                   t          j                    |              |             	 ddd           dS # 1 swxY w Y   dS )!zaThis function only fetches the port and returns True when the port is up to date, False otherwisezincluding port: z    (at r<   EMCC_LOCAL_PORTSzusing local ports: %sc                 :    g | ]}|                     d d          S )=r   )split)r   pairs     r   r   z-Ports.fetch_port_artifact.<locals>.<listcomp>>  s&    KKKDTZZQ''KKKr   ,z%s is not a known portSUBDIRrf   zY lacks .SUBDIR attribute, which we need in order to override it locally, please update itznot grabbing local port:  from z to z
 (subdir: z) as the destination z7 is newer (run emcc --clear-ports if that is incorrect)Tzunpack local portNzgrabbing local port: F/.r   c                     t                               d d            t          j        rt	          j        ddg          } n#t                    }|                                } rDt          j	        |           
                                }|k    rt          j        d| d           t          j        |            d S )Nzretrieving port: r	  curlz-sSLzUnexpected hash: z6
If you are updating the port, please update the hash.)r   infor
   MACOS
subprocesscheck_outputr   readhashlibsha512	hexdigestrB   write_binary)datar   actual_hashfullpathr   
sha512hashurls      r   retrievez+Ports.fetch_port_artifact.<locals>.retrieve]  s    kk7d77#77888	 	 &'<==CLLvvxx	 YnT**4466*$$

 !XK !X !X !X Y Y Y4(((((r   z.emscripten_urlc                      t                               d            t          j                    t	          j                    t          j        dz              d S )Nzunpacking port: )r{   extract_dir
)r   r  r
   r   r   unpack_archive
write_file)fullnamer  markerr   r  s   r   unpackz)Ports.fetch_port_artifact.<locals>.unpacku  sb    kk+T++,,,X&&&X8DDDDvsTz*****r   c                      t           j                                       o)t          j                                                   k    S r   )rX   rY   r   r
   	read_filestrip)r$  r  s   r   rb   z-Ports.fetch_port_artifact.<locals>.up_to_date{  s7    W^^F##N(?(?(E(E(G(G3(NNr   zunpack portz@local copy of port is not correct, retrieving from remote server)rU   r[   r   r   r   addrX   environrp   warningr  r   r
   rB   r   r  rY   rZ   r   r   r   lockr   r   r   rsplitensuredelete_file)r   r  r  local_ports
local_namerY   r   subdirr   uptodate_messageurl_filenamer   r  r%  rb   r#  r  r$  s   ```            @@@r   rV   zPorts.fetch_port_artifact#  sa    }}T""H5###ll,d,,---ll)h)))***4    *..!344K nn,{:;;;KKK4E4Ec4J4JKKKk)  
*d:""4(($ C!":T"ABBBx(( K!  #J$  #J  #J  #J  K  K  K;&7<<&11& @  @  @T  @  @x  @  @ci  @  @  AG  @  @  @
W^^F## T6(B(B NN+,,,44z-.. 	 	 w~~f%% l4.H.H nn-...	 	 	 	 	 	 	 	 	 NNf4fftffff]cfffgggX&&&OD&)))	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ::c??2&L


S!
$
$Q
'C#~#H) ) ) ) ) ) ) ), W\\($566F+ + + + + + + + +O O O O O O z|| T 
LNNN	M	"	"  		!	! $ :<< 	        	YZZZ"""(###hjjjfhhh                 s3   *AJ"AJ""J&	)J&	+O4AO44O8;O8c                 v    t                               | ||          st                               |            d S d S r   )rU   rV   r`   )r   r  r  s      r   fetch_projectzPorts.fetch_project  s@    $$T3
;; &%%%%%& &r   c                 F   t          |           }|                    t          t          t                     t
          j                            t                                          |           }t          
                    d|  d|            t          j        |           |S )Nzclearing port build: r   )r   rq   rU   r   r   rX   rY   rZ   r   r   r   r
   r   )r   r   r   s      r   r`   zPorts.clear_project_build  s    D!!DJJuh'''U0022D99I
LL;;;	;;<<<	Yr   c                     t           j                            |           rt          j        |           |k    rd S t          j        | |           d S r   )rX   rY   r   r
   r'  r"  )r{   contentss     r   r"  zPorts.write_file  sJ    	w~~h EOH$=$=$I$If	Xx(((((r   c                     t          j        d          }t          j                            || dz             }t
                              |d|  d|  d| d| d| d           d S )	Nzlib/pkgconfigz.pcz
Name: z
Description: z port from emscripten
Version: z
Libs: z	
Cflags: r   )r   r   rX   rY   rZ   rU   r"  )r   versionr   pkgconfig_dirr{   s        r   make_pkg_configzPorts.make_pkg_config  s    )/::Mw||M4%<88H	X             	   
 
          r   r   )r   N)__name__
__module____qualname____doc__staticmethodr   r   r   r   r   r[   r   r   setr   r   __annotations__rV   r6  r`   r"  r=  r/   r   r   rU   rU      s            <
 Q Q Q <Q 8 8 <8 = = = <= ;=RRTdfuw  A / / / </b   <
   < ' ' <' *c#ho o o <ob & & & <&
   < ) ) <)
 	 	 <	 	 	r   rU   c                   D    e Zd ZdZd Zd Zd Zd Zd ZddZ	d	 Z
d
 ZdS )
OrderedSetzIPartial implementation of OrderedSet.  Just enough for what we need here.c                 2    i | _         |D ]}d| j         |<   d S NTdict)selfr@   is      r   __init__zOrderedSet.__init__  s/    DI  dill r   c                 V    dt          | j                                                   dS )NzOrderedSet(r<   )listrJ  keysrK  s    r   __repr__zOrderedSet.__repr__  s'    2dinn..//2222r   c                 N    t          | j                                                  S r   )r   rJ  rP  rQ  s    r   __len__zOrderedSet.__len__  s    ty~~   r   c                 N    t          | j                                                  S r   )rF  rJ  rP  rQ  s    r   copyzOrderedSet.copy  s    dinn&&'''r   c                 N    t          | j                                                  S r   )iterrJ  rP  rQ  s    r   __iter__zOrderedSet.__iter__  s    	  !!!r   r  c                     t          | j                                                  |         }| j                            |           |S r   )rO  rJ  rP  pop)rK  indexr   s      r   r[  zOrderedSet.pop  s9    
ty~~
 
 
'CIMM#Jr   c                     d| j         |<   d S rH  rI  rK  items     r   r)  zOrderedSet.add  s    DIdOOOr   c                     | j         |= d S r   rI  r^  s     r   r]   zOrderedSet.remove  s    	$r   N)r  )r>  r?  r@  rA  rM  rR  rT  rV  rY  r[  r)  r]   r/   r   r   rF  rF    s        QQ  
3 3 3! ! !( ( (" " "   
      r   rF  c                     d | D             g t          |           fdr                                            S )Nc                     i | ]
}|j         |S r/   r   )r   ps     r   
<dictcomp>z$dependency_order.<locals>.<dictcomp>  s    +++Aafa+++r   c                     | j         D ]@}t          |          \  }}|         }|v r                     |            |           A                    |            d S r   )r5   split_port_optionsr]   r   )nodedepr   childdfsport_mapstackunsorteds       r   rk  zdependency_order.<locals>.dfs  sq    y  !#&&fc1sme	(		E


	LLr   )rF  r[  )	port_listrk  rl  rm  rn  s    @@@@r   dependency_orderrp    s    +++++( %	""(        	 C 	  
,r   Fc                 b      fd                                  D ]} |           d S )Nc                    t          | j                  }t          |j                  dk    r|                                n|                                | j        D ]p}t          |          \  }}|t          vr t          j        d| d| j	         d           t          |          }|vr                     |            |           qd S )N   unknown dependency `z` for port `rl   )r   r,   r   
parametersr5   rg  r   r
   rB   r   r   r)  )	rh  sigdr   ri  add_depscflags_onlyport_setr   s	        r   rx  z&resolve_dependencies.<locals>.add_deps  s    
D-
.
.C
3>a +6666
)))Y  ""da	
-		PQPPDIPPPQQQQc	H		S r   )rV  )rz  r   ry  r   rx  s   ``` @r   resolve_dependenciesr{    s`           $ mmoo  dHTNNNN r   c                 :    t          j        d|  d|            d S )Nzerror with `--use-port=z` | )r
   rB   )argmessages     r   handle_use_port_errorr    s*    D#DD7DDEEEEEr   c                    t          |                                            t          | d          rt          | j                   t          | d          rDt          d           | j                                        D ]\  }}t          d| d|            nt          d           t          | d          rt          d| j                    t          j        d	           d S )
NrT   rs   zOptions:z* z: zNo options.rS   zMore info: r   )	printr9   r   rT   rs   r@   rS   sysexit)r   optiondescs      r   show_port_help_and_exitr  	  s    		T=!! 	$
T9 	***,, # #!!!4!!""""# 
-T5 $	
"
"
"###(1+++++r   c                 j   t          |           }|dk    rt          |           t          |d          s |d|  d           d S i }|                    dd                              d          D ]}|                    dd          }|                    dd	          }t          |          d
k    r |d| d           |d         |j        vr |d|d          d|j                    |d         |v r |d|d          d           |d	         ||d         <   |                    ||           d S )Nhelprr   zno options available for port `rl   z:: :r  r   rs  z` is missing a valuer   z*` is not supported; available options are zduplicate option `)r   r  r   r   r  r   rs   rr   )r   optionserror_handlerr   options_dict
name_valuenvs          r   handle_port_optionsr    sz   	$		$D!!!	'	(	( 5M;D;;;<<<<<LoodD1177<< 	" 	"
%%dC00jC##b	RA:*:::;;;	Adl	"	"Y"Q%YY4<YYZZZ	A,		32a5333444qEl2a5m44444r   c                     t          |           }|j        D ]O}t          |          \  }}|t          vr |d| d           |rt	          |||           t          ||           Pd S )Nrt  rl   )r   r5   rg  r   r  handle_port_deps)r   r  r   ri  dep_namedep_optionss         r   r  r  /  s    	$		$Y . .c.s33Hk}$$m68666777 @(K???X}----. .r   c                 p    |                      dd          }|dk    r| d |         | |dz   d          fS | d fS )Nr  rs  r  r   )find)r}  poss     r   rg  rg  :  sG    a#BYYtt9c#'((m##9r   c                    |sfd}t                    \  }}|                    d          r?|}t          j                            |          s |d|            t          |          }n|t          vr |d| d           t                              |           |rt          |||           t          ||           |S )Nc                 (    t          |            d S r   )r  )r~  r}  s    r   r  z*handle_use_port_arg.<locals>.error_handlerE  s    C)))))r   ru   znot a valid port path: zinvalid port name: `rl   )rg  ry   rX   rY   isfilern   r   r'   r)  r  r  )r   r}  r  r   r  port_file_paths    `    r   handle_use_port_argr  C  s    	 ** * * * *$S))-$	]]5 2N7>>.)) @m>n>>???^$$DD=  M00001114 6g}5554'''	+r   c                 j     t           fdt          D                       }t          | |           |S )Nc              3   j   K   | ]-}|                               t          |j                  V  .d S r   )r$   r   r   )r   rd  r   s     r   r   z#get_needed_ports.<locals>.<genexpr>X  s?      TT1(ASAST&qv..TTTTTTr   )rF  r   r{  )r   ry  r$   s   `  r   get_needed_portsr  V  s<    TTTTTTTTT&vx555	-r   c                     t          |           }t          |g          }t          ||           t          |          D ]#}|                    t
          |t                     $d S r   )r   rF  r{  rp  rp   rU   r   )r   r   r   rz  s       r   r   r   ]  sh    	)	$	$$(x***x(( & &dHHUHf%%%%& &r   c                 f    t          |           }|                    t          |t                     d S r   )r   rq   rU   r   )r   r   r   s      r   
clear_portr  e  s+    	)	$	$$**UHf%%%%%r   c                  8    t                                            d S r   )rU   r   r/   r   r   rq   rq   j  s    ++-----r   c                     g }t          |           }t          |          D ]A}|                    t          |            ||                    t          | t
                    z  }B|                                 |S )zCalled add link time to calculate the list of port libraries.
  Can have the side effect of building and installing the needed ports.
  )r  rp  r2   rU   rp   r   reverse)r   retr$   r   s       r   get_libsr  n  sq     	#H%%&v&& - -deX&&&488E8V,,,CC++---	*r   c                 H   |j         dk    r!| dt                              d          z   gz  } t          |d          }t	          |          D ]T}t          j        d          s!|                    t          |t                     | |	                    t                    z  } UdS )zCalled during compile phase add any compiler flags (e.g -Ifoo) needed
  by the selected ports.  Can also add/change settings.

  Can have the side effect of building and installing the needed ports.
  r   r   SDLT)ry  r   N)
USE_SDLrU   r   r  rp  rX   r   rp   r   r6   )argsr   r$   r   s       r   
add_cflagsr  ~  s     TE))%00011DH$777& v&& % %d9455 (
hhuh'''De$$$DD	% %r   c                  (   t          t          d           } t          d           | D ]+}|j        s"t          d|                                           ,t          d           | D ]+}|j        r"t          d|                                           ,d S )Nc                     | j         S r   rc  )rd  s    r   r*   zshow_ports.<locals>.<lambda>  s    QV r   r   zAvailable official ports:z   zAvailable contrib ports:)sortedr   r  r   r9   )sorted_portsr   s     r   
show_portsr    s    #3#3444,#$$$    d?  E499;;"###    d  E499;;   r   r   )F)Gr   r  importlib.utilrG   loggingrX   r   r  r  inspectr   pathlibr   urllib.requestr   toolsr   r   r   r	   r
   tools.settingsr   tools.toolchain_profilerr   r   r   rJ  r   objectrD  rC  r'   rA   rY   r   abspath__file__rx   	getLoggerr   r   r"   r!   rP   r   r    rn   rC   profiler}   r   r   r   rU   rF  rp  r{  r  r  r  r  rg  r  r  r   r  rq   r  r  r  r/   r   r   <module>r     ss          				      



             " " " " " " ; ; ; ; ; ; ; ; ; ; ; ; ; ; # # # # # # 6 6 6 6 6 6
#%tCK  % % %suu GOOBGOOH5566			7	#	#  	  	  	   8  $ $ $N N N   A A A 9 9 9% % %	# 	# 	#   | | | | | | | |~       >  0   .F F F   5 5 5,. . .     &   & & && & &
     % % %,	  	  	  
r   