§
    Ü+ög/§  ã                   óÚ  — d Z ddlZddlZddlZddlZddlZddlZ	 ddlZn# e$ r ddl	ZY nw xY wddl
mZmZmZmZmZmZmZmZmZmZ dZ	 dZ	 dZ	 dZ	 d                     ¦   «         Z	 d	Z	 dZ	 d
Z	 dZej        dk    rdZ G d„ dej        ¦  «        Z  ej!        d¦  «         ej"        dd¦  «        d„ ¦   «         ¦   «         Z#ej$        d„ ¦   «         Z%ej$        d„ ¦   «         Z&ej$        d„ ¦   «         Z'ej$        d„ ¦   «         Z( G d„ dej        ¦  «        Z) G d„ de ¦  «        Z* G d„ de*¦  «        Z+ G d„ de ¦  «        Z, G d„ d e ¦  «        Z- G d!„ d"e ¦  «        Z. G d#„ d$e ¦  «        Z/dS )%zp
Classes related to the build phase (build, clean, install, step, etc)

The inheritance tree is the following:

é    N)
ÚNodeÚRunnerÚTaskGenÚUtilsÚ	ConfigSetÚTaskÚLogsÚOptionsÚContextÚErrorsÚc4chez	_cache.pyi9  iÇúÿÿz4root node_sigs task_sigs imp_sigs raw_deps node_depsÚ	cfg_filesé   éÿÿÿÿÚclic                   óJ  ‡ — e Zd ZdZdZdZˆ fd„Zd„ Z eed¦  «        Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd.d„Zd„ Zd„ Z eee¦  «        Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d/d„Z#d „ Z$d!„ Z%d0d#„Z&d$„ Z'd%„ Z(d&„ Z)d'„ Z*d(„ Z+d)„ Z,d*„ Z-d+„ Z.d,„ Z/d-„ Z0ˆ xZ1S )1ÚBuildContextzexecutes the buildÚbuildÚ c                 ó  •—  t          t          | ¦  «        j        di |¤Ž d| _        	 |                     dt
          j        ¦  «        | _        	 |                     dt
          j        ¦  «        | _        	 |                     dt
          j        ¦  «        | _        	 t
          j	        | _	        	 t          | _        	 |                     d¦  «        | _        | j        s/t          j                             | j        t           ¦  «        | _        i | _        	 i | _        	 i | _        	 i | _        	 i | _        	 i | _        	 i | _        t0          j        j        | _        	 t0          j        j        | _        	 t0          j        j        | _        	 t0          j        j        | _        	 t=          j        t@          ¦  «        | _!        	 d| _"        	 g | _#        	 i | _$        	 tJ          D ]#}tM          | |¦  «        stO          | |i ¦  «         Œ$d S )Nr   Útop_dirÚout_dirÚrun_dirÚ	cache_dir© )(Úsuperr   Ú__init__Ú
is_installÚgetr   r   r   r   Ú
launch_dirÚ	POST_LAZYÚ	post_moder   ÚosÚpathÚjoinÚ	CACHE_DIRÚall_envsÚ	node_sigsÚ	task_sigsÚimp_sigsÚ	node_depsÚraw_depsÚtask_gen_cache_namesr
   ÚoptionsÚjobsÚtargetsÚkeepÚprogress_barr   ÚdefaultdictÚlistÚdeps_manÚcurrent_groupÚgroupsÚgroup_namesÚSAVED_ATTRSÚhasattrÚsetattr)ÚselfÚkwÚvÚ	__class__s      €ú!/git_repos/avwlv2/waflib/Build.pyr   zBuildContext.__init__7   sÜ  ø€ Ø$…%��dÑÔÔ$Ð*Ð* rÐ*Ð*Ð*à€$„/Ø;à—’˜	¥7¤?Ñ3Ô3€$„,Øbà—’˜	¥7¤?Ñ3Ô3€$„,Øbà—’˜	¥7¤?Ñ3Ô3€$„,Ø-åÔ&€$„/Øfå€$„.Øaà—6’6˜+Ñ&Ô&€$„.Ø	Œð :Ý”G—L’L ¤­yÑ9Ô9€4„>à€$„-Øqð
 €$„.ð Jà€$„.ØWà€$„-Ø|à€$„.ð Dà€$„-ð Aà €$ÔåŒoÔ"€$„)Ø)å”Ô(€$„,Ø.åŒoÔ"€$„)Ø5å”oÔ2€$Ôðõ Ô#¥DÑ)Ô)€$„-Ø]ð €$Ôðð €$„+ðð €$Ôðõ ð ð €aÝ
�$˜Ñ
Ô
ð ÝˆD�!�RÑÔÐøðð ó    c                 ó¬   — | j         s| j        S t          j                             | j        t          j                             | j         ¦  «        ¦  «        S )z$Getter for the variant_dir attribute)Úvariantr   r#   r$   r%   Únormpath©r<   s    r@   Úget_variant_dirzBuildContext.get_variant_dir’   s>   € à	Œð Ø
Œ,ÐÝ	Œ�Š�d”l¥B¤G×$4Ò$4°T´\Ñ$BÔ$BÑ	CÔ	CÐCrA   Nc                 ó”   — | |d<   t          j        |i |¤Ž}i | _        |                      ||                     d¦  «        ¬¦  «         |S )aw  
		Create a task generator and add it to the current build group. The following forms are equivalent::

			def build(bld):
				tg = bld(a=1, b=2)

			def build(bld):
				tg = bld()
				tg.a = 1
				tg.b = 2

			def build(bld):
				tg = TaskGen.task_gen(a=1, b=2)
				bld.add_to_group(tg, None)

		:param group: group name to add the task generator to
		:type group: string
		ÚbldÚgroup)rI   )r   Útask_genr-   Úadd_to_groupr   )r<   Úkr=   Úrets       r@   Ú__call__zBuildContext.__call__™   sR   € ð& €"€U�)ÝÔ˜!Ð"˜rÐ"Ð"€#Ø €$ÔØ×Ò�C˜rŸvšv g™œÐÑ/Ô/Ð/Ø	€*rA   c                 ó*   — t          j        d¦  «        ‚)zT
		Build contexts cannot be copied

		:raises: :py:class:`waflib.Errors.WafError`
		zbuild contexts cannot be copied)r   ÚWafErrorrE   s    r@   Ú__copy__zBuildContext.__copy__²   s   € õ 	ŒÐ9Ñ:Ô:Ð:rA   c                 óv  — | j                              | j        ¦  «        }|st          j        d¦  «        ‚|                     dt          z  d¬¦  «        }|st          j        d¦  «        ‚|D ]Ë}|                     |¦  «                             t          d¦  «                             dd¦  «        }t          j	        | 
                    ¦   «         ¦  «        }|| j        |<   |t                   D ]I}| j                              |¦  «        }|r|                     ¦   «         st          j        d	|z  ¦  «        ‚ŒJŒÌd
S )a  
		The configuration command creates files of the form ``build/c4che/NAMEcache.py``. This method
		creates a :py:class:`waflib.ConfigSet.ConfigSet` instance for each ``NAME`` by reading those
		files and stores them in :py:attr:`waflib.Build.BuildContext.allenvs`.
		ú:The project was not configured: run "waf configure" first!z**/*%sT)Úquietz5The cache directory is empty: reconfigure the projectr   ú\ú/z7Missing configuration file %r, reconfigure the project!N)ÚrootÚ	find_noder   r   rP   Úant_globÚCACHE_SUFFIXÚ	path_fromÚreplacer   Úabspathr'   Ú	CFG_FILESÚfind_resourceÚexists)r<   ÚnodeÚlstÚxÚnameÚenvÚfÚnewnodes           r@   Ú	load_envszBuildContext.load_envsº   sC  € ð 
Œ×	Ò	˜Tœ^Ñ	,Ô	,€$Ø	ð WÝ	ŒÐUÑ	VÔ	VÐVØ�Š�h¥Ñ-°TˆÑ:Ô:€#à	ð RÝ	ŒÐPÑ	QÔ	QÐQàð Zð Z€aØ
�+Š+�dÑ
Ô
×
#Ò
#¥L°"Ñ
5Ô
5×
=Ò
=¸dÀCÑ
HÔ
H€4Ý	Ô	˜QŸYšY™[œ[Ñ	)Ô	)€3Ø€4„=�ÑØ•	ŒNð Zð Z€qØŒi×%Ò% aÑ(Ô(€GØð Z˜'Ÿ.š.Ñ*Ô*ð ZÝŒ?ÐTÐWXÑXÑYÔYÐYðZðZð	Zð ZrA   c                 óŽ  — t           j                             | j        ¦  «        r$t           j                             | j        ¦  «        st          j        d¦  «        ‚| j                             | j        ¦  «        x| _        | _	        | j         
                    | j        ¦  «        | _        | j                             ¦   «          dS )a*  
		Initialize the project directory and the build directory by creating the nodes
		:py:attr:`waflib.Build.BuildContext.srcnode` and :py:attr:`waflib.Build.BuildContext.bldnode`
		corresponding to ``top_dir`` and ``variant_dir`` respectively. The ``bldnode`` directory is
		created if necessary.
		rS   N)r#   r$   Úisabsr   r   r   rP   rW   Úfind_dirÚsrcnodeÚ	make_nodeÚvariant_dirÚbldnodeÚmkdirrE   s    r@   Ú	init_dirszBuildContext.init_dirsÑ   sš   € õ Œ'�-Š-˜œÑ
%Ô
%ð W­"¬'¯-ª-¸¼Ñ*EÔ*Eð WÝ	ŒÐUÑ	VÔ	VÐVà!œY×/Ò/°´Ñ=Ô=Ð=€$„)ˆdŒlØ”×$Ò$ TÔ%5Ñ6Ô6€$„,Ø„,×ÒÑÔÐÐÐrA   c                 óŒ   — |                       ¦   «          | j        s|                      ¦   «          |                      ¦   «          dS )zŸ
		Restore data from previous builds and call :py:meth:`waflib.Build.BuildContext.execute_build`.
		Overrides from :py:func:`waflib.Context.Context.execute`
		N)Úrestorer'   rh   Úexecute_buildrE   s    r@   ÚexecutezBuildContext.executeß   sC   € ð
 ‡,‚,�.„.€.Ø	Œð Ø‡>‚>ÑÔÐØ×ÒÑÔÐÐÐrA   c           	      óŠ  — t          j        d| j        ¦  «         |                      | j        g¦  «         |                      ¦   «          t          j        ¦   «         | _        	 |  	                    ¦   «          | j
        dk    r¤t          j                             ¦   «         r†| j        j        pd}|                      ||t           j        j        t           j        j        ¦  «        }t          j        |t          j        t           j        j        t           j        j        dœ¬¦  «         t          j        d| j        ¦  «         nÎ# | j
        dk    r¤t          j                             ¦   «         r†| j        j        pd}|                      ||t           j        j        t           j        j        ¦  «        }t          j        |t          j        t           j        j        t           j        j        dœ¬¦  «         t          j        d| j        ¦  «         w xY w	 d| j        _        | `n# t.          $ r Y nw xY w|                      ¦   «          dS )ac  
		Execute the build by:

		* reading the scripts (see :py:meth:`waflib.Context.Context.recurse`)
		* calling :py:meth:`waflib.Build.BuildContext.pre_build` to call user build functions
		* calling :py:meth:`waflib.Build.BuildContext.compile` to process the tasks
		* calling :py:meth:`waflib.Build.BuildContext.post_build` to call user build functions
		zWaf: Entering directory `%s'r   )ÚstreamÚc1Úc2)ÚextrazWaf: Leaving directory `%s'N)r	   Úinforn   Úrecurser   Ú	pre_buildr   ÚTimerÚtimerÚcompiler2   ÚsysÚstderrÚisattyÚproducerÚ	processedÚprogress_lineÚcolorsÚBLUEÚNORMALÚ
cursor_offÚ	cursor_onrH   ÚAttributeErrorÚ
post_build)r<   ÚcÚms      r@   rt   zBuildContext.execute_buildé   så  € õ „)Ð*¨DÔ,<Ñ=Ô=Ð=Ø‡,‚,�”ˆ~ÑÔÐØ‡.‚.ÑÔÐõ Œ{‰}Œ}€$„*ð>Ø‡<‚<�>„>€>à
Ô˜1ÒÐ¥¤×!2Ò!2Ñ!4Ô!4ÐØŒÔÐ$ 1€AØ×Ò˜1˜a¥¤Ô!1µ4´;Ô3EÑFÔF€AÝ„Iˆa¥#¤*µD´KÔ4JÕSWÔS^ÔShÐiÐiÐjÑjÔjÐjÝ„9Ð*¨DÔ,<Ñ=Ô=Ð=Ð=øð	 Ô˜1ÒÐ¥¤×!2Ò!2Ñ!4Ô!4ÐØŒÔÐ$ 1€AØ×Ò˜1˜a¥¤Ô!1µ4´;Ô3EÑFÔF€AÝ„Iˆa¥#¤*µD´KÔ4JÕSWÔS^ÔShÐiÐiÐjÑjÔjÐjÝ„9Ð*¨DÔ,<Ñ=Ô=Ð=Ð=øøøðØ€4„=ÔØ€}€}øÝ	ð ð ð Ø€4ðøøøà‡/‚/ÑÔÐÐÐs   Á#E ÅCHÈH È
H,È+H,c           	      óê  — 	 t          j         t          j                             | j        d¦  «        ¦  «        }|j        t          j        k     rt          j	        d¦  «        ‚|j
        D ]} | j        di |¤Ž Œn# t          $ r Y nw xY wt          j                             | j        t          j        ¦  «        }	 t          j        |d¦  «        }	 t"          j                             ¦   «          | j        t"          _        	 t-          j        |¦  «        }t0          D ]'}t3          | ||                     |i ¦  «        ¦  «         Œ(n-# t6          $ r }t9          j        d||¦  «         Y d}~nd}~ww xY wt"          j                             ¦   «          nO# t"          j                             ¦   «          w xY w# t          t>          f$ r t9          j        d|¦  «         Y nw xY w|                       ¦   «          dS )zg
		Load data from a previous run, sets the attributes listed in :py:const:`waflib.Build.SAVED_ATTRS`
		zbuild.config.pyzMProject was configured with a different version of Waf, please reconfigure itÚrbz.build: Could not pickle the build cache %s: %rNz2build: Could not load the build cache %s (missing)r   )!r   r#   r$   r%   r   Úversionr   Ú
HEXVERSIONr   rP   ÚtoolsÚsetupÚEnvironmentErrorrn   ÚDBFILEr   Úreadfr   Úpickle_lockÚacquireÚ
node_classÚNod3ÚcPickleÚloadsr9   r;   r   Ú	Exceptionr	   ÚdebugÚreleaseÚEOFErrorrq   )r<   re   ÚtÚdbfnÚdatarc   Úes          r@   rs   zBuildContext.restore	  s  € ð	Ý	Ô	�RœWŸ\š\¨$¬.Ð:KÑLÔLÑ	MÔ	M€3ð 
„k•GÔ&Ò&Ð&Ý
Œ/ÐiÑ
jÔ
jÐjàŒIð ð €qØ€D„J€O€O�€O€O€O€Oðøõ 
ð ð ð Ø€4ðøøøõ 
Œ�Š�dÔ&­¬Ñ	7Ô	7€$ðÝ
Œ+�d˜DÑ
!Ô
!€4ð
ÝÔ×ÒÑÔÐØ”…D„Ið(ÝŒM˜$ÑÔ€Tõ ð (ð (ˆÝˆd�A�t—x’x  2‘”Ñ'Ô'Ð'Ð'ð(øõ ð Kð Kð KÝ	„ZÐ@À$ÈÑJÔJÐJÐJÐJÐJÐJÐJøøøøðKøøøõ 	Ô×ÒÑÔÐÐø…DÔ×ÒÑÔÐÐøøøøõ �HÐ	%ð Jð Jð Jå„:ÐBÀDÑIÔIÐIÐIÐIðJøøøð" ‡.‚.ÑÔÐÐÐsY   ‚7A: Á:
BÂBÂ:F3 Ã/F Ä E Ä0F Å
E.ÅE)Å$F Å)E.Å.F Æ F0Æ3&GÇGc                 óþ  — i }t           D ]}t          | |¦  «        ||<   Œt          j                             | j        t          j        ¦  «        }	 t          j	         
                    ¦   «          | j        t          _        t          j        |t          ¦  «        }t          j	                             ¦   «          n## t          j	                             ¦   «          w xY wt#          j        |dz   |d¬¦  «         	 t          j        |¦  «        }t          j        |¦  «         t"          j        s#t          j        |dz   |j        |j        ¦  «         n# t2          t4          f$ r Y nw xY wt          j        |dz   |¦  «         dS )z—
		Store data for next runs, set the attributes listed in :py:const:`waflib.Build.SAVED_ATTRS`. Uses a temporary
		file to avoid problems on ctrl+c.
		z.tmpÚwb)r�   N)r9   Úgetattrr#   r$   r%   rn   r   r—   r   r™   rš   r›   rœ   r�   ÚdumpsÚPROTOCOLr¡   r   ÚwritefÚstatÚremoveÚis_win32ÚchownÚst_uidÚst_gidrŒ   ÚOSErrorÚrename)r<   r¥   rc   ÚdbÚsts        r@   ÚstorezBuildContext.store.  sR  € ð
 
€$Ýð ð €aÝ�T˜1ÑÔ€4ˆ�7€7Ý	„w‡|‚|�DÔ$¥g¤nÑ5Ô5€"ðÝÔ×ÒÑÔÐØŒ…4„9Ý„}�T�8Ñ$Ô$€1åÔ×ÒÑÔÐÐø…4Ô×ÒÑÔÐÐøøøå„,ˆr�F‰{˜A Ð&Ñ&Ô&Ð&ðÝ
Œ�‰Œ€2Ý„9ˆR�=„=€=Ý
Œ.ð 0Ý„HˆR�&‰[˜"œ) R¤YÑ/Ô/Ð/øøÝ
�'Ð	"ð ð ð Ø€4ðøøøõ „)ˆB�‰K˜ÑÔÐÐÐs    ÁA	B8 Â8 CÃ6AE ÅE"Å!E"c                 óð  — t          j        d¦  «         t          j        | | j        ¦  «        | _        |                      ¦   «         | j        _        	 | j                             ¦   «          |  	                    ¦   «         r|  
                    ¦   «          n7# t          $ r* |  	                    ¦   «         r|  
                    ¦   «          ‚ w xY w| j        j        rt          j        | j        j        ¦  «        ‚dS )zÙ
		Run the build by creating an instance of :py:class:`waflib.Runner.Parallel`
		The cache file is written when at least a task was executed.

		:raises: :py:class:`waflib.Errors.BuildError` in case the build fails
		zbuild: compile()N)r	   r    r   ÚParallelr/   r„   Úget_build_iteratorÚbiterÚstartÚis_dirtyr·   ÚKeyboardInterruptÚerrorr   Ú
BuildErrorrE   s    r@   r€   zBuildContext.compileL  sç   € õ „*ÐÑ Ô Ð õ ”/ $¨¬	Ñ2Ô2€$„-Ø×/Ò/Ñ1Ô1€$„-ÔðØ„=×ÒÑÔÐð ‡m‚m�o„oð Ø‡J‚J�L„L€Løøõ 
ð 	ð 	ð 	Ø
‡m‚m�o„oð Ø‡J‚J�L„L€LØð	øøøð 
„]Ôð 0Ý	Ô	˜4œ=Ô.Ñ	/Ô	/Ð/ð0ð 0s   ÁB Â4C	c                 ó   — | j         j        S ©N)r„   ÚdirtyrE   s    r@   r½   zBuildContext.is_dirtye  s   € Ø	ŒÔ	ÐrA   c                 óâ   — t          |t          ¦  «        r|D ]}|                      ||¦  «         ŒdS t          j        ||¦  «        }t          |d¦  «        r|                     | ¦  «         dS dS )aF  
		Import waf tools defined during the configuration::

			def configure(conf):
				conf.load('glib2')

			def build(bld):
				pass # glib2 is imported implicitly

		:param tool: tool list
		:type tool: list
		:param tooldir: optional tool directory (sys.path)
		:type tooldir: list of string
		:param funs: unused variable
		Nr•   )Ú
isinstancer4   r•   r   Ú	load_toolr:   )r<   ÚtoolÚtooldirÚfunsÚiÚmodules         r@   r•   zBuildContext.setuph  s‡   € õ  �•dÑÔð 
Øð ð €qØ‡J‚Jˆq�'ÑÔÐÐØ	€6åÔ˜T 7Ñ+Ô+€&ÝˆV�WÑÔð Ø	‡<‚<�ÑÔÐÐÐðð rA   c                 ób   — 	 | j         | j                 S # t          $ r | j         d         cY S w xY w)zGetter for the env propertyr   )r'   rC   ÚKeyErrorrE   s    r@   Úget_envzBuildContext.get_env�  sD   € ðØ
Œ-˜œÔ
%Ð%øÝ	ð ð ð Ø
Œ-˜Ô
ÐÐÐðøøøs   ‚ ”.­.c                 ó$   — || j         | j        <   dS )zSetter for the env propertyN)r'   rC   )r<   Úvals     r@   Úset_envzBuildContext.set_env‡  s   € à #€$„-�”ÑÐÐrA   c                 óæ  — |st          d|z  ¦  «        ‚t          |t          j        ¦  «        r|}nTt          j                             |¦  «        r| j                             |¦  «        }n| j                             |¦  «        }|st          d|z  ¦  «        ‚t          |t          ¦  «        r"| j	        |          
                    |¦  «         dS | j	        |                              |¦  «         dS )aŠ  
		Adds a dependency from a node object to a value::

			def build(bld):
				bld.add_manual_dependency(
					bld.path.find_resource('wscript'),
					bld.root.find_resource('/etc/fstab'))

		:param path: file path
		:type path: string or :py:class:`waflib.Node.Node`
		:param value: value to depend
		:type value: :py:class:`waflib.Node.Node`, byte object, or function returning a byte object
		zInvalid input path %rzCould not find the path %rN)Ú
ValueErrorrÅ   r   r#   r$   rj   rW   r_   r4   r5   ÚextendÚappend)r<   r$   Úvaluera   s       r@   Úadd_manual_dependencyz"BuildContext.add_manual_dependency�  sí   € ð 
ð 4Ý	Ð+¨dÑ2Ñ	3Ô	3Ð3å�•d”iÑ Ô ð (Ø
€4€4Ý	„w‡}‚}�TÑÔð (Ø
Œ)×
!Ò
! $Ñ
'Ô
'€4€4à
Œ)×
!Ò
! $Ñ
'Ô
'€4Ø	ð 9Ý	Ð0°4Ñ7Ñ	8Ô	8Ð8å�•tÑÔð %Ø„=�Ô×Ò˜eÑ$Ô$Ð$Ð$Ð$à„=�Ô×Ò˜eÑ$Ô$Ð$Ð$Ð$rA   c                 óˆ   — 	 | j         S # t          $ r. | j                             | j        ¦  «        | _         | j         cY S w xY w)zNReturns the launch directory as a :py:class:`waflib.Node.Node` object (cached))Úp_lnrŒ   rW   rk   r    rE   s    r@   Úlaunch_nodezBuildContext.launch_node¬  sQ   € ðà
Œ)ÐøÝ	ð ð ð ØŒy×!Ò! $¤/Ñ2Ô2€4„9Ø
Œ)ÐÐÐðøøøs   ‚	 ‰5AÁ Ac                 ó´  ‡— ‰j         s‰j        Š‰st          j        S t	          t          ‰¦  «        ¦  «        t	          |¦  «        z   }	 | j        }	 | j        |         S # t          $ r Y nw xY w# t          $ r i x}| _        Y nw xY wˆfd„|D ¦   «         }t          j	        |¦  «        x||<   }t          j        dt          j        |¦  «        |¦  «         |S )a/  
		Hashes configuration set variables::

			def build(bld):
				bld.hash_env_vars(bld.env, ['CXX', 'CC'])

		This method uses an internal cache.

		:param env: Configuration Set
		:type env: :py:class:`waflib.ConfigSet.ConfigSet`
		:param vars_lst: list of variables
		:type vars_list: list of string
		c                 ó    •— g | ]
}‰|         ‘ŒS r   r   )Ú.0Úare   s     €r@   ú
<listcomp>z.BuildContext.hash_env_vars.<locals>.<listcomp>Ô  s   ø€ Ð"Ð"Ð"�AˆˆQŒÐ"Ð"Ð"rA   zenvhash: %s %r)ÚtableÚparentr   ÚSIG_NILÚstrÚidÚ	cache_envrÍ   rŒ   Úh_listr	   r    Úto_hex)r<   re   Úvars_lstÚidxÚcacherb   rM   s    `     r@   Úhash_env_varszBuildContext.hash_env_varsµ  s  ø€ ð 
Œð Ø	Œ€3Ø
ð ÝŒ=Ðå�Bˆs‰GŒG‰Œ•s˜8‘}”}Ñ$€#ð	ØŒ>€5ð	ØŒ>˜#ÔÐøÝ
ð 	ð 	ð 	Ø€Dð	øøøøõ 
ð ð ð ØÐ€5ˆ4Œ>ˆ>ˆ>ðøøøð 	#Ð"Ð"Ð"˜Ð"Ñ"Ô"€#Ý”\ #Ñ&Ô&Ð&€%ˆ�*ˆsÝ„*Ð�uœ|¨CÑ0Ô0°#Ñ6Ô6Ð6Ø	€*s$   ÁA0 ÁA  Á 
A-Á,A-Á0BÂBc                 óÄ   — | j         }|s*| j        D ]"}|D ]}	 |||j        <   Œ# t          $ r Y Œw xY wŒ#	 ||         S # t          $ r t          j        d|z  ¦  «        ‚w xY w)an  
		Fetches a task generator by its name or its target attribute;
		the name must be unique in a build::

			def build(bld):
				tg = bld(name='foo')
				tg == bld.get_tgen_by_name('foo')

		This method use a private internal cache.

		:param name: Task generator name
		:raises: :py:class:`waflib.Errors.WafError` in case there is no task genenerator by that name
		z/Could not find a task generator for the name %r)r-   r7   rd   rŒ   rÍ   r   rP   )r<   rd   rê   ÚgÚtgs        r@   Úget_tgen_by_namezBuildContext.get_tgen_by_nameÙ  s°   € ð Ô
#€%Ø	ð àŒKð ð €qØð ð ˆðØ€eˆBŒG�n€nøÝð ð ð à
€dðøøøððSØ
�Œ+ÐøÝ	ð Sð Sð SÝ	ŒÐJÈTÑQÑ	RÔ	RÐRðSøøøs   ˜
#£
0¯0µ= ½"Ac                 óh  — t           j                             ¦   «         sdS t          t	          |¦  «        ¦  «        }t
          xj        dz  c_        t
          j        t
          j        dz           }d|z  |z  }d||fz  }||||||fz  }	d|›| j        ›|›d�}
t          j
        ¦   «         t          |	¦  «        z
  t          |
¦  «        z
  dt          |¦  «        z  z   dt          |¦  «        z  z   }|d	k     rd	}||z  |z  dz
  }d
|z  dz                        |¦  «        }t          j        |	||
fz  }|S )zt
		Computes a progress bar line displayed when running ``waf -p``

		:returns: progress bar line
		:rtype: string
		r   r   é   g      Y@z [%%%dd/%%d][%%s%%2d%%%%%%s][%s][z][ú]é   é   ú=ú>)r�   r‚   rƒ   Úlenrã   r   Úrot_idxÚrot_chrr   r	   Úget_term_colsÚljustÚ	indicator)r<   ré   ÚtotalÚcol1Úcol2ÚnÚindÚpcÚfsÚleftÚrightÚcolsÚratioÚbarÚmsgs                  r@   r†   zBuildContext.progress_lineö  s2  € õ 
Œ×	Ò	Ñ	Ô	ð Ø
ˆ"å	�#ˆe‰*Œ*�o„o€!å€-„-�1Ñ€-„-ÝŒ•e”m aÑ'Ô(€#àˆs‰
�EÑ€"Ø)¨Q°¨HÑ4€"Ø	ˆs�E˜4  TÐ*Ñ	*€$€$Ø˜˜tœz˜z¨4¨4¨4Ð
0€%å	Ô	Ñ	Ô	¥ D¡	¤	Ñ	)­C°©J¬JÑ	6¸½3¸t¹9¼9¹Ñ	DÀqÍÈTÉÌÁ{Ñ	R€$Ø	ˆA‚X€XØ
€4à�3‰J˜Ñ !Ñ
#€%à	ˆU‰�3‰×Ò˜dÑ#Ô#€#ÝŒ˜$  UÐ+Ñ+€#à	€*rA   c                 ó$   — t          j        |i |¤ŽS )zC
		Wraps :py:func:`waflib.TaskGen.declare_chain` for convenience
		)r   Údeclare_chain)r<   rL   r=   s      r@   r  zBuildContext.declare_chain  s   € õ 
Ô	 Ð	( RÐ	(Ð	(Ð(rA   c                 óD   — t          | dg ¦  «        D ]} || ¦  «         ŒdS )zkExecutes user-defined methods before the build starts, see :py:meth:`waflib.Build.BuildContext.add_pre_fun`Úpre_funsN©r©   ©r<   r�   s     r@   r}   zBuildContext.pre_build  s6   € å�4˜ RÑ(Ô(ð ð €aØ€1€T�7„7€7€7ðð rA   c                 óD   — t          | dg ¦  «        D ]} || ¦  «         ŒdS )zrExecutes user-defined methods after the build is successful, see :py:meth:`waflib.Build.BuildContext.add_post_fun`Ú	post_funsNr  r  s     r@   r�   zBuildContext.post_build   s6   € å�4˜ bÑ)Ô)ð ð €aØ€1€T�7„7€7€7ðð rA   c                 ón   — 	 | j                              |¦  «         dS # t          $ r |g| _         Y dS w xY w)zÉ
		Binds a callback method to execute after the scripts are read and before the build starts::

			def mycallback(bld):
				print("Hello, world!")

			def build(bld):
				bld.add_pre_fun(mycallback)
		N)r  rÕ   rŒ   ©r<   Úmeths     r@   Úadd_pre_funzBuildContext.add_pre_fun%  sM   € ðØ„=×Ò˜ÑÔÐÐÐøÝ	ð ð ð Ø�6€4„=€=€=€=ðøøøó   ‚ ž4³4c                 ón   — 	 | j                              |¦  «         dS # t          $ r |g| _         Y dS w xY w)zì
		Binds a callback method to execute immediately after the build is successful::

			def call_ldconfig(bld):
				bld.exec_command('/sbin/ldconfig')

			def build(bld):
				if bld.cmd == 'install':
					bld.add_pre_fun(call_ldconfig)
		N)r  rÕ   rŒ   r  s     r@   Úadd_post_funzBuildContext.add_post_fun4  sM   € ðØ„>×Ò˜ÑÔÐÐÐøÝ	ð ð ð Ø�F€4„>€>€>€>ðøøør  c                 ó¦   — | j         s|                      ¦   «          |€| j         | j                 S || j        v r| j        |         S | j         |         S )z�
		Returns the build group named `x`, or the current group if `x` is None

		:param x: name or number or None
		:type x: string, int or None
		)r7   Ú	add_groupr6   r8   )r<   rc   s     r@   Ú	get_groupzBuildContext.get_groupD  s[   € ð 
Œð Ø‡>‚>ÑÔÐØ€YØ
Œ+�dÔ(Ô
)Ð)Øˆ$Ô
ÐÐØ
Ô
˜1Ô
ÐØ	Œ�QŒÐrA   c                 óÐ   — t          |t          j        ¦  «        st          |t          j        ¦  «        sJ ‚| |_        |                      |¦  «                             |¦  «         dS )zgAdds a task or a task generator to the build; there is no attempt to remove it if it was already added.N)rÅ   r   rJ   r   rH   r  rÕ   )r<   ÚtgenrI   s      r@   rK   zBuildContext.add_to_groupS  sY   € å	�D�'Ô*Ñ	+Ô	+ÐK­z¸$ÅÄ	Ñ/JÔ/JÐKÐKÐKØ€$„(Ø‡.‚.�ÑÔ×Ò˜tÑ$Ô$Ð$Ð$Ð$rA   c                 ó¼   — t          |t          ¦  «        s| j        |         }| j        D ]1}t	          | j        |         ¦  «        t	          |¦  «        k    r|c S Œ2dS )z 
		Returns the name of the input build group

		:param g: build group object or build group index
		:type g: integer or list
		:return: name
		:rtype: string
		r   )rÅ   r4   r7   r8   rä   )r<   rí   rc   s      r@   Úget_group_namezBuildContext.get_group_nameY  sg   € õ 
�A•tÑ	Ô	ð Ø„{�1„~€1ØÔð ð €aÝˆÔ	˜!Ô	ÑÔ¥ A¡¤Ò&Ð&Ø€H€H€Hð 'à	ˆrA   c                 ó”   — t          |¦  «        }t          | j        ¦  «        D ]#\  }}|D ]}t          |¦  «        |k    r|c c S ŒŒ$dS )a  
		Returns the index of the group containing the task generator given as argument::

			def build(bld):
				tg = bld(name='nada')
				0 == bld.get_group_idx(tg)

		:param tg: Task generator object
		:type tg: :py:class:`waflib.TaskGen.task_gen`
		:rtype: int
		N)rä   Ú	enumerater7   )r<   rî   ÚserÊ   Útmpr£   s         r@   Úget_group_idxzBuildContext.get_group_idxi  sh   € õ 
ˆ"�v„v€"Ý˜$œ+Ñ&Ô&ð ð �f€aˆØð ð €qÝ	ˆ!�u„u�‚{€{Ø€X€X€X€X€Xð ðð 
ˆrA   Tc                 óÒ   — |r|| j         v rt          j        d|¦  «        ‚g }|| j         |<   | j                             |¦  «         |rt          | j        ¦  «        dz
  | _        dS dS )a•  
		Adds a new group of tasks/task generators. By default the new group becomes
		the default group for new task generators (make sure to create build groups in order).

		:param name: name for this group
		:type name: string
		:param move: set this new group as default group (True by default)
		:type move: bool
		:raises: :py:class:`waflib.Errors.WafError` if a group by the name given already exists
		z"add_group: name %s already presentr   N)r8   r   rP   r7   rÕ   r÷   r6   )r<   rd   Úmoverí   s       r@   r  zBuildContext.add_group|  s„   € ð 
ð Eˆd�dÔ&Ð&Ð&Ý	ŒÐ=¸tÑ	DÔ	DÐDØ€!Ø€$Ô�4ÑØ„+×Ò�QÑÔÐØ	ð -Ý˜DœKÑ(Ô(¨1Ñ,€4ÔÐÐð-ð -rA   c                 óä   — t          |t          ¦  «        rS| j        |         }t          | j        ¦  «        D ]/\  }}t          |¦  «        t          |¦  «        k    r
|| _         dS Œ0dS || _        dS )aç  
		Sets the build group at position idx as current so that newly added
		task generators are added to this one by default::

			def build(bld):
				bld(rule='touch ${TGT}', target='foo.txt')
				bld.add_group() # now the current group is 1
				bld(rule='touch ${TGT}', target='bar.txt')
				bld.set_group(0) # now the current group is 0
				bld(rule='touch ${TGT}', target='truc.txt') # build truc.txt before bar.txt

		:param idx: group name or group index
		:type idx: string or int
		N)rÅ   rã   r8   r!  r7   rä   r6   )r<   ré   rí   rÊ   r#  s        r@   Ú	set_groupzBuildContext.set_group�  s…   € õ �•SÑÔð ØÔ˜Ô€1Ý˜4œ;Ñ'Ô'ð ð �v€qˆ#Ý	ˆ!�u„u•�3‘”ÒÐØ€TÔØ
€U€Uð ðð ð
 €4ÔÐÐrA   c                 ó‚   — d}| j         D ]4}|D ]/}	 |t          |j        ¦  «        z  }Œ# t          $ r |dz  }Y Œ,w xY wŒ5|S )a   
		Approximate task count: this value may be inaccurate if task generators
		are posted lazily (see :py:attr:`waflib.Build.BuildContext.post_mode`).
		The value :py:attr:`waflib.Runner.Parallel.total` is updated during the task execution.

		:rtype: int
		r   r   )r7   r÷   ÚtasksrŒ   )r<   rý   rI   rî   s       r@   rý   zBuildContext.total§  sv   € ð €%ØŒ{ð ð €eØð ð €rðØ
�c�"”(‰mŒmÑ€U€UøÝð ð ð Ø
ˆa�Z€U€U€Uðøøøðð
 
€,s   ‘)©;º;c                 óî   — g }d}| j                              d¦  «        D ]S}|                      |¦  «        }|                      |¦  «        }||k    r|}|g}Œ8||k    r|                     |¦  «         ŒT||fS )a“  
		This method returns a pair containing the index of the last build group to post,
		and the list of task generator objects corresponding to the target names.

		This is used internally by :py:meth:`waflib.Build.BuildContext.get_build_iterator`
		to perform partial builds::

			$ waf --targets=myprogram,myshlib

		:return: the minimum build group index, and list of task generators
		:rtype: tuple
		r   ú,)r0   Úsplitrï   r$  rÕ   )r<   Úto_postÚmin_grprd   rî   r�   s         r@   Úget_targetszBuildContext.get_targets¸  s‘   € ð €'Ø€'ØŒl× Ò  Ñ%Ô%ð ð €dØ×Ò˜dÑ#Ô#€2Ø×Ò˜"ÑÔ€1Øˆ'‚k€kØ€GØˆd€G€GØ	ˆWŠˆØ‡N‚N�2ÑÔÐøØ
�7Ð	ÐrA   c                 óH   — g }| j         D ]}|                     |¦  «         Œ|S )zI
		Returns a list of all task generators for troubleshooting purposes.
		)r7   rÔ   )r<   rb   rí   s      r@   Úget_all_task_genzBuildContext.get_all_task_genÑ  s0   € ð 	€#ØŒ;ð ð €aØ‡:‚:ˆa�=„=€=€=Ø	€*rA   c                 ó6  ‡ ‡‡— d„ }‰ j         dk    r"‰ j        ‰ j                 D ]} ||¦  «         ŒdS ‰ j         rR‰ j        ‰ j        k     r"‰ j        ‰ j                 D ]} ||¦  «         ŒdS ‰ j        D ]}|                     ¦   «          ŒdS ‰                      ¦   «         Š‰                     ‰ j        ¦  «        rt          j
        d¦  «         ‰ j        Šn`‰                     ‰ j        ¦  «        sFt          j
        d‰                     ¦   «         ‰ j                             ¦   «         ¦  «         ‰ j        Šd„ Šˆˆˆ fd„}‰ j        t          k    r‰‰ j        k    r |¦   «         r‰ j        Š‰ j        ‰ j                 D ]} ‰|‰¦  «        r ||¦  «         ŒdS )z•
		Post task generators from the group indexed by self.current_group; used internally
		by :py:meth:`waflib.Build.BuildContext.get_build_iterator`
		c                 óL   — 	 | j         } |¦   «          d S # t          $ r Y d S w xY wrÂ   )ÚpostrŒ   )rî   rf   s     r@   Útgpostz'BuildContext.post_group.<locals>.tgpostß  sC   € ðØ
Œ€Að €A�C„C€C€C€Cøõ ð 	ð 	ð 	Ø€D€Dð	øøøs   ‚ •
#¢#Ú*z6Building from the build directory, forcing --targets=*z<CWD %s is not under %s, forcing --targets=* (run distclean?)c                 óf   — 	 | j         }|                     |¦  «        rdS d S # t          $ r Y d S w xY w©NT)r$   Úis_child_ofrŒ   )rî   ÚlnÚps      r@   Úis_postz(BuildContext.post_group.<locals>.is_postú  sW   € ðØ	Œ€Qð 	
�Š�bÑÔð ØˆTðð øõ ð 
ð 
ð 
Ø	€T€Tð
øøøs   ‚" ¢
0¯0c                  ó|   •— t          ‰j        ¦  «        D ]%\  } }| ‰j        k    r|D ]} ‰|‰¦  «        r  dS ŒŒ&d S r9  )r!  r7   r6   )rÊ   rí   rî   r=  r;  r<   s      €€€r@   Úis_post_groupz.BuildContext.post_group.<locals>.is_post_group  sh   ø€ Ý˜$œ+Ñ&Ô&ð ð ‰ˆˆ1Ø	ˆDÔÒÐØð ð ˆ"Ø
ˆ'�"�b‰/Œ/ð Øˆtˆtˆtðøðð rA   N)r0   r7   r6   Ú_min_grpÚ	_exact_tgr5  rÚ   r:  ro   r	   Úwarnrl   r]   r"   r!   )r<   r6  rî   r?  r=  r;  s   `   @@r@   Ú
post_groupzBuildContext.post_groupÚ  sÿ  øøø€ ð
ð ð ð 
„\�SÒÐØŒ[˜Ô+Ô,ð ð €rØ
€Fˆ2�J„J€J€Jðð à„|ð 'Ø
Ô˜4œ=Ò(Ð(ØŒk˜$Ô,Ô-ð ð ˆØ€VˆB�Z„Z€Z€Zðð ð Œnð ð ˆØ‡W‚W�Y„Y€Y€Yðð ð 	×ÒÑÔ€2Ø‡n‚n�T”\Ñ"Ô"ð Ý„IÐFÑGÔGÐGØ	Œ€B€BØ�NŠN˜4œ<Ñ(Ô(ð Ý„IÐLÈbÏjÊjÉlÌlÐ\`Ô\h×\pÒ\pÑ\rÔ\rÑsÔsÐsØ	Œ€Bðð ð ðð ð ð ð ð ð ð „n�	Ò!Ð! b¨D¬LÒ&8Ð&8à€}�„ð Ø
Œ,€RàŒ[˜Ô+Ô,ð ð €rØ€wˆr�2�„ð Ø€VˆB�Z„Z€Zøðð rA   c                 óª   — g }| j         |         D ]B}	 |                     |j        ¦  «         Œ# t          $ r |                     |¦  «         Y Œ?w xY w|S )zÂ
		Returns all task instances for the build group at position idx,
		used internally by :py:meth:`waflib.Build.BuildContext.get_build_iterator`

		:rtype: list of :py:class:`waflib.Task.Task`
		)r7   rÔ   r*  rŒ   rÕ   )r<   ré   r*  rî   s       r@   Úget_tasks_groupzBuildContext.get_tasks_group  ss   € ð €%ØŒK˜Ôð ð €bðØ	‡L‚L�”ÑÔÐÐøÝ
ð ð ð Ø	‡L‚L�ÑÔÐÐÐðøøøà	€,s   “.®AÁAc              #   ó"  K  — | j         r,| j         dk    r!|                      ¦   «         \  | _        | _        | j        t
          k    r3t          | j        ¦  «        D ]\  | _        }|  	                    ¦   «          Œt          | j        ¦  «        D ]}\  | _        }| j        t          k    r|  	                    ¦   «          |                      | j        ¦  «        }t          j        |¦  «         t          j        |¦  «         || _        |r|V — Œ~	 g V — Œ)zÞ
		Creates a Python generator object that returns lists of tasks that may be processed in parallel.

		:return: tasks which can be executed immediately
		:rtype: generator returning lists of :py:class:`waflib.Task.Task`
		r7  )r0   r0  r@  rA  r"   r!   r!  r7   r6   rC  ÚPOST_AT_ONCErE  r   Úset_file_constraintsÚset_precedence_constraintsÚ	cur_tasks)r<   Ú_r*  s      r@   rº   zBuildContext.get_build_iterator"  s  è è € ð 
„\ð 8�d”l cÒ)Ð)Ø%)×%5Ò%5Ñ%7Ô%7Ñ"€D„M�4”>à	„^•yÒ Ð Ý )¨$¬+Ñ 6Ô 6ð ð Ñ€tÔ˜1Ø‡O‚OÑÔÐÐå(¨¬Ñ5Ô5ð ð Ñ€dÔ˜!à
„n�Ò$Ð$Ø‡O‚OÑÔÐð ×Ò Ô 2Ñ3Ô3€5õ Ô˜UÑ#Ô#Ð#ÝÔ" 5Ñ)Ô)Ð)à€4„>Øð Ø
€K€K€Køðà	€8€8€8ðrA   c                 ó    — |sJ ‚ | dd||dœ|¤Ž}|j         |_        d|_        |                     dd¦  «        s|                     ¦   «          |S )ag  
		Creates a task generator to install files on the system::

			def build(bld):
				bld.install_files('${DATADIR}', self.path.find_resource('wscript'))

		:param dest: path representing the destination directory
		:type dest: :py:class:`waflib.Node.Node` or string (absolute path)
		:param files: input files
		:type files: list of strings or list of :py:class:`waflib.Node.Node`
		:param env: configuration set to expand *dest*
		:type env: :py:class:`waflib.ConfigSet.ConfigSet`
		:param relative_trick: preserve the folder hierarchy when installing whole folders
		:type relative_trick: bool
		:param cwd: parent node for searching srcfile, when srcfile is not an instance of :py:class:`waflib.Node.Node`
		:type cwd: :py:class:`waflib.Node.Node`
		:param postpone: execute the task immediately to perform the installation (False by default)
		:type postpone: bool
		Úinstall_task©ÚfeaturesÚ
install_toÚinstall_fromÚinstall_filesÚpostponeTr   ©rP  ÚdestÚtyper   r5  )r<   rU  Úfilesr=   rî   s        r@   rR  zBuildContext.install_filesI  sc   € ð( 
€,€,€,Ø€tÐO�^°À5ÐOÐOÈBÐOÐO€"ØŒM€"„'Ø€"„'Ø	�Š�
˜DÑ	!Ô	!ð Ø‡7‚7�9„9€9Ø	€)rA   c                 ó    — |sJ ‚ | dd||dœ|¤Ž}|j         |_        d|_        |                     dd¦  «        s|                     ¦   «          |S )aî  
		Creates a task generator to install a file on the system with a different name::

			def build(bld):
				bld.install_as('${PREFIX}/bin', 'myapp', chmod=Utils.O755)

		:param dest: destination file
		:type dest: :py:class:`waflib.Node.Node` or string (absolute path)
		:param srcfile: input file
		:type srcfile: string or :py:class:`waflib.Node.Node`
		:param cwd: parent node for searching srcfile, when srcfile is not an instance of :py:class:`waflib.Node.Node`
		:type cwd: :py:class:`waflib.Node.Node`
		:param env: configuration set for performing substitutions in dest
		:type env: :py:class:`waflib.ConfigSet.ConfigSet`
		:param postpone: execute the task immediately to perform the installation (False by default)
		:type postpone: bool
		rM  rN  Ú
install_asrS  Tr   rT  )r<   rU  Úsrcfiler=   rî   s        r@   rY  zBuildContext.install_ase  sc   € ð$ 
€,€,€,Ø€tÐQ�^°À7ÐQÐQÈbÐQÐQ€"ØŒM€"„'Ø€"„'Ø	�Š�
˜DÑ	!Ô	!ð Ø‡7‚7�9„9€9Ø	€)rA   c                 ó®   — |sJ ‚ | dd||dœ|¤Ž}|j         |_        d|_        ||_        |                     dd¦  «        s|                     ¦   «          |S )aE  
		Creates a task generator to install a symlink::

			def build(bld):
				bld.symlink_as('${PREFIX}/lib/libfoo.so', 'libfoo.so.1.2.3')

		:param dest: absolute path of the symlink
		:type dest: :py:class:`waflib.Node.Node` or string (absolute path)
		:param src: link contents, which is a relative or absolute path which may exist or not
		:type src: string
		:param env: configuration set for performing substitutions in dest
		:type env: :py:class:`waflib.ConfigSet.ConfigSet`
		:param add: add the task created to a build group - set ``False`` only if the installation task is created after the build has started
		:type add: bool
		:param postpone: execute the task immediately to perform the installation
		:type postpone: bool
		:param relative_trick: make the symlink relative (default: ``False``)
		:type relative_trick: bool
		rM  rN  Ú
symlink_asrS  Tr   )rP  rU  rV  Úlinkr   r5  )r<   rU  Úsrcr=   rî   s        r@   r\  zBuildContext.symlink_as  sj   € ð( 
€,€,€,Ø€tÐM�^°À3ÐMÐMÈ"ÐMÐM€"ØŒM€"„'Ø€"„'Ø€"„'à	�Š�
˜DÑ	!Ô	!ð Ø‡7‚7�9„9€9Ø	€)rA   )NNrÂ   r9  )2Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚcmdrC   r   rF   Úpropertyrn   rN   rQ   rh   rq   ru   rt   rs   r·   r€   r½   r•   rÎ   rÑ   re   r×   rÚ   rë   rï   r†   r  r}   r�   r  r  r  rK   r  r$  r  r(  rý   r0  r2  rC  rE  rº   rR  rY  r\  Ú__classcell__©r?   s   @r@   r   r   1   sÚ  ø€ € € € € ØÐà€Ø€ðYð Yð Yð Yð YðvDð Dð Dð
 ˆx˜¨Ñ.Ô.€ðð ð ð2;ð ;ð ;ðZð Zð Zð.ð ð ðð ð ðð ð ð@#ð #ð #ðJð ð ð<0ð 0ð 0ð2ð ð ðð ð ð ð2ð ð ð$ð $ð $ð €x�˜Ñ!Ô!€ð%ð %ð %ð>ð ð ð"ð "ð "ðHSð Sð Sð:ð ð ð>)ð )ð )ðð ð ð
ð ð ð
ð ð ðð ð ð ð ð ð%ð %ð %ð %ðð ð ð ð ð ð&-ð -ð -ð -ð&ð ð ð0ð ð ð"ð ð ð2ð ð ð7ð 7ð 7ðrð ð ð%ð %ð %ðNð ð ð8ð ð ð4ð ð ð ð ð ð rA   r   rM  Úprocess_ruleÚprocess_sourcec                 ó*   —  | j         di | j        ¤Ž dS )zwCreates the installation task for the current task generator; uses :py:func:`waflib.Build.add_install_task` internally.Nr   )Úadd_install_taskÚ__dict__rE   s    r@   Úprocess_install_taskrl  �  s%   € ð €ÔÐ'Ð'˜œÐ'Ð'Ð'Ð'Ð'rA   c                 ód  — | j         j        sdS |d         sdS |d         dk    r)t          j        r|                     d¦  «        rd|d<   ndS |                      d¦  «        x}| _        |                     dt          j        ¦  «        |_        |                     d	d
¦  «        p|                     dd
¦  «        |_	        |                     dd¦  «        |_
        |d         |_        |d         x|_        |_        |d         |_        |                     d¦  «        p|                     d| j        ¦  «        |_        |                     d¦  «        |_        |                     d¦  «        |_        |                     ¦   «          |                     dd¦  «        s|                     ¦   «          |S )z²
	Creates the installation task for the current task generator, and executes it immediately if necessary

	:returns: An installation task
	:rtype: :py:class:`waflib.Build.inst`
	NrP  rV  r\  Úwin32_installrY  ÚinstÚchmodr]  r   rQ  Úrelative_trickFÚcwdÚrelative_baseÚinstall_userÚinstall_grouprS  T)rH   r   r   r¯   r   Úcreate_taskrM  ÚO644rp  r]  rq  rV  rP  rU  rQ  r$   rs  rt  ru  Ú
init_filesÚrun_now)r<   r=   Útsks      r@   rj  rj  £  s‡  € ð 	ŒÔð 	Ø€&Ø
ˆ<Ôð 	Ø€&à€v„J�,ÒÐ¥5¤>ÐØ‡V‚VˆOÑÔð 
Ø€2€f�:€:ð 
€6à×+Ò+¨FÑ3Ô3Ð3€€tÔØ�VŠV�G�UœZÑ(Ô(€„Ø�FŠF�6˜2ÑÔÐ< "§&¢&¨¸Ñ"<Ô"<€„Ø—f’fÐ-¨uÑ5Ô5€ÔØˆvŒJ€„Ø Ô-Ð-€„�#”(Ø�~Ô&€ÔØ—V’V˜E‘]”]ÐH b§f¢f¨_¸d¼iÑ&HÔ&H€ÔØ—F’F˜>Ñ*Ô*€ÔØ—V’V˜OÑ,Ô,€ÔØ‡‚ÑÔÐØ
�Šˆz˜4Ñ Ô ð Ø‡+‚+�-„-€-Ø€rA   c                 ó&   — d|d<    | j         di |¤ŽS )zr
	Creates an installation task for files

	:returns: An installation task
	:rtype: :py:class:`waflib.Build.inst`
	rR  rV  r   ©rj  ©r<   r=   s     r@   Úadd_install_filesr~  Æ  s&   € ð €€F�ØˆÔÐ#Ð# Ð#Ð#Ð#rA   c                 ó&   — d|d<    | j         di |¤ŽS )zz
	Creates an installation task for a single file

	:returns: An installation task
	:rtype: :py:class:`waflib.Build.inst`
	rY  rV  r   r|  r}  s     r@   Úadd_install_asr€  Ñ  ó&   € ð €€F�ØˆÔÐ#Ð# Ð#Ð#Ð#rA   c                 ó&   — d|d<    | j         di |¤ŽS )z|
	Creates an installation task for a symbolic link

	:returns: An installation task
	:rtype: :py:class:`waflib.Build.inst`
	r\  rV  r   r|  r}  s     r@   Úadd_symlink_asrƒ  Ü  r�  rA   c                   óx   ‡ — e Zd ZdZd„ Zd„ Zd„ Zˆ fd„Zd„ Zdd„Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )ro  z—Task that installs files or symlinks; it is typically executed by :py:class:`waflib.Build.InstallContext` and :py:class:`waflib.Build.UnInstallContext`c                 ó   — dS )z<Returns an empty string to disable the standard task displayr   r   rE   s    r@   Ú__str__zinst.__str__é  s   € à	ˆrA   c                 ó”   — | j         | j        z   | j        | j        j                             ¦   «         gz   }t          j        |¦  «        S )z(Returns a unique identifier for the task)ÚinputsÚoutputsr]  Ú	generatorr$   r]   r   ræ   )r<   rb   s     r@   Úuidzinst.uidí  s=   € àŒ�d”lÑ" d¤i°´Ô1D×1LÒ1LÑ1NÔ1NÐ%OÑO€#Ý	Œ�cÑ	Ô	ÐrA   c                 ó
  — | j         dk    rg }n?| j                             | j        ¦  «        }| j         dk    rt	          |¦  «        dk    sJ ‚|                      |¦  «         |                      ¦   «         }g }| j         dk    r†| j        rGt          j	         
                    | j        t          j	                             |¦  «        ¦  «        | _        |                     | j        j        j                             |¦  «        ¦  «         nä| j         dk    r8|                     | j        j        j                             |¦  «        ¦  «         n¡|D ]ž}| j        r9t          j	                             ||                     | j        ¦  «        ¦  «        }n%t          j	                             ||j        ¦  «        }|                     | j        j        j                             |¦  «        ¦  «         ŒŸ|                      |¦  «         dS )z1
		Initializes the task input and output nodes
		r\  rY  r   N)rV  rŠ  Úto_nodesrQ  r÷   Ú
set_inputsÚget_install_pathrq  r#   r$   Úrelpathr]  ÚdirnamerÕ   rH   rW   rm   r%   r[   rs  rd   Úset_outputs)r<   rˆ  rU  r‰  ÚyÚdestfiles         r@   rx  zinst.init_filesò  s½  € ð 
„Y�,ÒÐØ€6€6àŒN×#Ò# DÔ$5Ñ6Ô6€6Ø
„i�<ÒÐÝˆv‰;Œ;˜!ÒÐÐÐØ‡/‚/�&ÑÔÐà	×	Ò	Ñ	 Ô	 €$Ø€'Ø	„Y�,ÒÐØ
Ôð BÝ”—’ ¤	­2¬7¯?ª?¸4Ñ+@Ô+@ÑAÔA€D„IØ
‡>‚>�$”.Ô$Ô)×3Ò3°DÑ9Ô9Ñ:Ô:Ð:Ð:Ø„y�LÒ Ð Ø
‡>‚>�$”.Ô$Ô)×3Ò3°DÑ9Ô9Ñ:Ô:Ð:Ð:àð @ð @€qØÔð +Ý”—’˜T 1§;¢;¨tÔ/AÑ#BÔ#BÑCÔC€X€Xå”—’˜T 1¤6Ñ*Ô*€XØ‡N‚N�4”>Ô%Ô*×4Ò4°XÑ>Ô>Ñ?Ô?Ð?Ð?Ø×Ò�7ÑÔÐÐÐrA   c                 ó°   •— t          t          | ¦  «                             ¦   «         }|t          j        k    r| j        j        j        rt          j        S |S )z�
		Installation tasks are always executed, so this method returns either :py:const:`waflib.Task.ASK_LATER` or :py:const:`waflib.Task.RUN_ME`.
		)	r   ro  Úrunnable_statusr   ÚSKIP_MErŠ  rH   r   ÚRUN_ME)r<   rM   r?   s     €r@   r–  zinst.runnable_status  sG   ø€ õ 	�d�DÑÔ×)Ò)Ñ+Ô+€#Ø�DŒLÒÐ˜Tœ^Ô/Ô:ÐÝ
Œ+ÐØ	€*rA   c                 ó   — dS )z&
		Disables any post-run operations
		Nr   rE   s    r@   Úpost_runzinst.post_run  s	   € ð €$rA   Tc                 óº  — t          | j        t          j        ¦  «        r| j                             ¦   «         }nt	          j        | j        | j        ¦  «        }|r€t          j        j	        rot          j                             t          j        j	        t          j                             |¦  «        d                              t          j        ¦  «        ¦  «        }|S )zj
		Returns the destination path where files will be installed, pre-pending `destdir`.

		:rtype: string
		r   )rÅ   rP  r   r]   r   Ú
subst_varsre   r
   r.   Údestdirr#   r$   r%   Ú
splitdriveÚlstripÚsep)r<   r�  rU  s      r@   r�  zinst.get_install_path  s¡   € õ �”¥¤Ñ+Ô+ð 6Ø
Œ/×
!Ò
!Ñ
#Ô
#€4€4å
Ô
˜4œ?¨D¬HÑ
5Ô
5€4Øð \•”Ô(ð \Ý
Œ'�,Š,•w”Ô.µ´×0BÒ0BÀ4Ñ0HÔ0HÈÔ0K×0RÒ0RÕSUÔSYÑ0ZÔ0ZÑ
[Ô
[€4Ø	€+rA   c                 óÌ   — t           j        r-t          |¦  «        dk    r|                     d¦  «        sd|z   }t	          j        ||¦  «         |                      |¦  «         dS )aJ  
		Copies a file from src to tgt, preserving permissions and trying to work
		around path limitations on Windows platforms. On Unix-like platforms,
		the owner/group of the target file may be set through install_user/install_group

		:param src: absolute path
		:type src: string
		:param tgt: absolute path
		:type tgt: string
		i  z\\?\N)r   r¯   r÷   Ú
startswithÚshutilÚcopy2Ú	fix_perms)r<   r^  Útgts      r@   Úcopy_funzinst.copy_fun,  s_   € õ „^ð �˜C™œ 3š˜¨s¯~ª~¸iÑ/HÔ/H˜Ø	�S‰€3Ý„,ˆs�CÑÔÐØ‡.‚.�ÑÔÐÐÐrA   c                 óž   — |rJt           j                             |¦  «        }	 t          j        |¦  «         n# t          $ r Y dS w xY w|°HdS dS )zk
		Removes empty folders recursively when uninstalling.

		:param tgt: absolute path
		:type tgt: string
		N)r#   r$   r‘  Úrmdirr³   )r<   r¦  s     r@   Úrm_empty_dirszinst.rm_empty_dirs>  ss   € ð 	ð 
Ý	Œ�Š˜Ñ	Ô	€3ð
Ý„HˆS�M„M€M€MøÝ
ð 
ð 
ð 
Ø	€E€Eð
øøøð	 	ð 
ð 
ð 
ð 
ð 
s   £8 ¸
AÁAc                 ój  — | j         j        j        }|sdS | j        D ]&}|t          k    r|j                             ¦   «          Œ'| j        dk    rI|t          k    r| j        p| j	        } || j
        | j        d                              ¦   «         ¦  «         dS |t          k    r| j        p| j        }| j         j                             ¦   «         }t          | j        | j        ¦  «        D ]I\  }} ||                     ¦   «         |                     ¦   «         |                     |¦  «        ¦  «         ŒJdS )z+
		Performs file or symlink installation
		Nr\  r   )rŠ  rH   r   r‰  ÚINSTALLrá   rp   rV  Údo_linkÚ	do_unlinkr]  r]   Ú
do_installÚdo_uninstallrÚ   Úziprˆ  r[   )r<   r   rc   ÚfunrÚ   r“  s         r@   Úrunzinst.runL  s+  € ð Œ~Ô!Ô,€*Ø	ð 
Ø	€6àŒ<ð ð €aØ•GÒÐØ„H‡N‚NÑÔÐøØ	„Y�,ÒÐØ	•wÒ	Ð	/ 4¤<Ð	A°4´>€3Ø€3€t„y�$”,˜q”/×)Ò)Ñ+Ô+Ñ,Ô,Ð,Ð,Ð,à	•wÒ	Ð	2 4¤?Ð	G°dÔ6G€3Ø”Ô#×/Ò/Ñ1Ô1€;Ý�4”; ¤Ñ-Ô-ð <ð <�t€qˆ!Ø€Cˆ�	Š	‰Œ�Q—Y’Y‘[”[ !§+¢+¨kÑ":Ô":Ñ;Ô;Ð;Ð;ð<ð <rA   c                 óà   — |                       ¦   «         }|t          j        t          j        fvrt	          j        d| ›d|›�¦  «        ‚|                      ¦   «          t          j        | _        dS )zf
		Try executing the installation task right now

		:raises: :py:class:`waflib.Errors.TaskNotReady`
		zCould not process z	: status N)	r–  r   r˜  r—  r   ÚTaskNotReadyr³  ÚSUCCESSÚhasrun)r<   Ústatuss     r@   ry  zinst.run_now`  sb   € ð ×ÒÑ!Ô!€&Ø•D”K¥¤Ð.Ð.Ð.Ý	Ô	Ð	À$À$À$ÈÈÐOÑ	PÔ	PÐPØ‡(‚(�*„*€*Ý”€$„+€+€+rA   c           	      óÜ  — t           j        j        s†	 t          j        |¦  «        }t          j        |¦  «        }|j        dz   |j        k    r9|j        |j        k    r)| j        j        j	        st          j        d||¦  «         dS n# t          $ r Y nw xY w| j        j        j	        st          j        d||¦  «         	 t          j        |t          j        t	          j        t          j        |¦  «        j        ¦  «        z  ¦  «         n# t$          $ r Y nw xY w	 t          j        |¦  «         n# t          $ r Y nw xY w	 |                      ||¦  «         dS # t$          $ r†}t          j                             |¦  «        st          j        d|¦  «         n4t          j                             |¦  «        st          j        d|¦  «         t3          j        d|z  |¦  «        ‚d}~ww xY w)	aD  
		Copies a file from src to tgt with given file permissions. The actual copy is only performed
		if the source and target file sizes or timestamps differ. When the copy occurs,
		the file is always first removed and then copied so as to prevent stale inodes.

		:param src: file name as absolute path
		:type src: string
		:param tgt: file destination, as absolute path
		:type tgt: string
		:param lbl: file source description
		:type lbl: string
		:param chmod: installation mode
		:type chmod: int
		:raises: :py:class:`waflib.Errors.WafError` if the file cannot be written
		ró   z- install %s (from %s)Fz+ install %s (from %s)zFile %r does not existzInput %r is not a filezCould not install the file %rN)r
   r.   Úforcer#   r­   Úst_mtimeÚst_sizerŠ  rH   r2   r	   r{   r³   rp  r   rw  ÚS_IMODEÚst_moder–   r®   r§  r$   r`   r¿   Úisfiler   rP   )r<   r^  r¦  Úlblr=   Úst1Úst2r¦   s           r@   r¯  zinst.do_installl  s  € õ  
ŒÔ	ð ð
Ý
Œ'�#‰,Œ,€CÝ
Œ'�#‰,Œ,€Cð
 „|�aÑ˜3œ<Ò'Ð'¨C¬K¸3¼;Ò,FÐ,FØŒNÔÔ+ð 4Ý
„iÐ(¨#¨sÑ3Ô3Ð3ØˆEøøõ ð 	ð 	ð 	Ø€Dð	øøøð 
ŒÔ	Ô	(ð 1Ý„9Ð% s¨CÑ0Ô0Ð0ðÝ„8ˆC•”�dœl­2¬7°3©<¬<Ô+?Ñ@Ô@Ñ@ÑAÔAÐAÐAøÝ	ð ð ð Ø€4ðøøøðÝ„9ˆS�>„>€>€>øÝ	ð ð ð Ø€4ðøøøðCØ‡=‚=��cÑÔÐÐÐøÝ	ð Cð Cð CÝ
Œ'�.Š.˜Ñ
Ô
ð .Ý„JÐ'¨Ñ-Ô-Ð-Ð-ÝŒG�NŠN˜3ÑÔð .Ý„JÐ'¨Ñ-Ô-Ð-Ý	ŒÐ8¸3Ñ>ÀÑ	BÔ	BÐBøøøøðCøøøsO   “(B Â
BÂBÃ AD Ä
DÄDÄD2 Ä2
D?Ä>D?ÅE Å
G+Å%BG&Ç&G+c                 ól  — t           j        slt          | dd¦  «        pt          | j        dd¦  «        }t          | dd¦  «        pt          | j        dd¦  «        }|s|rt          j        ||pd|pd¦  «         t
          j                             |¦  «        st          j        || j        ¦  «         dS dS )aÎ  
		Change the ownership of the file/folder/link pointed by the given path
		This looks up for `install_user` or `install_group` attributes
		on the task or on the task generator::

			def build(bld):
				bld.install_as('${PREFIX}/wscript',
					'wscript',
					install_user='nobody', install_group='nogroup')
				bld.symlink_as('${PREFIX}/wscript_link',
					Utils.subst_vars('${PREFIX}/wscript', bld.env),
					install_user='nobody', install_group='nogroup')
		rt  Nru  r   )	r   r¯   r©   rŠ  Úlchownr#   r$   Úislinkrp  )r<   r¦  ÚuserrI   s       r@   r¥  zinst.fix_perms£  s½   € õ 
Œð /Ý
�$˜¨Ñ
-Ô
-Ð
^µ¸¼ÈÐY]Ñ1^Ô1^€4Ý�4˜¨$Ñ/Ô/Ðaµ7¸4¼>È?Ð\`Ñ3aÔ3a€5Ø
ð /ˆeð /Ý	„L��d�j˜b % +¨2Ñ.Ô.Ð.Ý	Œ�Š˜Ñ	Ô	ð Ý„8ˆC�”ÑÔÐÐÐðð rA   c                 ó¸  — t           j                             |¦  «        rCt          j        |¦  «        |k    r+| j        j        j        st          j        d||¦  «         dS dS 	 t          j	        |¦  «         n# t          $ r Y nw xY w| j        j        j        st          j        d||¦  «         t          j        ||¦  «         |                      |¦  «         dS )z«
		Creates a symlink from tgt to src.

		:param src: file name as absolute path
		:type src: string
		:param tgt: file destination, as absolute path
		:type tgt: string
		z- symlink %s (to %s)z+ symlink %s (to %s)N)r#   r$   rÅ  ÚreadlinkrŠ  rH   r2   r	   r{   r®   r³   Úsymlinkr¥  ©r<   r^  r¦  r=   s       r@   r­  zinst.do_link¹  sæ   € õ „W‡^‚^�CÑÔð �Rœ[¨Ñ-Ô-°Ò4Ð4Ø
Œ.Ô
Ô
)ð 0Ý„IÐ$ c¨3Ñ/Ô/Ð/Ð/Ð/ð0ð 0ð	Ý„Iˆc�N„N€N€NøÝ
ð 	ð 	ð 	Ø€Dð	øøøà
Œ.Ô
Ô
)ð 0Ý„IÐ$ c¨3Ñ/Ô/Ð/Ý„:ˆc�3ÑÔÐØ‡>‚>�#ÑÔÐÐÐs   Á$A9 Á9
BÂBc                 ó¸  — | j         j        j        st          j        d|¦  «         	 t          j        |¦  «         nˆ# t          $ r{}|j        t          j	        k    r\t          | dd¦  «        sd| _        t          j        d¦  «         t          j        dk    r t          j        d|j        |j        ¦  «         Y d}~nd}~ww xY w|                      |¦  «         dS )z1
		See :py:meth:`waflib.Build.inst.do_install`
		ú- remove %sÚuninstall_errorNTzHbuild: some files could not be uninstalled (retry with -vv to list them)r   z#Could not remove %s (error code %r))rŠ  rH   r2   r	   r{   r#   r®   r³   ÚerrnoÚENOENTr©   rÍ  rB  ÚverboseÚfilenamerª  )r<   r^  r¦  rÀ  r=   r¦   s         r@   r°  zinst.do_uninstallÏ  sã   € ð 
ŒÔ	Ô	(ð !Ý„9ˆ]˜CÑ Ô Ð ðKÝ„9ˆS�>„>€>€>øÝ	ð Kð Kð KØ„g•”ÒÐÝ�4Ð*¨DÑ1Ô1ð [Ø €TÔÝ	„YÐYÑZÔZÐZÝ„|�aÒÐÝ	„YÐ4°a´jÀ!Ä'ÑJÔJÐJøøøøøøøøøðKøøøð ×Ò�SÑÔÐÐÐs   ¨= ½
CÁA1B=Â=Cc                 óÈ   — 	 | j         j        j        st          j        d|¦  «         t          j        |¦  «         n# t          $ r Y nw xY w|                      |¦  «         dS )z.
		See :py:meth:`waflib.Build.inst.do_link`
		rÌ  N)	rŠ  rH   r2   r	   r{   r#   r®   r³   rª  rÊ  s       r@   r®  zinst.do_unlinkâ  sr   € ðØ
Œ.Ô
Ô
)ð "Ý„Iˆm˜SÑ!Ô!Ð!Ý„9ˆS�>„>€>€>øÝ	ð ð ð Ø€4ðøøøà×Ò�SÑÔÐÐÐs   ‚:= ½
A
Á	A
)T)r_  r`  ra  rb  r†  r‹  rx  r–  rš  r�  r§  rª  r³  ry  r¯  r¥  r­  r°  r®  re  rf  s   @r@   ro  ro  ç  s  ø€ € € € € ð _ð  _ðð ð ðð ð ð
ð ð ð:ð ð ð ð ðð ð ðð ð ð ðð ð ð$
ð 
ð 
ð<ð <ð <ð(
ð 
ð 
ð5Cð 5Cð 5Cðnð ð ð,ð ð ð,ð ð ð&
ð 
ð 
ð 
ð 
ð 
ð 
rA   ro  c                   ó&   ‡ — e Zd ZdZdZˆ fd„Zˆ xZS )ÚInstallContextz"installs the targets on the systemÚinstallc                 ó`   •—  t          t          | ¦  «        j        di |¤Ž t          | _        d S ©Nr   )r   rÔ  r   r¬  r   ©r<   r=   r?   s     €r@   r   zInstallContext.__init__ò  s1   ø€ Ø&…%�˜ÑÔÔ&Ð,Ð,¨Ð,Ð,Ð,Ý€$„/€/€/rA   ©r_  r`  ra  rb  rc  r   re  rf  s   @r@   rÔ  rÔ  î  sC   ø€ € € € € Ø)Ð)Ø€ðð ð ð ð ð ð ð ð rA   rÔ  c                   ó&   ‡ — e Zd ZdZdZˆ fd„Zˆ xZS )ÚUninstallContextzremoves the targets installedÚ	uninstallc                 ó`   •—  t          t          | ¦  «        j        di |¤Ž t          | _        d S r×  )r   rÛ  r   Ú	UNINSTALLr   rØ  s     €r@   r   zUninstallContext.__init__ú  s2   ø€ Ø(…%Õ˜$ÑÔÔ(Ð.Ð.¨2Ð.Ð.Ð.Ý€$„/€/€/rA   rÙ  rf  s   @r@   rÛ  rÛ  ö  sC   ø€ € € € € Ø$Ð$Ø€ðð ð ð ð ð ð ð ð rA   rÛ  c                   ó"   — e Zd ZdZdZd„ Zd„ ZdS )ÚCleanContextzcleans the projectÚcleanc                 ó  — |                       ¦   «          | j        s|                      ¦   «          |                      | j        g¦  «         	 |                      ¦   «          |                      ¦   «          dS # |                      ¦   «          w xY w©z7
		See :py:func:`waflib.Build.BuildContext.execute`.
		N)rs   r'   rh   r|   r   rá  r·   rE   s    r@   ru   zCleanContext.execute  sv   € ð ‡,‚,�.„.€.Ø	Œð Ø‡>‚>ÑÔÐà‡,‚,�”ˆ~ÑÔÐðØ‡:‚:�<„<€<à‡:‚:�<„<€<€<€<ø€4‡:‚:�<„<€<€<øøøs   ÁA6 Á6Bc                 ó  ‡ — t          j        d¦  «         t          ‰ d¦  «        r‰ j        D ]}|                     ¦   «          Œn“‰ j        ‰ j        k    rƒg }‰ j                             ¦   «         D ].}| 	                    ˆ fd„|t                   D ¦   «         ¦  «         Œ/‰ j                             ddd¬¦  «        D ]}||v rŒ|                     ¦   «          Œi ‰ j        _        t          D ]}|dk    rŒ	t          ‰ |i ¦  «         Œd	S )
a  
		Remove most files from the build directory, and reset all caches.

		Custom lists of files to clean can be declared as `bld.clean_files`.
		For example, exclude `build/program/myprogram` from getting removed::

			def build(bld):
				bld.clean_files = bld.bldnode.ant_glob('**',
					excl='.lock* config.log c4che/* config.h program/myprogram',
					quiet=True, generator=True)
		zbuild: clean calledÚclean_filesc              3   óL   •K  — | ]}‰j                              |¦  «        V — Œd S rÂ   )rW   Úfind_or_declare)rÝ   rf   r<   s     €r@   ú	<genexpr>z%CleanContext.clean.<locals>.<genexpr>$  s3   øè è € ÐDÐD°ˆtŒy×(Ò(¨Ñ+Ô+ÐDÐDÐDÐDÐDÐDrA   z**/*z*.lock* *conf_check_*/** config.log c4che/*T)ÚexclrT   rW   N)r	   r    r:   rå  Údeletero   rl   r'   ÚvaluesrÔ   r^   rY   rW   Úchildrenr9   r;   )r<   r   rb   re   r>   s   `    r@   rá  zCleanContext.clean  s6  ø€ õ „*Ð"Ñ#Ô#Ð#åˆT�=Ñ!Ô!ð ØÔð ð €qØ‡H‚H�J„J€J€Jðà„|�t”|Ò#Ð#à	€3ØŒm×"Ò"Ñ$Ô$ð Eð E€sØ‡J‚JÐDÐDÐDÐD°S½´^ÐDÑDÔDÑDÔDÐDÐDØŒL×!Ò! &Ð/[ÐcgÐ!ÑhÔhð ð €qØˆC€x€xØØ‡H‚H�J„J€J€JØ€$„)Ôåð ð €aØˆ6‚k€kØÝ
ˆ4��BÑÔÐÐðð rA   N)r_  r`  ra  rb  rc  ru   rá  r   rA   r@   rà  rà  þ  s=   € € € € € ØÐØ€ðð ð ðð ð ð ð rA   rà  c                   ó   — e Zd ZdZdZd„ ZdS )ÚListContextzlists the targets to executer4   c                 óº  — |                       ¦   «          | j        s|                      ¦   «          |                      | j        g¦  «         |                      ¦   «          t          j        ¦   «         | _        | j	        D ])}|D ]$}	 |j
        } |¦   «          Œ# t          $ r Y Œ!w xY wŒ*	 |                      d¦  «         n# t          j        $ r Y nw xY wt          | j        ¦  «        }|rt#          d„ |D ¦   «         ¦  «        nd}|D ]S}| j        |         }t%          |dd¦  «        }|r|                     |¦  «        }d|z  }t)          j        d||¬¦  «         ŒTdS )	zÙ
		In addition to printing the name of each build target,
		a description column will include text for each task
		generator which has a "description" field set.

		See :py:func:`waflib.Build.BuildContext.execute`.
		r   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rÂ   )r÷   )rÝ   r£   s     r@   rè  z&ListContext.execute.<locals>.<genexpr>X  s(   è è € Ð*Ð*˜Q•#�a‘&”&Ð*Ð*Ð*Ð*Ð*Ð*rA   r   Údescriptionz: %sÚGREEN)ÚlabelN)rs   r'   rh   r|   r   r}   r   r~   r   r7   r5  rŒ   rï   r   rP   Úsortedr-   Úmaxr©   rû   r	   Úpprint)	r<   rí   rî   rf   r0   Ú	line_justÚtargetr  Údescripts	            r@   ru   zListContext.execute4  s°  € ð ‡,‚,�.„.€.Ø	Œð Ø‡>‚>ÑÔÐà‡,‚,�”ˆ~ÑÔÐØ‡.‚.ÑÔÐõ Œ{‰}Œ}€$„*àŒ;ð 	ð 	€aØð 	ð 	€rð	Ø	Œ€Qð €Q�S„S€S€Søõ ð 
ð 
ð 
Ø	€Tð
øøøð	ðà×Ò˜ÑÔÐÐøÝ	Œð ð ð Ø€4ðøøøõ �4Ô,Ñ-Ô-€'ð /6Ð<�cÐ*Ð* 'Ð*Ñ*Ô*Ñ*Ô*Ð*¸1€)àð 
0ð 
0€fØ
Ô
# FÔ
+€4õ �d˜M¨2Ñ.Ô.€8Øð !Ø�\Š\˜)Ñ$Ô$€FØ˜Ñ €Hå„;ˆw˜ hÐ/Ñ/Ô/Ð/Ð/ð
0ð 
0s$   ÂBÂ
B$Â#B$Â)B? Â?CÃCN)r_  r`  ra  rb  rc  ru   r   rA   r@   rî  rî  0  s.   € € € € € Ø#Ð#Ø€ð00ð 00ð 00ð 00ð 00rA   rî  c                   ó2   ‡ — e Zd ZdZdZˆ fd„Zd„ Zd„ Zˆ xZS )ÚStepContextz7executes tasks in a step-by-step fashion, for debuggingÚstepc                 ót   •—  t          t          | ¦  «        j        di |¤Ž t          j        j        | _        d S r×  )r   rû  r   r
   r.   rW  rØ  s     €r@   r   zStepContext.__init__j  s6   ø€ Ø#…%��TÑÔÔ#Ð)Ð) bÐ)Ð)Ð)ÝŒÔ$€$„*€*€*rA   c           	      óÔ  — | j         s0t          j        d¦  «         t                               | ¦  «         dS g }| j        r%| j        dk    r| j                             d¦  «        }| j        D ]ú}|D ]0}|r
|j        |vrŒ	 |j	        } |¦   «          Œ!# t          $ r Y Œ-w xY w| j                              d¦  «        D ]ª}|                      |¦  «        }|D ]�}t          |t          j        ¦  «        r|g}n|j        }|D ]f}d}	|j        D ]}
 ||
d¬¦  «        rd}	 nŒ|j        D ]}
 ||
d¬¦  «        rd}	 nŒ|	r*|                     ¦   «         }t          j        d||¦  «         ŒgŒ‘Œ«ŒûdS )	a  
		Overrides :py:meth:`waflib.Build.BuildContext.compile` to perform a partial build
		on tasks matching the input/output pattern given (regular expression matching)::

			$ waf step --files=foo.c,bar.c,in:truc.c,out:bar.o
			$ waf step --files=in:foo.cpp.1.o # link task only

		zLAdd a pattern for the debug build, for example "waf step --files=main.c,app"Nr7  r,  F)ÚoutputTz%s -> exit %r)rW  r	   rB  r   r€   r0   r-  r7   rd   r5  rŒ   Úget_matcherrÅ   r   r*  rˆ  r‰  r³  r{   )r<   r0   rí   rî   rf   ÚpatÚmatcherrb   rz  Údo_execra   rM   s               r@   r€   zStepContext.compilen  s  € ð 
Œð 
Ý„9Ð[Ñ\Ô\Ð\Ý×Ò˜ÑÔÐØ	€6à€'Ø	„\ð %�d”l cÒ)Ð)ØŒ\×Ò Ñ$Ô$€7àŒ;ð ,ð ,€aØð 		ð 		€rØð �2”7 'Ð)Ð)Øð	Ø	Œ€Qð €Q�S„S€S€Søõ ð 
ð 
ð 
Ø	€Tð
øøøð
 Œj×Ò˜sÑ#Ô#ð ,ð ,€sØ×Ò˜sÑ#Ô#€GØð ,ð ,ˆÝ�2•t”yÑ!Ô!ð ØˆD€c€càŒH€cØð ,ð ,ˆØ€gØ”*ð ð ˆ$Ø
ˆ'�$˜uÐ
%Ñ
%Ô
%ð ØˆØˆðð ”+ð ð ˆ$Ø
ˆ'�$˜tÐ
$Ñ
$Ô
$ð ØˆØˆðð 
ð ,Ø�WŠW‰YŒY€sÝ„y� # sÑ+Ô+Ð+øð,ð,ð,ð,ð ,s   Â BÂ
BÂBc                 ó¨  ‡‡‡‡— dŠdŠ|                      d¦  «        rdŠ|                     dd¦  «        }n-|                      d¦  «        rdŠ|                     dd¦  «        }| j                             |¦  «        ŠdŠ‰sH|                      d¦  «        sd|z  }|                     d	¦  «        sd
|z  }t          j        |¦  «        Šˆˆˆˆfd„}|S )zÉ
		Converts a step pattern into a function

		:param: pat: pattern of the form in:truc.c,out:bar.o
		:returns: Python function that uses Node objects as inputs and returns matches
		:rtype: function
		Tzin:Fr   zout:Nú^z^.+?%sú$z%s$c                 óz   •— |r‰sdS |s‰sdS ‰r‰| k    S ‰                      |                      ¦   «         ¦  «        S )NF)Úmatchr]   )ra   rÿ  ÚanodeÚinnÚoutÚpatterns     €€€€r@   r  z&StepContext.get_matcher.<locals>.match¼  sW   ø€ Øð �Sð Øˆ5Ø
ð ˜ð Øˆ5àð )Ø�DŠ=Ðà�=Š=˜Ÿš™œÑ(Ô(Ð(rA   )r¢  r\   rW   rX   ÚendswithÚrer€   )r<   r  r  r	  r
  r  r  s      @@@@r@   r   zStepContext.get_matcher¡  s  øøøø€ ð 	€#Ø€#Ø‡^‚^�EÑÔð !Ø	€3Ø	�Š�U˜BÑ	Ô	€3€3Ø
‡~‚~�fÑÔð !Ø	€3Ø	�Š�V˜RÑ	 Ô	 €3à
Œ)×
Ò
˜cÑ
"Ô
"€%Ø€'Ø	ð Ø
�.Š.˜Ñ
Ô
ð Ø
�S‰.€CØ
�,Š,�sÑ
Ô
ð Ø
�#‰+€CÝŒZ˜‰_Œ_€7ð	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 
€,rA   )	r_  r`  ra  rb  rc  r   r€   r   re  rf  s   @r@   rû  rû  f  sb   ø€ € € € € Ø>Ð>Ø€ð%ð %ð %ð %ð %ð1,ð 1,ð 1,ðf%ð %ð %ð %ð %ð %ð %rA   rû  c                   ó    — e Zd ZdZdxZZd„ ZdS )Ú
EnvContextzOSubclass EnvContext to create commands that require configuration data in 'env'Nc                 óš   — |                       ¦   «          | j        s|                      ¦   «          |                      | j        g¦  «         dS rã  )rs   r'   rh   r|   r   rE   s    r@   ru   zEnvContext.executeË  sG   € ð ‡,‚,�.„.€.Ø	Œð Ø‡>‚>ÑÔÐØ‡,‚,�”ˆ~ÑÔÐÐÐrA   )r_  r`  ra  rb  r²  rc  ru   r   rA   r@   r  r  È  s3   € € € € € ØVÐVØÐ€€sðð ð ð ð rA   r  )0rb  r#   r�   rÎ  r  r£  r­   r�   ÚImportErrorÚpickleÚwaflibr   r   r   r   r   r   r	   r
   r   r   r&   rZ   r¬  rÞ  r-  r9   r^   rG  r!   r«   Úplatformr   ÚfeatureÚbefore_methodrl  Útaskgen_methodrj  r~  r€  rƒ  ro  rÔ  rÛ  rà  rî  rû  r  r   rA   r@   ú<module>r     s†  ðð
ð ð (Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'ðØ€€€€øØð ð ð ØÐÐÐÐÐðøøøà `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `à€	Ø !à€ð Eà
€Ø Và€	Ø XàD×JÒJÑLÔL€ðð €	Ø và€Ø Hà€	ð Tà€Ø„<�5ÒÐØ€ðjð jð jð jð j�7”?ñ jô jð jðX €„�Ñ Ô Ø€Ô�~Ð'7Ñ8Ô8ð(ð (ñ 9Ô8ñ !Ô ð(ð 	Ôð ð  ñ Ôð ðD 	Ôð$ð $ñ Ôð$ð 	Ôð$ð $ñ Ôð$ð 	Ôð$ð $ñ Ôð$ðEð Eð Eð Eð Eˆ4Œ9ñ Eô Eð EðNð ð ð ð �\ñ ô ð ðð ð ð ð �~ñ ô ð ð0ð 0ð 0ð 0ð 0�<ñ 0ô 0ð 0ðd40ð 40ð 40ð 40ð 40�,ñ 40ô 40ð 40ðl`ð `ð `ð `ð `�,ñ `ô `ð `ðD
ð 
ð 
ð 
ð 
�ñ 
ô 
ð 
ð 
ð 
s   œ! ¡	-¬-