o
    b                    @   s  d dl m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
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Zd dlmZ d dlZzd dlmZ W n eya   d dlmZ Y nw d dlmZ d dlmZ dddddd	d
ddddddddZg ag ag adaej ! Z"dd Z#dd Z$dd Z%dd Z&G dd de'Z(G dd de'Z)dd  Z*d!d" Z+d#d$ Z,d8d&d'Z-d(d) Z.d*d+ Z/d,d- Z0d.d/ Z1d0d1 Z2d2d3 Z3d4d5 Z4d6d7 Z5dS )9    )print_functionN)
OrderedSet)StringIO)GetEnvironFallback libz.a$!INTERMEDIATE_DIRz$!PRODUCT_DIR/gen$!PRODUCT_DIR$|CONFIGURATION_NAME${root}
${dirname}	${source}${ext}${name})EXECUTABLE_PREFIXEXECUTABLE_SUFFIXSTATIC_LIB_PREFIXSTATIC_LIB_SUFFIXSHARED_LIB_PREFIXINTERMEDIATE_DIRSHARED_INTERMEDIATE_DIRPRODUCT_DIRCONFIGURATION_NAMERULE_INPUT_ROOTRULE_INPUT_DIRNAMERULE_INPUT_PATHRULE_INPUT_EXTRULE_INPUT_NAMEc                 C   s   |  |r| t|d  S | S N)
startswithlen)argprefix r#   5/usr/lib/python3/dist-packages/gyp/generator/ninja.pyStripPrefixH   s   
r%   c                 C   s8   t d| r| S |dkrtj| S d| dd d S )zTQuote a string such that it will be interpreted as a single argument
  by the shell.z^[a-zA-Z0-9_=.\\/-]+$win'z'"'"')rematchgypmsvs_emulationQuoteForRspFilereplace)r!   flavorr#   r#   r$   QuoteShellArgumentN   s
   r/   c                 C   s0   |dkr|  ddtd } ttd|  |S )zYTakes a preprocessor define and returns a -D parameter that's ninja- and
  shell-escaped.r&   #z\%03oz-D)r-   ordr/   ninja_syntaxescape)dr.   r#   r#   r$   DefineZ   s   r5   c                 C   s   t j| \} }d| ||f S )z&Adds an arch string to an output path.z%s.%s%s)ospathsplitext)outputarch	extensionr#   r#   r$   AddArchd   s   r<   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )Targetaz  Target represents the paths used within a single gyp target.

  Conceptually, building a single target A is a series of steps:

  1) actions/rules/copies  generates source/resources/etc.
  2) compiles              generates .o files
  3) link                  generates a binary (library/executable)
  4) bundle                merges the above in a mac bundle

  (Any of these steps can be optional.)

  From a build ordering perspective, a dependent target B could just
  depend on the last output of this series of steps.

  But some dependent commands sometimes need to reach inside the box.
  For example, when linking B it needs to get the path to the static
  library generated by A.

  This object stores those paths.  To keep things simple, member
  variables only store concrete paths to single files, while methods
  compute derived values like "the last output of the target".
  c                 C   s@   || _ d | _d | _d | _d | _d | _d | _d | _d | _d| _	d S )NF)
typepreaction_stampprecompile_stampactions_stampbinarybundlecomponent_objscompile_deps
import_libuses_cpp)selfr>   r#   r#   r$   __init__   s   
zTarget.__init__c                 C   s
   | j dv S )z;Return true if this is a target that can be linked against.)static_libraryshared_library)r>   rH   r#   r#   r$   Linkable   s   
zTarget.Linkablec                 C   s   |dks| j r	dS | jdv S )zOReturn true if the target should produce a restat rule based on a TOC
    file.r&   FrK   loadable_module)rC   r>   rH   r.   r#   r#   r$   UsesToc   s   
zTarget.UsesTocc                 C   s$   |  |r|  d S |  p| jS )z^Return the path, if any, that should be used as a dependency of
    any dependent action step..TOC)rQ   FinalOutputr?   rP   r#   r#   r$   PreActionInput   s   
zTarget.PreActionInputc                 C   s   | j p| jS )z_Return the path, if any, that should be used as a dependency of
    any dependent compile step.)rA   r@   rL   r#   r#   r$   PreCompileInput      zTarget.PreCompileInputc                 C   s   | j p| jp| jS )zKReturn the last output of the target, which depends on all prior
    steps.)rC   rB   rA   rL   r#   r#   r$   rS      s   zTarget.FinalOutputN)
__name__
__module____qualname____doc__rI   rM   rQ   rT   rU   rS   r#   r#   r#   r$   r=   j   s    
r=   c                   @   sb  e Zd Z	dPddZdPddZdd ZdPdd	ZdQddZdPddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Z	dPd+d,Zd-d. Zd/d0 Z	dPd1d2Zd3d4 Zd5d6 ZdPd7d8ZdPd9d:ZdPd;d<Zd=d> Z 	?dRd@dAZ!dBdC Z"dDdE Z#dFdG Z$dPdHdIZ%dPdJdKZ&dLdM Z'	dPdNdOZ(dS )SNinjaWriterNc
                 C   s   || _ || _|| _|| _t|| _|| _|| _|| _	d| _
|	dur.tjtj|	|| _
|dkr4dnd| _|dkrJi | _dD ]	}
d|
 | j|
< q@tj||	}tj||| _tj||	}tj||| _dS )z
    base_dir: path from source root to directory containing this gyp file,
              by gyp semantics, all input paths are relative to this
    build_dir: path from source root to build output
    toplevel_dir: path to the toplevel directory
    Nr&   z.objz.o)x86x64zenvironment.)hash_for_rulestarget_outputsbase_dir	build_dirr2   Writerninjatoplevel_buildoutput_file_namer.   abs_build_dirr6   r7   abspathjoinobj_extwin_envr*   commonInvertRelativePathbuild_to_basebase_to_build)rH   r^   r_   r`   ra   output_filerd   re   r.   toplevel_dirr:   build_to_topbase_to_topr#   r#   r$   rI      s,   
zNinjaWriter.__init__c                 C   s   d}||v r%|r| ||}n| |d d}| |d d}| |d}d}||v r=| d}| |tj|p9d|}d}| || j}|S )	zExpand specials like $!PRODUCT_DIR in |path|.

    If |product_dir| is None, assumes the cwd is already the product
    dir.  Otherwise, |product_dir| is the relative path to the product
    dir.
    r	   /r   \.r   genr
   )r-   GypPathToUniqueOutputr6   r7   rh   config_name)rH   r7   product_dirr   r   int_dirr   r#   r#   r$   ExpandSpecial   s    
zNinjaWriter.ExpandSpecialc                 C   sp   | j dkr| jj|| jd}|td |}|td |}|td |}|td |}|td |}|S )Nr&   configr   r   r   r   r   )r.   msvs_settingsConvertVSMacrosrx   r-   generator_default_variables)rH   r7   rootdirnamesourceextnamer#   r#   r$   ExpandRuleVariables  s   

zNinjaWriter.ExpandRuleVariablesc                 C   s   |r| j dkrtj||}n| j dkrtj||}|dr2| |}| j dkr0tj	
|}|S d|v r;| |}d|vsCJ |tj	
tj	| j|S )zTranslate a gyp path to a ninja path, optionally expanding environment
    variable references in |path| with |env|.

    See the above discourse on path conversions.macr&   z$!z$|$)r.   r*   xcode_emulationExpandEnvVarsr+   ExpandMacrosr   r{   r6   r7   normpathrh   rm   )rH   r7   envexpandedr#   r#   r$   GypPathToNinja(  s   





zNinjaWriter.GypPathToNinjaTc                 C   s   |  |}|drJ |d}| jdkr|d| j 7 }tj|\}}tj|r0J d| |r9| jd | }tjtj	|| j
||S )a%  Translate a gyp path to a ninja path for writing output.

    If qualified is True, qualify the resulting filename with the name
    of the target.  This is necessary when e.g. compiling the same
    path twice for two separate output targets.

    See the above discourse on path conversions.r   objtargetru   z5'%s' can not be absolute path (see crbug.com/462153).)r{   r   toolsetr6   r7   splitisabsr   r   rh   r`   )rH   r7   	qualifiedr   path_dirpath_basenamer#   r#   r$   rw   <  s   
	
z!NinjaWriter.GypPathToUniqueOutputc                 C   sv   |dd |D ksJ |t |dkr|rJ dS t |dks!|r7| |d }| jj|d||d}| j  |d S )	zGiven a list of targets, return a path for a single file
    representing the result of building all the targets or None.

    Uses a stamp file if necessary.c                 S      g | ]}|r|qS r#   r#   ).0tr#   r#   r$   
<listcomp>f      z:NinjaWriter.WriteCollapsedDependencies.<locals>.<listcomp>r   N   .stampstamp
order_only)r    rw   rc   buildnewline)rH   r   targetsr   r   r#   r#   r$   WriteCollapsedDependencies`  s   
z&NinjaWriter.WriteCollapsedDependenciesc                 C   s   t j| jd }d||f S )Nr   z%s.%s.ninja)r6   r7   r8   re   )rH   r:   output_file_baser#   r#   r$   _SubninjaNameForArchp  s   z NinjaWriter._SubninjaNameForArchc              	      s  | _ |d  _|d  _|d | }t|d  _t|dd _|dd _t	j
 j| _d	  _ _ jd
krQt	j
| _|dd	}|rQ| j_ jdkrt	j|| _ j|} jd j|   jdd|   jdd|   jdd|   jdd|   jdd|   jd
kr j| _t jdkrt fdd jD  _g }g }d|v r|d D ]#}	|	 jv r j|	 }
||
 j ||
   |
j!rd j_!qdd |D }dd |D } "d|} "d|}| j_#| j_$g }g } %|||| j_& jj&p"|}g }z
||dg  }W n t'yI   t(d t)| t(d!t)|d  w |rֈ jd
krkt jdkrk jD ]} j* +| q^d	} jdkrt	j,| j-| j. t	j/ j| j. j0 j1}nt	j
2 j j. fd"d#} 3 j||||||} fd$d|D }|rՈ jd
kst jdkr| fd%d|D 7 }nt(d&|d   n jd
krt jdkrt45t6} jj&p|} jdkr jj7d'kr| j_8| j_9d	}| o| }|s jj&s|r+ :|||||} jr+||  jr6 ;|||}|s;d	S  j< sEJ | jS )(zThe main entry point for NinjaWriter: write the build rules for a spec.

    Returns a Target object, which represents the output paths for this spec.
    Returns None if there are no outputs (e.g. a settings-only 'none' type
    target).target_namer   configurationsr>   standalone_static_libraryr   target_rpathz\$$ORIGIN/lib/Nr   mac_toolchain_dirr&   r:   ccz$cl_cxxcc_hostcxx_hostasmz$ml_r   c                 3   s6    | ]}|t ttj j |d fV  qdS )wN)r2   rb   
OpenOutputr6   r7   rh   rd   r   r   r:   rL   r#   r$   	<genexpr>  s    
z(NinjaWriter.WriteSpec.<locals>.<genexpr>dependenciesTc                 S   r   r#   r#   r   r4   r#   r#   r$   r     r   z)NinjaWriter.WriteSpec.<locals>.<listcomp>c                 S   r   r#   r#   r   r#   r#   r$   r     r   actions_dependscompile_dependssourceszextra_sources: zspec.get("sources"): c                    s     | d | S )N-)rw   )r7   langrL   r#   r$   <lambda>  s    z'NinjaWriter.WriteSpec.<locals>.<lambda>c                    s   g | ]
}|  jr|qS r#   )endswithri   r   frL   r#   r$   r     s    c                    s   g | ]}  |qS r#   r   r   orL   r#   r$   r         zdWarning: Actions/rules writing object files don't work with multiarch targets, dropping. (target %s)rJ   )=rx   r   r   r=   r   boolgetis_standalone_static_libraryr   r*   r   IsMacBundler.   is_mac_bundlexcode_settingsr~   XcodeSettingsr   r+   MsvsSettingsGetArchrc   variablerj   GetActiveArchsarchsr    dictarch_subninjasr_   appendrT   rU   rG   r   r?   r@   WriteActionsRulesCopiesrA   	TypeErrorprintstrsubninjar   VerifyMissingSourcesrf   r   PrecompiledHeaderrw   ri   MacPrefixHeaderWriteSourcescollectionsdefaultdictlistr>   rD   rE   WriteTargetWriteMacBundlerS   )rH   specrx   generator_flagsr}   r   r:   r   r   depr   extra_sourcesmac_bundle_dependscompile_depends_stamp	link_depsr   pchobj_outputsrE   r9   is_empty_bundler#   rL   r$   	WriteSpect  s   














zNinjaWriter.WriteSpecc                    s   j j\}}}dfdd	  fdd|D } fdd|D }|df |d|f }jj|d	|||d
 || dS )zhHandle the implicit VS .idl rule for one source file. Fills |outputs|
    with files that are generated.Nc                    sX   t j | } t j\}}t j|\}}| ||||} |r*t j| |} | S r   )r6   r7   rh   r   r8   r   relpath)r7   relr   basenamer   r   )outdirrH   r   r#   r$   fix_path  s   z)NinjaWriter._WinIdlRule.<locals>.fix_pathc                    s   g | ]\}}| |fqS r#   r#   )r   r   value)r   r   r#   r$   r     s    z+NinjaWriter._WinIdlRule.<locals>.<listcomp>c                    s   g | ]} |qS r#   r#   )r   p)r   r#   r$   r     r   r   idlflagsidl	variablesr   r   )r~   GetIdlBuildDatarx   r   r   rc   r   extend)rH   r   prebuildoutputsr9   varsflagsinputr#   )r   r   rH   r   r$   _WinIdlRule  s   
	
zNinjaWriter._WinIdlRulec                 C   sL   | j dksJ | j|rg S g }tdd |d D ]	}| ||| q|S )z3Writes rules to match MSVS's implicit idl handling.r&   c                 S   
   |  dS )Nz.idlr   xr#   r#   r$   r   )     
 z.NinjaWriter.WriteWinIdlFiles.<locals>.<lambda>r   )r.   r~   HasExplicitIdlRulesOrActionsfilterr   )rH   r   r   r   r   r#   r#   r$   WriteWinIdlFiles#  s   zNinjaWriter.WriteWinIdlFilesc                 C   s  g }| j r|dg dd }ng }g }d|v r$|| |d |||7 }d|v r5|| |d ||||7 }d|v rD|| |d ||7 }d|v rU| jdkrU|| ||7 }| jrd| j rd| 	||| | 
d|}| j r| || |}	| |	|}
| |
| |S )	zkWrite out the Actions, Rules, and Copies steps.  Return a path
    representing the outputs of these steps.mac_bundle_resourcesNactionsrulescopiesr   r&   actions_rules_copies)r   r   WriteActions
WriteRulesWriteCopiesr.   r  r   IsIosFrameworkWriteiOSFrameworkHeadersr   WriteMacBundleResourcesWriteMacXCassetsWriteMacInfoPlist)rH   r   r   r   r   r   r  extra_mac_bundle_resourcesr   xcassetspartial_info_plistr#   r#   r$   r   -  s8   z#NinjaWriter.WriteActionsRulesCopiesc                 C   s>   | j dkr|d| j  7 }|rd|| |f S d|| j|f S )zGenerate and return a description of a build step.

    |verb| is the short summary, e.g. ACTION or RULE.
    |message| is a hand-written description, or None if not available.
    |fallback| is the gyp-level name of the step, usable as a fallback.
    r   z(%s)z%s %sz	%s %s: %s)r   r{   r   )rH   verbmessagefallbackr#   r#   r$   GenerateDescriptionR  s
   
zNinjaWriter.GenerateDescriptionc              
      s@     g }|D ]}d|d jf }d|dd |}jdkr)j|nd}	|d }
|dd }|r<|}t|d	d
rFdnd }j	||
||	 ||d\}} fdd|d D }t|ddrp||d 7 }t|ddr~||d 7 } fdd|d D }j
j||||d ||7 }j
  q|S )N%s_%saction_nameACTIONr  r&   Factiondepfileninja_use_consoler   console)r   c                       g | ]} | qS r#   r   r   ir   rH   r#   r$   r   v      z,NinjaWriter.WriteActions.<locals>.<listcomp>inputsprocess_outputs_as_sourcesr   'process_outputs_as_mac_bundle_resourcesc                    r#  r#   r   r   r&  r#   r$   r   {  r'  r   )GetToolchainEnvr^   r  r   r.   r~   IsRuleRunUnderCygwinr{   intWriteNewNinjaRulerc   r   r   )rH   r	  r   r   r  all_outputsr  r   description	is_cygwinargsr   pool	rule_name_r(  r   r#   r&  r$   r  `  sB   




zNinjaWriter.WriteActionsc              
      sT    g }|D ]}d|vr|dg sqd|d jf }|d }	d|dd dtd  | }
jd	kr?j|nd
t|ddrKdnd }	||	|
|\}}	d}t
dg}|	D ]}|D ]}d| |v rs|| qfqbt|}fdd}fdd|dg D }|dg }t|}|r|d7 }|dkrt|dkrj|d ||dg}g }|D ]tjtj\ tj \ fdd|d D }t|dd
r||7 }|v }|st|dd
r||7 }|r| g }|D ]j}|dkr|d|f q	|dkr2j}|d||f q	|dkrIj}|d||f q	|dkrW|df q	|d krg|d | f q	|d ksrJ t|q	fd!d|D }jd	kr|d"t|d  f jj|||||d# || qq|S )$Nr  rule_sourcesr  r4  RULEr  z%s r   r&   Fr!  r   r"  )r   r   r   r   r   r   z${%s}c                    s    r|  ddS | S )Nrt   rs   )r-   )r7   )r1  r#   r$   cygwin_munge  s   z,NinjaWriter.WriteRules.<locals>.cygwin_mungec                    r#  r#   r   r$  r&  r#   r$   r     r'  z*NinjaWriter.WriteRules.<locals>.<listcomp>r(  r      r   c              
      s    g | ]} | qS r#   )r   r   )r   r   r   r   rH   r   r#   r$   r     s
    
r   r)  r*  r   r   r   r   c                    r#  r#   r   r   r&  r#   r$   r     r'  unique_nameimplicitr   r   ) r+  r   r^   r  r   r.   r~   r,  r-  r.  setaddsortedr    r   r6   r7   r   r   r8   remover   r{   rn   reprhashlibmd5	hexdigestrc   r   r   r   )rH   r
  r   r   r  r  r/  ruler   r2  r0  r3  r4  special_localsneeded_variablesargumentvarr8  r(  r   
num_inputsr   was_mac_bundle_resourceextra_bindingsdirname_expandedsource_expandedr#   )r   r   r   r   r1  r   rH   r   r$   r    s   


	








;zNinjaWriter.WriteRulesc              	   C   s   g }| j r| j  }| j|d}n|  }|D ]F}|d D ]?}tj|}tj|d }	| ||}
| tj|d |	|}|| j	j
|d|
|d7 }| jr\|| j  r\|| qq|S )Nadditional_settingsfilesr   destinationcopyr   )r   GetPerTargetSettingsr+  r6   r7   r   r   r   rh   rc   r   r   r   GetBundleContentsFolderPathr   )rH   r  r   r   r   	extra_envr   rS  r7   r   srcdstr#   r#   r$   r    s(   

zNinjaWriter.WriteCopiesc           
   	   C   sx   |   }|d }|d }| d}|| j_t| jtdd |}d|fdt| j|fg}	|| jj	|d||	|d	 d
S )zFPrebuild steps to generate hmap files and copy headers to destination.r   mac_framework_headerszheaders.hmapc                 S   r   )Nz.hr  r  r#   r#   r$   r   !  r  z6NinjaWriter.WriteiOSFrameworkHeaders.<locals>.<lambda>	frameworkcopy_headerscompile_ios_framework_headersr   N)
ComputeMacBundleOutputrw   r   header_map_pathmapr   r  r   rc   r   )
rH   r   r   r   rZ  all_sourcesr[  r9   all_headersr   r#   r#   r$   r    s   

z$NinjaWriter.WriteiOSFrameworkHeadersc           	   	   C   s   g }| j  }| j|d}| |}| j | j}tjt	d | j t
| j|D ]/\}}| |}tj|d dkrR| jj|d|dd|fd|fgd	 || q(|| q(|S )
z.Writes ninja edges for 'mac_bundle_resources'.rO  r   z	.xcassetsmac_tool)mactool_cmdzcopy-bundle-resourcer   rB   r   )r   rT  GetSortedXcodeEnvComputeExportEnvStringIsBinaryOutputFormatrx   r*   r   GetMacBundleResourcesr   r_  r   r{   r6   r7   r8   rc   r   r   )	rH   	resourcesbundle_dependsr  rV  r   isBinaryr9   resr#   r#   r$   r  (  s&   


z#NinjaWriter.WriteMacBundleResourcesc              	   C   s   |sdS i }ddd}| j j | j }| D ]\}}||}|r%|||< qd}	|r3| d}	|	|d< g }
|
tj| j 	 d |	rI|
|	 t
t|| j}| j  }| j|d}| |}|| jj|
d	|d
|fd|fgd |	S )a  Writes ninja edges for 'mac_bundle_resources' .xcassets files.

    This add an invocation of 'actool' via the 'mac_tool.py' helper script.
    It assumes that the assets catalogs define at least one imageset and
    thus an Assets.car file will be generated in the application resources
    directory. If this is not the case, then the build will probably be done
    at each invocation of ninja.Nzapp-iconzlaunch-image)XCASSETS_APP_ICONXCASSETS_LAUNCH_IMAGEz!assetcatalog_generated_info.plistzoutput-partial-info-plistz
Assets.carrO  compile_xcassetsr   keysre  )r   rx   itemsr   rw   r   r6   r7   rh   GetBundleResourceFolderr/   jsondumpsr.   rT  rf  rg  r   rc   r   )rH   r  rk  extra_argumentssettings_to_argsettingssettings_keyarg_namer   r  r   rq  rV  r   r#   r#   r$   r  >  sH   




zNinjaWriter.WriteMacXCassetsc                    s  t jtd  j j\}}}}|sdS  |}|r= tj	
|}d fdd|D } jj|d|d|fgd} j|d	} |}|rY d
} j|d||g} j j}	tt|	 j}	 j j}
 jj|d|d|fd|	fd|
fgd || dS )z.Write build rules for bundle Info.plist files.r   N c                       g | ]}t | jqS r#   r5   r.   r   rL   r#   r$   r   x  r'  z1NinjaWriter.WriteMacInfoPlist.<locals>.<listcomp>preprocess_infoplistdefinesre  rO  zmerged_info.plistmerge_infoplistcopy_infoplistr   rq  rB   )r*   r   GetMacInfoPlistr   r   r   r{   rw   r6   r7   r   rh   rc   r   rf  rg  GetExtraPlistItemsrx   r/   rt  ru  r.   rh  r   )rH   r  rk  
info_plistoutr  rV  intermediate_plistr   rq  rl  r#   rL   r$   r  l  sB   



zNinjaWriter.WriteMacInfoPlistc              	      s   j dkr6jdd jdd jdd jdd	 jd
d jdd jdd jdksBtjdkrNj S t fddjD S ).Write build rules to compile all of |sources|.hostarz$ar_hostr   $cc_hostr   	$cxx_hostldz$ld_hostldxxz
$ldxx_hostnmz$nm_hostreadelfz$readelf_hostr   r   c                 3   s4    | ]}|j j|  |d fV  qdS )r:   N)WriteSourcesForArchr   r   r}   rx   precompiled_header
predependsrH   r   r   r#   r$   r     s    z+NinjaWriter.WriteSources.<locals>.<genexpr>)r   rc   r   r.   r    r   r  r   )rH   
ninja_filerx   r}   r   r  r  r   r#   r  r$   r     s    
zNinjaWriter.WriteSourcesc	           '   
      s  g }	j dkr.jj||d}
j|}j|}dgj| }dgj| }nj dkrj|}j|}
j|}j|}j	|}	j
|j }}|sd}jdkrk|dj 7 }tjtj|jj}|d	 }|d
 }|d|g |d|g |djg n|dg }
|dg }|dg }jdkrtjdd tjdd  | }tjdd tjdd  | }n.jdkr	tjdd tjdd  | }tjdd tjdd  | }|dg |	 }|dfdd|D  j dkrD|dtj| |dfddj|jD  |dg }  j dkr[j||}|d  fd!d|D  j dkr|d"g }j||}|d# fd$d|D  ||}j dkrd%D ]\}}|||}|r||| q|d&g }|dtj|
 |dtj| |dtj| j dkr|d'tj| |d(tj| |d&tj| |   g }d)}|D ]}tj!|\}}|d*d+ }j"} |d,v r%d-}!d.j#_$nl|d/ks5|d0kr8j dkr8d1}!nY|d2krFj dkrFd3}!nKj dkr]|d4kr]j%|s]d4}!d5} n4j dkrk|d6krkd7}!n&j dkr}|d8kr}d9}!d.j#_$nj dkr|d:krd:}!d;} d.}nq|}"&||  }#|d+urt'|#|}#|(|"g|#g|}$g }%j dkr|)|"|#|$|!||j\}%}#}$|j*|#|!|"d<d |$D ||%d= |+|# q|r|d>|}&|d? fd@d|&D  ,|| |   |S )Ar  r   r  z	$cflags_cz
$cflags_ccr&   r   r   ru   z.c.pdbz.cc.pdb	pdbname_c
pdbname_cc	pchprefixcflagscflags_c	cflags_ccCPPFLAGSr   CFLAGSCXXFLAGSr  CPPFLAGS_hostCFLAGS_hostCXXFLAGS_hostr  c                    r|  r#   r}  r   rL   r#   r$   r     r'  z3NinjaWriter.WriteSourcesForArch.<locals>.<listcomp>asmflagsrcflagsc                    s   g | ]}t  | jqS r#   )r/   r{   r.   r   rL   r#   r$   r     s    include_dirsincludesc                    $   g | ]}t d |  jqS z-Ir/   r   r.   r$  r&  r#   r$   r         midl_include_dirsmidl_includesc                    r  r  r  r$  r&  r#   r$   r     r  ))ccflags_pch_c)r   cflags_pch_cc)mcflags_pch_objc)mmcflags_pch_objccarflagscflags_objccflags_objccFr   N)r   cppr   r   Tr  Sr   scc_sr   z_asm.objr  objcr  objcxxrcz.resc                 S   s   g | ]\}}}|qS r#   r#   )r   r5  gchr#   r#   r$   r   5  r   r;  resource_include_dirsresource_includesc                    r  r  r  r$  r&  r#   r$   r   <  r  )-r.   r   	GetCflags
GetCflagsCGetCflagsCCGetCflagsObjCGetCflagsObjCCr~   GetAsmflagsGetComputedDefinesGetCompilerPdbNamer{   r   r6   r7   r   rh   r`   r   WriteVariableListr   environr   r_  
GetRcflagsr   r+  AdjustIncludeDirsAdjustMidlIncludeDirsGetPchBuildCommands
GetIncluder   r   r8   ri   r   rG   HasExplicitAsmRulesrw   r<   GetObjDependenciesGetFlagsModificationsr   r   WritePchTargets)'rH   r  rx   r}   r   r  r  r   r:   extra_definesr  r  r  r  r  r  	pdbpath_c
pdbpath_ccr   pdbpathr  r  r  pch_commandsr   rI  includer  r   has_rc_sourcer   filenameri   commandr   r9   r<  r   r  r#   r&  r$   r    sX  
















 






zNinjaWriter.WriteSourcesForArchc           
      C   s`   |sdS |D ]'\}}}}ddddd| }ddd	d
d}| |}	|j||	|||fgd qdS )z-Writes ninja rules to compile prefix headers.Nr  r  r  r  )r  r   r  r  r   r   r  r  re  )r   r   )
rH   r  r  r  	lang_flagr   r   var_namer_  cmdr#   r#   r$   r  D  s   
zNinjaWriter.WritePchTargetsc           
         s   j dkstjdkrj S } fddjD }g }|}	js:||| d dv rZjsZ|d|f jj	||d gd	||d
 |S jj	|	d||d
 |S )0Write out a link step. Fills out target.binary. r   r   c                    s.   g | ]}j j| |  |d qS )r  )WriteLinkForArchr   r   rE   r}   rx   r   rH   r   r#   r$   r   \  s    

z)NinjaWriter.WriteLink.<locals>.<listcomp>r>   rN   r   rR   solipore  lipo)
r.   r    r   r  rc   ComputeOutputr   AppendPostbuildVariabler   r   )
rH   r   rx   r}   r   rE   r9   r(  rL  build_outputr#   r  r$   	WriteLinkU  s,   
zNinjaWriter.WriteLinkc           #   	      s  dddd|d  }d}	t  }
t  }t  }|r|| d|v rt  }|d D ]w}j|}|s2q'| }|rg }jdkrU|jrUj rU|j}|j	rT||j	 n&jdkrb|j
rb|j
g}n|jrw||j |
|jd	  n|jg}|D ]}||vr|| || q}| }|r||jkr|
| q'g }jjrjdkr|d
 ||}|du rĈjsĈ|||| |d dk}jdkrtjdd }njdkrtjdd }jdkrj td j|}|| }njdkrT|}j jj|||j\}}}|| } |d| |
!|}
|r< |d|g t"j# }	j$j}|rS|
| n4||dg  }|rt%|rd}jdkry|j7 }|d|  n|dj&  |d|   |dt'j| |dg }jdkr fdd|D }fdd|D }n	fdd|D }t(j)*t'j|dg }jdkr؈j+| }njdkrj+|} |d ||  |} |d!v r|d"tj,|d# f |d$t(j)-|f jdkr;|}!jrj. }!|r&|!d%| 7 }!|!d&7 }!|!/d'd(}!|d)t(j)-|!f jdkr|d*|f d+|vr~j0 s~|d, j_
|d-d.jj
 f j1 j|d/ }"|jj
g}|"r~||" n/js||d	 g}n$|d0 }njdkr|d*|f j1 j|d/ }"|"r||"g}t%|r|d1t(j)2t3|f |j4|||	 |t3|
t5||d2 | S )3r  linksolink_modulesolink)
executablerO   rK   r>   r   r   r&   rR   )r  z$ldxxNr  r   LDFLAGSr  LDFLAGS_hostr   r   	manifestsintermediatemanifestldflagszlib/z-Wl,-rpath=\$$ORIGIN/%sz-Wl,-rpath=%sz-Wl,-rpath-link=%slibrary_dirsc                    s   g | ]	}j | qS r#   )r~   r   r   lrx   rH   r#   r$   r     s    z0NinjaWriter.WriteLinkForArch.<locals>.<listcomp>c                    s"   g | ]}d t  | j qS )z	/LIBPATH:r  r  rL   r#   r$   r     s
    
c                    s"   g | ]}t d  |  jqS )z-Lr  r  rL   r#   r$   r     s
    	librarieslibs)r  r  sonamer   r   ru   z.rspr{  r5  link_file_listrB   z/NOENTRYz.lib
implibflagz
/IMPLIB:%sz.pdb_notocsolibsr;  )6r=  r>  r_   r   rM   r.   rD   r~   IsUseLibraryDependencyInputsrE   rF   rQ   rB   r   rS   r   rG   r  r   r  r   r6   r  r   r   
GetLdflagsr{   r   r   rw   ComputeOutputFileNamerd   r  union_GetWinLinkRuleNameSuffixIsEmbedManifest
GetDefFiler    r   r_  r*   rk   uniquerAdjustLibrariesr7   EncodePOSIXShellArgumentGetWrapperNamer-   GetNoImportLibrary
GetPDBNameEncodePOSIXShellListr?  r   r   )#rH   r  r   rx   r}   r   rE   r:   r  command_suffiximplicit_depsr  
order_depsextra_link_depsr   r   linkablenew_depsnew_depfinal_outputrL  r9   is_executableenv_ldflagsr  manifest_base_nameintermediate_manifestmanifest_filesdef_filerpathr  r  linked_binaryr  pdbnamer#   r  r$   r  p  sV  




























zNinjaWriter.WriteLinkForArchc                    s  t  fdd|dg D }|d dks|s%|s%| j_d j_ jjS |d dkr׈ | j_ jdvrJ jsJ jj	 jjd||d	  jjS g } j
r^ j
|}|r^|d
|f  jrp j| j}	|d|	f  jdks|t jdkr || jj jj  jj	 jjd|||d  jjS g }
 jD ]} ||} j| j	|d|| ||d |
| q || jj jj  jj	 jjd|
|d  jjS  ||||| j_ jjS )Nc                 3   s*    | ]}| j v r j | V  qd S r   )r_   r   rM   )r   r   rL   r#   r$   r   .  s    
z*NinjaWriter.WriteTarget.<locals>.<genexpr>r   r>   nonerJ   )r   openbsdnetbsdr&   
alink_thinr   libtool_flagslibflagsr   r   alink)r   r   re  )anyr   r   rB   r>   r  r.   r   rc   r   r   GetLibtoolflagsr   r~   GetLibFlagsr   r    r   r  r   r  )rH   r   rx   r}   r   rE   r  r   r  r   r(  r:   r9   r#   rL   r$   r   -  sj   
*
%
zNinjaWriter.WriteTargetc                 C   s   | j sJ |d dv }|  }|r|d7 }g }| j|||| jj| d |rR|sR|d dkr=| jjr=| jj|d||d n|	d| j
 f | jj|d	||d n
| jj|d
||d || j_|S )Nr>   rN   r   )is_command_startrK   package_ios_frameworkre  versionpackage_frameworkr   )r   r]  r  r   rB   r   isIOSrc   r   r   GetFrameworkVersionrC   )rH   r   r   is_emptyr(  r9   r   r#   r#   r$   r   a  s.   
zNinjaWriter.WriteMacBundlec                 C   s&   | j |d}| jdkr| j|d}|S )z:Returns the variables toolchain would set for build steps.rO  r&   )rf  r.   GetMsvsToolchainEnv)rH   rP  r   r#   r#   r$   r+  x  s   
zNinjaWriter.GetToolchainEnvc                 C   s   | j jd| jdS )z>Returns the variables Visual Studio would set for build steps.r	   r|   )r~   GetVSMacroEnvrx   )rH   rP  r#   r#   r$   r,    s   zNinjaWriter.GetMsvsToolchainEnvc                 C   s4   | j sJ | j }tj| j|tj|| j| j	|S )z6Returns the variables Xcode would set for build steps.)
rf   r*   r   rf  r   r6   r7   rh   rm   rx   )rH   rP  rf   r#   r#   r$   rf    s   
zNinjaWriter.GetSortedXcodeEnvc                 C   s(   i }| j d}|r||d< | j|dS )z:Returns the variables Xcode would set for postbuild steps.CHROMIUM_STRIP_SAVE_FILErO  )r   GetPerTargetSettingrf  )rH   postbuild_settingsstrip_save_filer#   r#   r$   GetSortedXcodePostbuildEnv  s   z&NinjaWriter.GetSortedXcodePostbuildEnvFc                 C   s*   |  ||||}|r|d|f dS dS )zAAdds a 'postbuild' variable if there is a postbuild for |output|.
postbuildsN)GetPostbuildCommandr   )rH   r   r   r9   rB   r%  	postbuildr#   r#   r$   r    s   z#NinjaWriter.AppendPostbuildVariablec           	   
   C   s   | j r|d dks|sdS t|| j}tjj|dd}|durC| j j| jtj	
tj	| j|ttj	
tj	| j|| j|dd}|sGdS |dtjd| jg | |  }|d	 d
dd |D  }|d|  d }|ryd| d
 S d| S )zReturns a shell command that runs all the postbuilds, and removes
    |output| if any of them fails. If |is_command_start| is False, then the
    returned string will start with ' && '.r>   r  r   T)quietNr   cdz (z && c                 S   s   g | ]}t |qS r#   )r2   r3   )r   r  r#   r#   r$   r     r   z3NinjaWriter.GetPostbuildCommand.<locals>.<listcomp>z$); G=$$?; ((exit $$G) || rm -rf %s) z&& exit $$G)(z$ && ()r   r/   r.   r*   r   GetSpecPostbuildCommandsAddImplicitPostbuildsrx   r6   r7   r   rh   rn   insertrk   r	  rm   rg  r2  )	rH   r   r9   output_binaryr%  r3  r   commandscommand_stringr#   r#   r$   r4    s>   zNinjaWriter.GetPostbuildCommandc              
   C   s<   g }|D ]\}}| d|ttj|f  qd|S )zGiven an environment, returns a string looking like
        'export FOO=foo; export BAR="${FOO} bar;'
    that exports |env| to the shell.zexport %s=%s;r{  )r   r2   r3   r*   rk   r  rh   )rH   r   
export_strkvr#   r#   r$   rg    s   
z"NinjaWriter.ComputeExportEnvStringc                 C   s,   | j sJ td }| tj|| j S )zDReturn the 'output' (full output path) to a bundle output directory.r   )r   r   r{   r6   r7   rh   r   r  )rH   r7   r#   r#   r$   r]    s
   
z"NinjaWriter.ComputeMacBundleOutputc           	      C   s   |s|d }t  t}t|d| ji |d |d |d |d d}|d||d}|d	 |d	 |d
 |d d}|d}|rGd| }n||d}d|v rV|d }n|d }|dkrct|d}|dv rnd|||f S |dkrvd| S td| )z@Compute the filename of the final output for the current target.r>   r.   r   r   r   )rO   rK   rJ   r  product_prefixr   SHARED_LIB_SUFFIXr   r   product_extensionru   product_namer   r   )rJ   rO   rK   r  z%s%s%sr  z%s.stampzUnhandled output type %s)rS  r   CalculateVariablesr.   r   r%   	Exception)	rH   r   r>   default_variablesDEFAULT_PREFIXr"   DEFAULT_EXTENSIONr;   r   r#   r#   r$   r    s:   




z!NinjaWriter.ComputeOutputFileNamec           
      C   sh  |d }| j dkr| j| j| j}|r|S |du r)| j dkr)|dv r)| j }n| ||}|du rEd|v rEtj	
|d |}| |S ddg}| j dkrZ| jd	krZ|d
dg7 }n| j dkri| jd	kri|d
g7 }|durd}| jd	kr~tj	
dd| j }tj	
|t||S ||v s| jr|S |d
krd}	| jd	krtj	
dd| j }	tj	
|	|S | j|ddS )z2Compute the path for the final output of the spec.r>   r&   Nr   )rJ   r  rK   rO   ry   r  rO   r   rK   rJ   r:   z%sr   F)r   )r.   r~   GetOutputNamerx   r{   r   GetExecutablePathr  r6   r7   rh   r   r<   r   rw   )
rH   r   r:   r>   overrider  r7   type_in_output_rootarchdirlibdirr#   r#   r$   r    s>   





zNinjaWriter.ComputeOutputc                 C   s0   t |trJ |d u rg }||d| d S )Nr{  )
isinstancer   r   rh   )rH   r  rI  valuesr#   r#   r$   r  4  s   zNinjaWriter.WriteVariableListc              
      s  j dkrfdd|D }jj|jd}nj dkr- fdd|D }tj| }j}jdkr<|dj 7 }|d| 7 }t	
d	d
|}g d}	ddtt	j|	 d }	t	
|	d d
|}d}
d}fdd|D }j dkr|d }
|r}dndj }|rj|j}ntj|}dtj |
 | }n  tj|}dj   | }jj||||d||
|d j  ||fS )zWrite out a new ninja "rule" statement for a given command.

    Returns the name of the new rule, and a copy of |args| with variables
    expanded.r&   c                    s"   g | ]} j j| j jd qS )r|   )r~   r   rn   rx   r   r!   rL   r#   r$   r   B  s
    

z1NinjaWriter.WriteNewNinjaRule.<locals>.<listcomp>r|   r   c                    s   g | ]	}t j| qS r#   )r*   r   r   rS  )r   r#   r$   r   I      r   ru   z[^a-zA-Z0-9_]r5  )r   r   r   r   r   z(?!|)z\$Nc                    s   g | ]	}  | jqS r#   )r{   rn   rS  rL   r#   r$   r   a  rT  z.$unique_name.rspr   r{  z%%s gyp-win-tool action-wrapper $arch zcd %s; T)r   restatr3  rspfilerspfile_content)r.   r~   r   rx   r*   r   r   r   r   r(   subrh   r_  r3   rm   BuildCygwinBashCommandLiner+   EncodeRspFileListsysr  rg  rk   r	  rc   rE  r   )rH   r   r2  r0  r1  r   r3  r   r4  protectrX  rY  run_inr  r#   r&  r$   r.  :  sV   






zNinjaWriter.WriteNewNinjaRuler   )T)F))rW   rX   rY   rI   r{   r   r   rw   r   r   r   r   r  r   r  r  r  r  r  r  r  r  r   r  r  r  r  r   r   r+  r,  rf  r2  r  r4  rg  r]  r  r  r  r.  r#   r#   r#   r$   r[      s^    

%


$ 
%&w."
 !
 >4


	
$


2-r[   c                 C   sv  t j|}|dkrC| dd | dd | dtd  | dtd  dd	lm  m} t|d
g a	t|dg a
t|dg ad	S |dkrt jj}| dd d|d  | d< d| d< d|d  | d< d| d< d|d  | d< dd	lm  m} t|d
g a	t|dg a
t j| | d	S |}|dkrd}| d| | dd | dtjdd | dtjdd d	S )zDCalculate additional variables for use in the build (called by gyp).r   OSrC  z.dylibSHARED_LIB_DIRr   LIB_DIRr   N+generator_additional_non_configuration_keys"generator_additional_path_sections!generator_extra_sources_for_rulesr&   ru   r  r   r   r   rJ   r   r   rK   androidlinuxz.sor	   r   r   )r*   rk   	GetFlavor
setdefaultr   gyp.generator.xcode	generatorxcodegetattrrc  rd  re  MSVSUtilTARGET_TYPE_EXTgyp.generator.msvsmsvsr+   CalculateCommonVariablesr6   r7   rh   )rH  paramsr.   xcode_generatorextsmsvs_generatoroperating_systemr#   r#   r$   rF  }  s^   rF  c                 C   s@   t j| d jp	d}| di dd}t jt j||S )zEReturns the path from the toplevel_dir to the build output directory.optionsru   r   
output_dirr  )r6   r7   r   generator_outputr   r   rh   )rs  generator_dirry  r#   r#   r$   ComputeOutputDir  s   r|  c                 C   s4   | d j }tjtj|t| d}||dadS )zBCalled by __init__ to initialize generator values based on params.rx  gypfiles)toplevelqualified_out_dirN)rp   r6   r7   r   rh   r|  generator_filelist_paths)rs  r~  r  r#   r#   r$   CalculateGeneratorInputInfo  s   


r  r   c                 C   s   t j|  t| |S )z;Open |path| for writing, creating directories if necessary.)r*   rk   EnsureDirExistsopen)r7   moder#   r#   r$   r     s   
r   c                 C   s    | | d}|r|d | S |S )Nr   r{  )r   )r  wrappersprogwrapperr#   r#   r$   CommandWithWrapper  s   r  c            
         sj  t tjdd} | r| S tjdv rMddl G  fddd j}| } ||_	 j
j | td|jd }tdt tjd	d
}t||S tjdrtjdrtd/}td}|D ]}||}|soqetdt |dd   W  d   S W d   dS 1 sw   Y  dS tjdkrzt tg d}	td|	d
 W S    Y dS dS )z6Returns a best-guess for a number of concurrent links.GYP_LINK_CONCURRENCYr   )win32cygwinNc                
       sX   e Zd Zd jfd jfd jfd jfd jfd jfd jfd jfd	 jfg	Zd
S )z1GetDefaultConcurrentLinks.<locals>.MEMORYSTATUSEXdwLengthdwMemoryLoadullTotalPhysullAvailPhysullTotalPageFileullAvailPageFileullTotalVirtualullAvailVirtualsullAvailExtendedVirtualN)rW   rX   rY   c_ulongc_ulonglong_fields_r#   ctypesr#   r$   MEMORYSTATUSEX  s    r  r   l        GYP_LINK_CONCURRENCY_MAXl        rg  z/proc/meminfoz^MemTotal:\s*(\d*)\s*kBi   darwin)sysctlz-nz
hw.memsize)r-  r6   r  r   r]  platformr  	Structuresizeofr  windllkernel32GlobalMemoryStatusExbyrefmaxr  minr   r7   existsr  r(   compiler)   group
subprocesscheck_output)
	pool_sizer  stat	mem_limithard_capmeminfomemtotal_reliner)   avail_bytesr#   r  r$   GetDefaultConcurrentLinks  sD   






r  c                 C   s   | rdS dS )zwReturns the suffix used to select an appropriate linking rule depending on
  whether the manifest embedding is enabled._embedr   r#   embed_manifestr#   r#   r$   r     rV   r   c              	      s    fdd}t  }ttjdddk}d|  }dtj|f }||dd	}| jd
| ||ddddd | jd| ||ddddd dtj|f }||dd}| jd| d|  |dddd dS )z7Adds link rules for Windows platform to |master_ninja|.c                    s$   ddd| }dt j|| | d S )N12)exedllz%(python)s gyp-win-tool link-with-manifests $arch %(embed)s %(out)s "%(ldcmd)s" %(resname)s $mt $rc "$intermediatemanifest" $manifests)pythonr  ldcmdresnameembed)r]  r  )r  r  binary_typeresource_namer  r#   r$   FullLinkCommand  s   z)_AddWinLinkRules.<locals>.FullLinkCommandGYP_USE_SEPARATE_MSPDBSRV0r   zLINK%s(DLL) $binaryz\%s gyp-win-tool link-wrapper $arch %s $ld /nologo $implibflag /DLL /OUT:$binary @$binary.rspz$binaryr  r  z$binary.rspz$libs $in_newline $ldflagsT	link_pool)r0  r  rX  rY  rW  r3  r  zK%s gyp-win-tool link-wrapper $arch %s $ld /nologo /OUT:$binary @$binary.rspr  r  zLINK%s $binaryz$in_newline $libs $ldflags)r0  r  rX  rY  r3  N)	r   r-  r6   r  r   upperr]  r  rE  )master_ninjar  r  rule_name_suffixuse_separate_mspdbsrvdlldescdllcmdexe_cmdr#   r  r$   _AddWinLinkRules  sD   




r  c           G         s  |d }t j|}|di }tjtjt| }tj|j	|}	t
tj|	d}
tj|
dd}t j||	| |dkrLd}d}d}d	}d
}nd}d}d}d}d}d}d}|}d }d }d }d }d }d}d}d}d}t j| d \}}}|| dg }t j||j	} i }!|D ]\}"}#|"dkrtj| |#}|"dkrtj| |#}|"dkrtj| |#}|dr|}|"dkrtj| |#}|"dkrtj| |#}|#}|"dkrtj| |#}|#}|"dkrtj| |#}|"dkrtj| |#}|"dkrtj| |#}|"d krtj| |#}|"d!krtj| |#}|"d"kr#tj| |#}|"d#r9tj| |#|!|"d td#  < qtj D ]&\}"}#|" d#rd|"d td#  }$td$d%|$}$tj| |#|!|$< q?|d&d }%|%rud'|% |!d(< |dkr͇ fd)d*| D }&d }'|d+dst j|&|}'t j|	||'t
}(t|( D ])\})}*|r|}*td|!t|*d}+|r|+|)d,krd-nd.7 }+|d/|) |+ qtd0dg|}|dtd|!| td1dg|}|d2td|!| |dkr|d3| |d4d5 |d| |d6d7 |d8d9 |d:d; |d<d= n:|d3td(|!| |d>td(|!| |dtd?dg| |d@krY|dtdAdg| |dtdBd!g| tr|sa|}|sf|}|dCtdDg| |dEtdFg| |dGtdHg| tdIg|}tdJg|}dK|v r|r| dK|}dL|v r|r| dL|}|dMtd|!| |dNtd|!| |dkr|dO| n|dOtd(|!| |dPtd(|!| |!  |j"dQt# dR |!  |dkrdSndT},|dkr|j$ddUdVdW|,dX |j$dYdUdZd[ |j$d2d\d]dW|,dX n;d^}-d_}.|j$ddU|-d`da|,db |j$d2d\|.d`dc|,db |j$d4dddet%j& d[ |j$d6dfdgt%j& d[ |j$dhdidjt%j& d[ |d@kr|dkr|j$dkdldmd[ |j$dndldod[ dpdqdrds }/|j$dtdudv|/dwdxi dydzdQd{ |j$d|d}dv|/dwdxi dyd~dQd{ |j$ddddQd n|dkr|j$dkddt%j& d`dd t'|dvd t'|dd n|j$ddddW|,dX |j$ddddW|,dX |j$dkddd[ |j$dddd[ |j$dddddi d[ d}0d|0dds }/d}1|j$dtddv|/|1dd dyddQd{ |j$dddv|0|1dd dyddQd{ |j$d|ddv|/|1dd dyddQd{ |j$dddv|0|1dd dyddQd{ |j$ddddQd |j$dddd[ |j$dddd[ |j$dddd[ |j$dddd[ |j$dddd[ |j$dddd[ |j$dddd[ |j$dddd[ |dkr|j$dddt%j& d[ n|j$dddd[ |dkr|j$dddt%j& d[ n|dkr|j$dddd[ n|j$dddd[ |!  t( }2|d D ]}t j)| tj|D ]}3|2*|3 qqt( }4i }5i }6t( }7t( }8| D ]}9t j|9\}}:};|| dg }<||<ksJ d|<|f |9 }=|d@kr-t j+,|| |= t j-||j	d}t j.||:|;}>|>/dʡ}>t01|>2 }?tj3|}@d}A|;dkr]|Ad|; 7 }Atj|A|@|:d }Bt4 }Ct5|?|5|@||C|	|B||j	dύ	}D|D6|= |}3|C7 dkrt
tj|	|B}E|E8|C9  W d    n	1 sw   Y  |C:  |;|B |3r|:|3< kr|=d dkr|6=|:g >|3 |3|5|9< |9|2v r|4*|3<  |8*|: q|7*|: q|6r
|!  |?dѡ t|6D ]}F|@|Fddd* |6|F D  q|7|8 }7|7r(|!  |?dԡ t|7D ]	}:|@|:dҡ q|4rA|!  |@ddt|4 |A|ddա |
:  d S )Nrx  r   zbuild.ninjax   )widthr&   zlib.exeUNSETzlink.exez$ldr  r   zc++z$ccz$cxxr  r  r  r  r   make_global_settingsARzAR.hostCCzclang-clCXXzCC.hostzCXX.hostLDzLD.hostNMzNM.hostREADELFzREADELF.host_wrapperz\.HOST$z.hostr   zexport DEVELOPER_DIR='%s' &&LINKc                    s   g | ]
}| d    qS )r   r#   )r   qualified_targetrx   target_dictsr#   r$   r     s    z+GenerateOutputForConfig.<locals>.<listcomp>"ninja_use_custom_environment_filesr\   z -m32z -m64cl_	CC_target
CXX_targetr   r  r   zmidl.exer  zrc.exeml_x86zml.exeml_x64zml64.exemtzmt.exer  	AR_targetr   	NM_targetREADELF_targetar_hostAR_hostnm_hostNM_hostreadelf_hostREADELF_hostCC_hostCXX_hostz$(CC)z$(CXX)r   r   ld_host	ldxx_hostr  )depthmsvcgcczCC $outzU$cc -MMD -MF $out.d $defines $includes $cflags $cflags_c $cflags_pch_c -c $in -o $outz$out.d)r0  r  r   depsr  zE$cc $defines $includes $cflags $cflags_c $cflags_pch_c -c $in -o $out)r0  r  zCXX $outzX$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc $cflags_pch_cc -c $in -o $outz_ninja -t msvc -e $arch -- $cc /nologo /showIncludes /FC @$out.rsp /c $in /Fo$out /Fd$pdbname_c zaninja -t msvc -e $arch -- $cxx /nologo /showIncludes /FC @$out.rsp /c $in /Fo$out /Fd$pdbname_cc z$out.rspz$$defines $includes $cflags $cflags_c)r0  r  rX  rY  r  z%$defines $includes $cflags $cflags_cczIDL $inzd%s gyp-win-tool midl-wrapper $arch $outdir $tlb $h $dlldata $iid $proxy $in $midl_includes $idlflagszRC $inzU%s gyp-win-tool rc-wrapper $arch $rc $defines $resource_includes $rcflags /fo$out $inr   zASM $outzS%s gyp-win-tool asm-wrapper $arch $asm $defines $includes $asmflags /c /Fo $out $inr!  zAR $outz'rm -f $out && $ar rcs $arflags $out $inr  z(rm -f $out && $ar rcsT $arflags $out $inzif [ ! -e $lib -o ! -e $lib.TOC ]; then %(solink)s && %(extract_toc)s > $lib.TOC; else %(solink)s && %(extract_toc)s > $lib.tmp && if ! cmp -s $lib.tmp $lib.TOC; then mv $lib.tmp $lib.TOC ; fi; fiz;$ld -shared $ldflags -o $lib -Wl,-soname=$soname %(suffix)szI{ $readelf -d $lib | grep SONAME ; $nm -gD -f p $lib | cut -f1-2 -d' '; })r  extract_tocr  zSOLINK $libTsuffixz@$link_file_listz$link_file_listz<-Wl,--whole-archive $in $solibs -Wl,--no-whole-archive $libs)r0  rW  r  rX  rY  r3  r  zSOLINK(module) $libz3-Wl,--start-group $in $solibs $libs -Wl,--end-groupr  z	LINK $outzH$ld $ldflags -o $out -Wl,--start-group $in $solibs $libs -Wl,--end-group)r0  r  r3  zLIB $outzU%s gyp-win-tool link-wrapper $arch False $ar /nologo /ignore:4221 /OUT:$out @$out.rspz$in_newline $libflags)r0  r  rX  rY  r  Fr  z	OBJC $outz[$cc -MMD -MF $out.d $defines $includes $cflags $cflags_objc $cflags_pch_objc -c $in -o $outr  zOBJCXX $outz^$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_objcc $cflags_pch_objcc -c $in -o $outzLIBTOOL-STATIC $out, POSTBUILDSzarm -f $out && ./gyp-mac-tool filter-libtool libtool $libtool_flags -static -o $out $in$postbuildsr  zLIPO $out, POSTBUILDSz6rm -f $out && lipo -create $in -output $out$postbuildsr  zSOLIPO $out, POSTBUILDSz\rm -f $lib $lib.TOC && lipo -create $in -output $lib$postbuilds &&%(extract_toc)s > $lib.TOCr  z]{ otool -l $lib | grep LC_ID_DYLIB -A 5; nm -gP $lib | cut -f1-2 -d' ' | grep -v U$$; true; }z($ld %(type)s $ldflags -o $lib %(suffix)szif [ ! -e $lib -o ! -e $lib.TOC ] || otool -l $lib | grep -q LC_REEXPORT_DYLIB ; then %(solink)s && %(extract_toc)s > $lib.TOC; else %(solink)s && %(extract_toc)s > $lib.tmp && if ! cmp -s $lib.tmp $lib.TOC; then mv $lib.tmp $lib.TOC ; fi; fiz@$link_file_list$postbuildszSOLINK $lib, POSTBUILDSz-shared)r  r>   z$in $solibs $libssolink_notoczSOLINK(module) $lib, POSTBUILDSz-bundlesolink_module_notoczLINK $out, POSTBUILDSz1$ld $ldflags -o $out $in $solibs $libs$postbuildsr~  zPREPROCESS INFOPLIST $outzT$cc -E -P -Wno-trigraphs -x c $defines $in -o $out && plutil -convert xml1 $out $outr  zCOPY INFOPLIST $inz:$env ./gyp-mac-tool copy-info-plist $in $out $binary $keysr  zMERGE INFOPLISTS $inz-$env ./gyp-mac-tool merge-info-plist $out $inrp  zCOMPILE XCASSETS $inz.$env ./gyp-mac-tool compile-xcassets $keys $inr\  z2COMPILE HEADER MAPS AND COPY FRAMEWORK HEADERS $inz$env ./gyp-mac-tool compile-ios-framework-header-map $out $framework $in && $env ./gyp-mac-tool copy-ios-framework-headers $framework $copy_headersrc  zMACTOOL $mactool_cmd $inz1$env ./gyp-mac-tool $mactool_cmd $in $out $binaryr(  z"PACKAGE FRAMEWORK $out, POSTBUILDSzG./gyp-mac-tool package-framework $out $version$postbuilds && touch $outr&  z&PACKAGE IOS FRAMEWORK $out, POSTBUILDSzC./gyp-mac-tool package-ios-framework $out $postbuilds && touch $outr   z
STAMP $outz%s gyp-win-tool stamp $outz${postbuilds}touch $outrS  zCOPY $in $outz)%s gyp-win-tool recursive-mirror $in $outzoszrm -rf $out && cp -fRP $in $outz>ln -f $in $out 2>/dev/null || (rm -rf $out && cp -af $in $out)build_fileszDmake_global_settings needs to be the same for all targets. %s vs. %szutf-8r   r   ru   z.ninja)rp   r   zShort names for targets.phonyc                 S   s   g | ]}|  qS r#   )rS   )r   r  r#   r#   r$   r   	  r   z(Empty targets (output for completeness).alldefault_target)Br*   rk   rh  r   r6   r7   r   rh   r|  rp   r   r2   rb   CopyToolParseQualifiedTargetrl   r   r    r  rr  lowerr(   rZ  r+   ExtractSharedMSVSSystemIncludesGenerateEnvironmentFilesr?  r  r/   r   r   $generator_supports_multiple_toolsetsr-   r   r3  r  rE  r]  r  r  r=  
AllTargetsr>  r   MergeGlobalXcodeSettingsToSpecRelativePathQualifiedTargetencoderB  rC  rD  r   r   r[   r   tellwritegetvaluecloser   rS   ri  r   commentr   default)Gtarget_listr  datars  rx   rx  r.   r   ra   rd   master_ninja_filer  r  r   r   r  r  r  r  r  r   r   cc_host_global_settingcxx_host_global_settingclang_clr  r  r  r  
build_filer5  r  build_to_rootr  keyr   
key_prefixr   configsshared_system_includescl_pathsr:   r7   r  r  
cc_commandcxx_commandmtime_preserving_solink_basesolink_basesolink_suffixall_targetsr   r/  r_   target_short_namesempty_target_namesnon_empty_target_namesr  r   r   this_make_global_settingsr   qualified_target_for_hashr^   	base_pathr   ro   ninja_outputwriterr  
short_namer#   r  r$   GenerateOutputForConfigG  s  	



 








	

				













r+  c                 C   sL   |d }|D ]}t j|jd|}dd|g}td||f  t| qd S )Nrx  r  rc   z-CzBuilding [%s]: %s)r6   r7   rh   rp   r   r  
check_call)r  r   rs  rx  r}   builddir	argumentsr#   r#   r$   PerformBuild	  s   
r/  c                 C   s2   t  t jt j | \}}}}}t||||| d S r   )signalSIGINTSIG_IGNr+  )arglistr  r  r  rs  rx   r#   r#   r$   CallGenerateOutputForConfig	  s   r4  c           
   
   C   s  t j|}|di dd }t j|dkr)t| |\} }t| |t	\} }|r5t
| |||| d S || d  d }|d ruz!tt|}g }|D ]}|| ||||f qM|t| W d S  tyt }	 z|  |	d }	~	ww |D ]
}t
| |||| qwd S )Nr   r}   r&   r   r   parallel)r*   r   &CloneConfigurationForDeviceAndEmulatorr   rk   rh  rn  ShardTargetsInsertLargePdbShimsr   r+  multiprocessingPoolr    r   r_  r4  KeyboardInterrupt	terminate)
r  r  r  rs  user_configconfig_namesr3  arglistsrx   er#   r#   r$   GenerateOutput	  sB   

rA  )r   )6
__future__r   r   rS  rB  rt  r9  os.pathr6   r(   r0  r  r]  r*   
gyp.commonr   gyp.msvs_emulationgyp.MSVSUtilrn  gyp.xcode_emulation	cStringIOr   ImportErrorior   gyp.ninja_syntaxr2   r   rc  rd  re  r  rk   CrossCompileRequestedr  r%   r/   r5   r<   objectr=   r[   rF  r|  r  r   r  r  r   r  r+  r/  r4  rA  r#   r#   r#   r$   <module>   s   "

n           04
71    Q		