U
    4_                     @   sL   d Z ddlZddlZdd ZG dd deZdd Zd	d
 Zi fddZdS )zPython module for generating .ninja files.

Note that this is emphatically not a required piece of Ninja; it's
just a helpful utility for build-file-generation systems that already
use Python.
    Nc                 C   s   |  dd dd ddS )Nz$ z$$  :z$:)replace)word r   N/home/jack/SDK/HandsomeMod/build_dir/hostpkg/ninja-1.10.2/misc/ninja_syntax.pyescape_path   s    r   c                   @   s~   e Zd ZdddZdd Zdd Zd d	d
Zdd Zd!ddZd"ddZ	dd Z
dd Zdd Zdd Zd#ddZdd ZdS )$WriterN   c                 C   s   || _ || _d S N)outputwidth)selfr   r   r   r   r   __init__   s    zWriter.__init__c                 C   s   | j d d S )N
)r   writer   r   r   r   newline#   s    zWriter.newlinec                 C   s6   t j|| jd dddD ]}| jd| d  qd S )N   F)break_long_wordsbreak_on_hyphensz# r   )textwrapwrapr   r   r   )r   textliner   r   r   comment&   s    
zWriter.commentr   c                 C   s>   |d krd S t |tr&dtd |}| d||f | d S )Nr   z%s = %s)
isinstancelistjoinfilter_line)r   keyvalueindentr   r   r   variable+   s
    
zWriter.variablec                 C   s"   |  d|  | jd|dd d S )Nzpool %sdepth   r#   r    r$   )r   namer%   r   r   r   pool2   s    zWriter.poolNFc                 C   s   |  d|  | jd|dd |r2| jd|dd |rF| jd|dd |rZ| jdddd |rn| jd	|dd |r| jd
ddd |r| jd|dd |	r| jd|	dd |
r| jd|
dd d S )Nzrule %scommandr&   r'   descriptiondepfile	generator1r*   restatrspfilerspfile_contentdepsr(   )r   r)   r+   r,   r-   r.   r*   r0   r1   r2   r3   r   r   r   rule6   s$    zWriter.rulec	                 C   s*  t |}dd |D }	dd t |D }
|rRdd t |D }|
d |
| |r|dd t |D }|
d |
| |rdd t |D }|	d |	| | d	d
|	d
|g|
 f  |d k	r| d|  |r&t|trt| }nt|}|D ]\}}| j	||dd q
|S )Nc                 S   s   g | ]}t |qS r   r   .0xr   r   r   
<listcomp>O   s     z Writer.build.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   r5   r6   r   r   r   r9   P   s     c                 S   s   g | ]}t |qS r   r5   r6   r   r   r   r9   S   s     |c                 S   s   g | ]}t |qS r   r5   r6   r   r   r   r9   W   s     z||c                 S   s   g | ]}t |qS r   r5   r6   r   r   r   r9   [   s   zbuild %s: %sr   z  pool = %sr&   r'   )
as_listappendextendr    r   r   dictiteritemsr$   )r   outputsr4   inputsimplicit
order_only	variablesZimplicit_outputsr*   Zout_outputsZ
all_inputsiteratorr!   valr   r   r   buildL   s:    






zWriter.buildc                 C   s   |  d|  d S )Nz
include %sr    r   pathr   r   r   includep   s    zWriter.includec                 C   s   |  d|  d S )Nzsubninja %srI   rJ   r   r   r   subninjas   s    zWriter.subninjac                 C   s   |  ddt|  d S )Nz
default %sr   )r    r   r;   )r   pathsr   r   r   defaultv   s    zWriter.defaultc                 C   s6   d}|d }|dkr2|| dkr2|d7 }|d8 }q|S )z<Returns the number of '$' characters right in front of s[i].r   r&   $r   )r   siZdollar_countZdollar_indexr   r   r   _count_dollars_before_indexy   s    
z"Writer._count_dollars_before_indexc                 C   s  d| }t |t | | jkr| jt | t d }|}|dd|}|dk sf| ||d dkr8qfq8|dk r|d }|d|d }|dk s| ||d dkrvqqv|dk rq| j||d|  d  ||d d }d|d  }q| j|| d	  dS )
z3Write 'text' word-wrapped at self.width characters.z  z $r   r   r   r&   z $
Nr   )lenr   rfindrS   findr   r   )r   r   r#   Zleading_spaceZavailable_spaceZspacer   r   r   r       s,    zWriter._linec                 C   s   | j   d S r   )r   closer   r   r   r   rW      s    zWriter.close)r
   )r   )NNFNFNNN)NNNNNN)r   )__name__
__module____qualname__r   r   r   r$   r*   r4   rH   rL   rM   rO   rS   r    rW   r   r   r   r   r	      s0   

           
      
$	
$r	   c                 C   s    | d krg S t | tr| S | gS r   )r   r   )inputr   r   r   r;      s
    
r;   c                 C   s   d| kst d| ddS )zbEscape a string such that it can be embedded into a Ninja file without
    further interpretation.r   z$Ninja syntax does not allow newlinesrP   z$$)AssertionErrorr   )stringr   r   r   escape   s    r^   c                    s    fdd}t d|| S )zExpand a string containing $vars as Ninja would.

    Note: doesn't handle the full Ninja variable syntax, but it's enough
    to make configure.py's use of it work.
    c                    s*   |  d}|dkrdS  ||dS )Nr&   rP    )groupget)mvar
local_varsvarsr   r   exp   s    
zexpand.<locals>.expz
\$(\$|\w*))resub)r]   rf   re   rg   r   rd   r   expand   s    rj   )	__doc__rh   r   r   objectr	   r;   r^   rj   r   r   r   r   <module>   s    