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_DIRZ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_emulationZ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   r3   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<   rF   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rI   loadable_module)rA   r<   rF   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)rO   FinalOutputr=   rN   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.)r?   r>   rJ   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.)rA   r@   r?   rJ   r"   r"   r#   rQ      s   zTarget.FinalOutputN)
__name__
__module____qualname____doc__rG   rK   rO   rR   rS   rQ   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)x86Zx64zenvironment.)hash_for_rulestarget_outputsbase_dir	build_dirr0   Writerninjatoplevel_buildoutput_file_namer,   abs_build_dirr4   r5   abspathjoinobj_extwin_envr)   commonInvertRelativePathbuild_to_basebase_to_build)rF   r[   r\   r]   r^   output_filera   rb   r,   toplevel_dirr8   Zbuild_to_topZbase_to_topr"   r"   r#   rG      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+   GypPathToUniqueOutputr4   r5   re   config_name)rF   r5   product_dirr   r   Z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ConvertVSMacrosrs   r+   generator_default_variables)rF   r5   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*   ZExpandMacrosr   ru   r4   r5   normpathre   rj   )rF   r5   envZ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targetrp   z5'%s' can not be absolute path (see crbug.com/462153).)ru   r   toolsetr4   r5   splitisabsr   r   re   r]   )rF   r5   	qualifiedr   Zpath_dirZpath_basenamer"   r"   r#   rr   <  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   rr   r`   buildnewline)rF   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)r4   r5   r6   rb   )rF   r8   Z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<   Zstandalone_static_libraryr   target_rpathz\$$ORIGIN/lib/Nr   mac_toolchain_dirr%   r8   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)r0   r_   
OpenOutputr4   r5   re   ra   r   r   r8   rJ   r"   r#   	<genexpr>  s    
z(NinjaWriter.WriteSpec.<locals>.<genexpr>dependenciesTc                 S   r   r"   r"   r   r2   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-)rr   )r5   langrJ   r"   r#   <lambda>  s    z'NinjaWriter.WriteSpec.<locals>.<lambda>c                    s   g | ]
}|  jr|qS r"   )endswithrf   r   frJ   r"   r#   r     s    c                    s   g | ]}  |qS r"   r   r   orJ   r"   r#   r         zdWarning: Actions/rules writing object files don't work with multiarch targets, dropping. (target %s)rH   )=rs   r   r   r;   r   boolgetis_standalone_static_libraryr   r)   r   ZIsMacBundler,   is_mac_bundlexcode_settingsrx   ZXcodeSettingsr   r*   ZMsvsSettingsZGetArchr`   variablerg   ZGetActiveArchsarchsr   dictarch_subninjasr\   appendrR   rS   rE   r   r=   r>   WriteActionsRulesCopiesr?   	TypeErrorprintstrsubninjar   ZVerifyMissingSourcesrc   r   ZPrecompiledHeaderrr   rf   ZMacPrefixHeaderWriteSourcescollectionsdefaultdictlistr<   rB   rC   WriteTargetWriteMacBundlerQ   )rF   specrs   generator_flagsrw   r   r8   r   r   depr   extra_sourcesmac_bundle_dependsZcompile_depends_stamp	link_depsr   ZpchZobj_outputsrC   r7   Zis_empty_bundler"   rJ   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   )r4   r5   re   r   r6   r   relpath)r5   Zrelr|   basenamer{   r~   )outdirrF   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   Zidlflagsidl	variablesr   r   )rx   ZGetIdlBuildDatars   r   r   r`   r   extend)rF   r}   prebuildoutputsr7   varsflagsinputr"   )r   r   rF   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,   rx   ZHasExplicitIdlRulesOrActionsfilterr   )rF   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%   Zactions_rules_copies)r   r   WriteActions
WriteRulesWriteCopiesr,   r   r   ZIsIosFrameworkWriteiOSFrameworkHeadersr   WriteMacBundleResourcesWriteMacXCassetsWriteMacInfoPlist)rF   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   ru   r   )rF   Z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_nameZACTIONr   r%   Factiondepfileninja_use_consoler   console)r   c                       g | ]} | qS r"   r   r   ir   rF   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,   rx   IsRuleRunUnderCygwinru   intWriteNewNinjaRuler`   r   r   )rF   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   Zrule_sourcesr   r  ZRULEr   z%s r   r%   Fr  r   r  )r}   r{   r|   r~   r   r}   z${%s}c                    s    r|  ddS | S )Nro   rn   )r+   )r5   )r  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{   rF   r}   r"   r#   r     s
    
r   r	  r
  r{   r|   r~   r   c                    r  r"   r   r   r  r"   r#   r     r  Zunique_nameimplicitr   r   ) r  r   r[   r   rz   r,   rx   r  r  r  setaddsortedr   r   r4   r5   r   r   r6   remover   ru   rk   reprhashlibmd5	hexdigestr`   r   r   r   )rF   r   r   r   r   r   r  ruler   r  r  r  r  Zspecial_localsZneeded_variablesargumentvarr  r  r   Z
num_inputsr   Zwas_mac_bundle_resourceextra_bindingsZdirname_expandedZsource_expandedr"   )r   r|   r   r~   r  r{   rF   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   Zdestinationcopyr   )r   GetPerTargetSettingsr  r4   r5   r   r   r   re   r`   r   r   r   ZGetBundleContentsFolderPathr   )rF   r   r   r   r   	extra_envr   r)  r5   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   Z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)
ComputeMacBundleOutputrr   r   Zheader_map_pathmapr   r   r   r`   r   )
rF   r   r   r   r.  Zall_sourcesr/  r7   Z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'.r&  r   z	.xcassetsmac_tool)Zmactool_cmdzcopy-bundle-resourcer   r@   r   )r   r*  GetSortedXcodeEnvComputeExportEnvStringIsBinaryOutputFormatrs   r)   r   ZGetMacBundleResourcesrz   r2  r   ru   r4   r5   r6   r`   r   r   )	rF   Z	resourcesbundle_dependsr   r+  r   isBinaryr7   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)ZXCASSETS_APP_ICONZXCASSETS_LAUNCH_IMAGEz!assetcatalog_generated_info.plistzoutput-partial-info-plistz
Assets.carr&  compile_xcassetsr   keysr5  )r   rs   itemsr   rr   r   r4   r5   re   ZGetBundleResourceFolderr-   jsondumpsr,   r*  r6  r7  r   r`   r   )rF   r   r9  Zextra_argumentsZsettings_to_argZsettingsZsettings_keyZarg_namer   r   r   r=  r+  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"   r3   r,   r   rJ   r"   r#   r   x  r  z1NinjaWriter.WriteMacInfoPlist.<locals>.<listcomp>preprocess_infoplistdefinesr5  r&  zmerged_info.plistmerge_infoplistcopy_infoplistr   r=  r@   )r)   r   ZGetMacInfoPlistrz   r   r   ru   rr   r4   r5   r   re   r`   r   r6  r7  ZGetExtraPlistItemsrs   r-   r?  r@  r,   r8  r   )rF   r   r9  Z
info_plistoutrE  r+  Zintermediate_plistr   r=  r:  r"   rJ   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 )r8   N)WriteSourcesForArchr   r   rw   rs   precompiled_header
predependsrF   r   r   r"   r#   r     s    z+NinjaWriter.WriteSources.<locals>.<genexpr>)r   r`   r   r,   r   r   rS  r   )rF   
ninja_filers   rw   r   rV  rU  r   r"   rT  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 )ArI  r   rR  z	$cflags_cz
$cflags_ccr%   r   r   rp   z.c.pdbz.cc.pdbZ	pdbname_cZ
pdbname_ccZ	pchprefixcflagscflags_c	cflags_ccZCPPFLAGSr   ZCFLAGSZCXXFLAGSrJ  ZCPPFLAGS_hostZCFLAGS_hostZCXXFLAGS_hostrE  c                    rB  r"   rC  r   rJ   r"   r#   r     r  z3NinjaWriter.WriteSourcesForArch.<locals>.<listcomp>asmflagsZrcflagsc                    s   g | ]}t  | jqS r"   )r-   ru   r,   r   rJ   r"   r#   r     s    include_dirsZincludesc                    $   g | ]}t d |  jqS z-Ir-   r   r,   r  r  r"   r#   r         midl_include_dirsZ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   Zcppr   r   Trb  Sr   scc_sr   z_asm.objre  objcrg  objcxxrcz.resc                 S   s   g | ]\}}}|qS r"   r"   )r   r  gchr"   r"   r#   r   5  r   r  resource_include_dirsZresource_includesc                    r]  r^  r_  r  r  r"   r#   r   <  r`  )-r,   r   Z	GetCflagsZ
GetCflagsCZGetCflagsCCZGetCflagsObjCZGetCflagsObjCCrx   ZGetAsmflagsZGetComputedDefinesZGetCompilerPdbNameru   r   r4   r5   r   re   r]   r   WriteVariableListr   environr   r2  Z
GetRcflagsr   r  ZAdjustIncludeDirsZAdjustMidlIncludeDirsZGetPchBuildCommandsZ
GetIncluder   r   r6   rf   r   rE   ZHasExplicitAsmRulesrr   r:   ZGetObjDependenciesZGetFlagsModificationsr   r   WritePchTargets)'rF   rW  rs   rw   r   rV  rU  r   r8   Zextra_definesrX  rY  rZ  rj  rk  r[  Z	pdbpath_cZ
pdbpath_ccr   ZpdbpathrE  r\  ra  pch_commandsr~   r$  Zincluderi  r   Zhas_rc_sourcer}   filenamerf   commandr   r7   r  r   rs  r"   r  r#   rS    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.Nrc  rd  rf  rh  )rb  r   re  rg  r   r   ro  rp  r5  )r   r   )
rF   rW  rw  rr  Z	lang_flagr   r   Zvar_namer2  cmdr"   r"   r#   rv  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 )rR  )WriteLinkForArchr   r   rC   rw   rs   r   rF   r   r"   r#   r   \  s    

z)NinjaWriter.WriteLink.<locals>.<listcomp>r<   rL   r   rP   solipor5  lipo)
r,   r   r   r|  r`   ComputeOutputr   AppendPostbuildVariabler   r   )
rF   r   rs   rw   r   rC   r7   r  r%  Z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)
executablerM   rI   r<   r   r   r%   rP   )rN  z$ldxxNr  r   ZLDFLAGSrJ  ZLDFLAGS_hostr   r   Z	manifestsZintermediatemanifestldflagszlib/z-Wl,-rpath=\$$ORIGIN/%sz-Wl,-rpath=%sz-Wl,-rpath-link=%slibrary_dirsc                    s   g | ]	}j | qS r"   )rx   ry   r   lrs   rF   r"   r#   r     s    z0NinjaWriter.WriteLinkForArch.<locals>.<listcomp>c                    s"   g | ]}d t  | j qS )z	/LIBPATH:r_  r  rJ   r"   r#   r     s
    
c                    s"   g | ]}t d  |  jqS )z-Lr_  r  rJ   r"   r#   r     s
    	librariesZlibs)r  r  Zsonamer   r   rp   z.rsprA  r  link_file_listr@   z/NOENTRYz.libZ
implibflagz
/IMPLIB:%sz.pdbZ_notocsolibsr  )6r  r  r\   r   rK   r,   rB   rx   ZIsUseLibraryDependencyInputsrC   rD   rO   r@   r   rQ   r   rE   r  r   r  r   r4   ru  r   r   Z
GetLdflagsru   rz   r   rr   ComputeOutputFileNamera   rt  union_GetWinLinkRuleNameSuffixZIsEmbedManifestZ
GetDefFiler   r   r2  r)   rh   ZuniquerZAdjustLibrariesr5   EncodePOSIXShellArgumentGetWrapperNamer+   ZGetNoImportLibraryZ
GetPDBNameEncodePOSIXShellListr  r   r   )#rF   rW  r   rs   rw   r   rC   r8   ry  Zcommand_suffixZimplicit_depsr  Z
order_depsextra_link_depsr   r   ZlinkableZnew_depsZnew_depZfinal_outputr%  r7   Zis_executableZenv_ldflagsr  Zmanifest_base_nameZintermediate_manifestZmanifest_filesZdef_fileZrpathr  r  Zlinked_binaryr  Z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   rK   )r   r   rJ   r"   r#   r   .  s
    z*NinjaWriter.WriteTarget.<locals>.<genexpr>r   r<   nonerH   )r   ZopenbsdZnetbsdr%   
alink_thinr   libtool_flagslibflagsr   r   alink)r   r   r5  )anyr   r   r@   r<   r  r,   r   r`   r   r   ZGetLibtoolflagsr   rx   ZGetLibFlagsr   r   r   r  r   r  )rF   r   rs   rw   r   rC   r  r   r  r  r  r8   r7   r"   rJ   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<   rL   r   )is_command_startrI   package_ios_frameworkr5  versionpackage_frameworkr   )r   r1  r  r   r@   r   ZisIOSr`   r   r   ZGetFrameworkVersionrA   )rF   r   r   Zis_emptyr  r7   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.r&  r%   )r6  r,   GetMsvsToolchainEnv)rF   r'  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	   rv   )rx   ZGetVSMacroEnvrs   )rF   r'  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.)
rc   r)   r   r6  r   r4   r5   re   rj   rs   )rF   r'  rc   r"   r"   r#   r6    s   
zNinjaWriter.GetSortedXcodeEnvc                 C   s(   i }| j d}|r||d< | j|dS )z:Returns the variables Xcode would set for postbuild steps.ZCHROMIUM_STRIP_SAVE_FILEr&  )r   ZGetPerTargetSettingr6  )rF   Zpostbuild_settingsZ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   )rF   r   r   r7   r@   r  Z	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   Zcdz (z && c                 S   s   g | ]}t |qS r"   )r0   r1   )r   ry  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   ZGetSpecPostbuildCommandsZAddImplicitPostbuildsrs   r4   r5   r   re   rk   insertrh   r  rj   r7  r  )	rF   r   r7   Zoutput_binaryr  r  r   ZcommandsZcommand_stringr"   r"   r#   r    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;rA  )r   r0   r1   r)   rh   r  re   )rF   r   Z
export_strkvr"   r"   r#   r7    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   rz   ru   r4   r5   re   r   r  )rF   r5   r"   r"   r#   r1    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   )rM   rI   rH   r  Zproduct_prefixr   SHARED_LIB_SUFFIXr   r   Zproduct_extensionrp   Zproduct_namer   r   )rH   rM   rI   r  z%s%s%sr  z%s.stampzUnhandled output type %s)r)  rz   CalculateVariablesr,   r   r$   	Exception)	rF   r   r<   default_variablesZDEFAULT_PREFIXr!   ZDEFAULT_EXTENSIONr9   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   )rH   r  rI   rM   rt   r  rM   r   rI   rH   r8   z%sr   F)r   )r,   rx   ZGetOutputNamers   ru   r   ZGetExecutablePathr  r4   r5   re   r   r:   r   rr   )
rF   r   r8   r<   overriderx  r5   Ztype_in_output_rootZarchdirlibdirr"   r"   r#   r    s>   





zNinjaWriter.ComputeOutputc                 C   s0   t |trJ |d u rg }||d| d S )NrA  )
isinstancer   r   re   )rF   rW  r$  valuesr"   r"   r#   rt  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 )rv   )rx   ry   rk   rs   r   r    rJ   r"   r#   r   B  s
    

z1NinjaWriter.WriteNewNinjaRule.<locals>.<listcomp>rv   r   c                    s   g | ]	}t j| qS r"   )r)   r   r   r  )r   r"   r#   r   I      r   rp   z[^a-zA-Z0-9_]r  )r   r   r   r   r   z(?!|)z\$Nc                    s   g | ]	}  | jqS r"   )ru   rk   r  rJ   r"   r#   r   a  r  z.$unique_name.rspr   rA  z%%s gyp-win-tool action-wrapper $arch zcd %s; T)r   restatr  rspfilerspfile_content)r,   rx   ry   rs   r)   r   r   r   r   r'   subre   r2  r1   rj   ZBuildCygwinBashCommandLiner*   ZEncodeRspFileListsysr  r7  rh   r  r`   r"  r   )rF   r   r  r  r  r   r  r   r  Zprotectr  r  Zrun_inry  r"   r  r#   r  :  sV   






zNinjaWriter.WriteNewNinjaRuler   )T)F))rU   rV   rW   rG   ru   r   r   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rS  rv  r  r|  r   r   r  r  r6  r  r  r  r7  r1  r  r  rt  r  r"   r"   r"   r#   rY      s^    

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


2-rY   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   ZOSr  z.dylibZSHARED_LIB_DIRr   ZLIB_DIRr   N+generator_additional_non_configuration_keys"generator_additional_path_sections!generator_extra_sources_for_rulesr%   rp   r  r   r   r   rH   r   r   rI   Zandroidlinuxz.sor	   r   r   )r)   rh   	GetFlavor
setdefaultrz   Zgyp.generator.xcode	generatorZxcodegetattrr  r  r  MSVSUtilZTARGET_TYPE_EXTZgyp.generator.msvsZmsvsr*   ZCalculateCommonVariablesr4   r5   re   )r  paramsr,   Zxcode_generatorZextsZmsvs_generatorZoperating_systemr"   r"   r#   r  }  s^   r  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.optionsrp   r   
output_dirrH  )r4   r5   r   Zgenerator_outputr   r   re   )r  Zgenerator_dirr  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.r  Zgypfiles)toplevelqualified_out_dirN)rm   r4   r5   r   re   r  generator_filelist_paths)r  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)   rh   ZEnsureDirExistsopen)r5   moder"   r"   r#   r     s   
r   c                 C   s    | | d}|r|d | S |S )Nr   rA  )r   )rz  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.Z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dwLengthZdwMemoryLoadullTotalPhysZullAvailPhysZullTotalPageFileZullAvailPageFileZullTotalVirtualZullAvailVirtualZsullAvailExtendedVirtualN)rU   rV   rW   Zc_ulongZc_ulonglongZ_fields_r"   ctypesr"   r#   MEMORYSTATUSEX  s    r  r   l        ZGYP_LINK_CONCURRENCY_MAXl        r  z/proc/meminfoz^MemTotal:\s*(\d*)\s*kBi   darwin)Zsysctlz-nz
hw.memsize)r  r4   ru  r   r  platformr  Z	StructureZsizeofr  ZwindllZkernel32ZGlobalMemoryStatusExZbyrefmaxr  minr   r5   existsr  r'   compiler(   group
subprocessZcheck_output)
Z	pool_sizer  statZ	mem_limitZhard_capZmeminfoZmemtotal_reliner(   Z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.Z_embedr   r"   embed_manifestr"   r"   r#   r    rT   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)ZpythonrH  ldcmdZresnameZembed)r  r  )r  rH  Zbinary_typeZresource_namer  r"   r#   FullLinkCommand  s   z)_AddWinLinkRules.<locals>.FullLinkCommandZ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)r  ry  r  r  r  r  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)r  ry  r  r  r  N)	r  r  r4   ru  r   upperr  r  r"  )master_ninjar  r  Zrule_name_suffixZuse_separate_mspdbsrvZdlldescZdllcmdZ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 )Nr  r   zbuild.ninjax   )widthr%   zlib.exeZUNSETzlink.exez$ldrK  r   zc++z$ccz$cxxrL  rM  rP  rQ  r   make_global_settingsZARzAR.hostZCCzclang-clZCXXzCC.hostzCXX.hostZLDzLD.hostZNMzNM.hostZREADELFzREADELF.hostZ_wrapperz\.HOST$z.hostr   zexport DEVELOPER_DIR='%s' &&ZLINKc                    s   g | ]
}| d    qS )r   r"   )r   qualified_targetrs   target_dictsr"   r#   r     s    z+GenerateOutputForConfig.<locals>.<listcomp>Z"ninja_use_custom_environment_filesrZ   z -m32z -m64Zcl_Z	CC_targetZ
CXX_targetr   rN  r   zmidl.exerq  zrc.exeZml_x86zml.exeZml_x64zml64.exemtzmt.exerO  Z	AR_targetr   Z	NM_targetZREADELF_targetar_hostZAR_hostnm_hostZNM_hostreadelf_hostZREADELF_hostZCC_hostZCXX_hostz$(CC)z$(CXX)r   r   ld_host	ldxx_hostr  )depthZmsvcZgcczCC $outzU$cc -MMD -MF $out.d $defines $includes $cflags $cflags_c $cflags_pch_c -c $in -o $outz$out.d)r  ry  r   depsrn  zE$cc $defines $includes $cflags $cflags_c $cflags_pch_c -c $in -o $out)r  ry  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)r  ry  r  r  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)r  r  ry  r  r  r  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)r  ry  r  zLIB $outzU%s gyp-win-tool link-wrapper $arch False $ar /nologo /ignore:4221 /OUT:$out @$out.rspz$in_newline $libflags)r  ry  r  r  r  Fro  z	OBJC $outz[$cc -MMD -MF $out.d $defines $includes $cflags $cflags_objc $cflags_pch_objc -c $in -o $outrp  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 $libsZsolink_notoczSOLINK(module) $lib, POSTBUILDSz-bundleZsolink_module_notoczLINK $out, POSTBUILDSz1$ld $ldflags -o $out $in $solibs $libs$postbuildsrD  zPREPROCESS INFOPLIST $outzT$cc -E -P -Wno-trigraphs -x c $defines $in -o $out && plutil -convert xml1 $out $outrG  zCOPY INFOPLIST $inz:$env ./gyp-mac-tool copy-info-plist $in $out $binary $keysrF  zMERGE INFOPLISTS $inz-$env ./gyp-mac-tool merge-info-plist $out $inr<  zCOMPILE XCASSETS $inz.$env ./gyp-mac-tool compile-xcassets $keys $inr0  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_headersr4  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 $outr)  zCOPY $in $outz)%s gyp-win-tool recursive-mirror $in $outZzoszrm -rf $out && cp -fRP $in $outz>ln -f $in $out 2>/dev/null || (rm -rf $out && cp -af $in $out)Zbuild_fileszDmake_global_settings needs to be the same for all targets. %s vs. %szutf-8r   r   rp   z.ninja)rm   r   zShort names for targets.Zphonyc                 S   s   g | ]}|  qS r"   )rQ   )r   r   r"   r"   r#   r   	  r   z(Empty targets (output for completeness).allZdefault_target)Br)   rh   r  r   r4   r5   r   re   r  rm   r   r0   r_   ZCopyToolZParseQualifiedTargetri   r   r   ru  r>  lowerr'   r  r*   ZExtractSharedMSVSSystemIncludesZGenerateEnvironmentFilesr  r  r-   r   r   $generator_supports_multiple_toolsetsr+   r   r  r  r"  r  r  r  r  Z
AllTargetsr  r   ZMergeGlobalXcodeSettingsToSpecZRelativePathZQualifiedTargetencoder  r   r!  r|   r   rY   r   tellwritegetvaluecloser   rQ   r  r   Zcommentr   default)Gtarget_listr  datar  rs   r  r,   r   r^   ra   Zmaster_ninja_filer  rK  r   r   rN  r  rO  r  r  r   r   Zcc_host_global_settingZcxx_host_global_settingZclang_clrP  r  rQ  r  Z
build_filer  r  Zbuild_to_rootr  keyr   Z
key_prefixr   ZconfigsZshared_system_includesZcl_pathsr8   r5   ry  r  Z
cc_commandZcxx_commandZmtime_preserving_solink_baseZsolink_baseZsolink_suffixZall_targetsr   r  r\   Ztarget_short_namesZempty_target_namesZnon_empty_target_namesr  r   r   Zthis_make_global_settingsr   Zqualified_target_for_hashr[   	base_pathr   rl   Zninja_outputwriterrW  Z
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 )Nr  rH  r`   z-CzBuilding [%s]: %s)r4   r5   re   rm   r   r  Z
check_call)r
  r   r  r  rw   ZbuilddirZ	argumentsr"   r"   r#   PerformBuild	  s   
r  c                 C   s2   t  t jt j | \}}}}}t||||| d S r   )signalSIGINTSIG_IGNr  )Zarglistr	  r  r
  r  rs   r"   r"   r#   CallGenerateOutputForConfig	  s   r  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   rw   r%   r   r   Zparallel)r)   r   Z&CloneConfigurationForDeviceAndEmulatorr   rh   r  r  ZShardTargetsZInsertLargePdbShimsrz   r  multiprocessingZPoolr   r   r2  r  KeyboardInterruptZ	terminate)
r	  r  r
  r  Zuser_configZconfig_namesr  Zarglistsrs   er"   r"   r#   GenerateOutput	  sB   

r  )r   )6Z
__future__r   r   r)  r  r?  r  os.pathr4   r'   r  r  r  r)   Z
gyp.commonr   Zgyp.msvs_emulationZgyp.MSVSUtilr  Zgyp.xcode_emulation	cStringIOr   ImportErrorior   Zgyp.ninja_syntaxr0   rz   r  r  r  r  rh   ZCrossCompileRequestedr  r$   r-   r3   r:   objectr;   rY   r  r  r  r   r  r  r  r  r  r  r  r  r"   r"   r"   r#   <module>   s   "

n           04
71    Q		