U
    Zb$                     @   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   K/home/jack/SDK/immortalwrt/build_dir/host/ninja-1.11.0/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   sB  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|  |	d k	r| d|	  |r>t|trt| }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 = %sz  dyndep = %sr&   r'   )
as_listappendextendr    r   r   dictiteritemsr$   )r   outputsr4   inputsimplicit
order_only	variablesZimplicit_outputsr*   dyndepZ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   includer   s    zWriter.includec                 C   s   |  d|  d S )Nzsubninja %srJ   rK   r   r   r   subninjau   s    zWriter.subninjac                 C   s   |  ddt|  d S )Nz
default %sr   )r    r   r;   )r   pathsr   r   r   defaultx   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_index{   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   rfindrT   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   rX      s    zWriter.close)r
   )r   )NNFNFNNN)NNNNNNN)r   )__name__
__module____qualname__r   r   r   r$   r*   r4   rI   rM   rN   rP   rT   r    rX   r   r   r   r   r	      s2   

           
        
&	
$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 newlinesrQ   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&   rQ    )groupget)mvar
local_varsvarsr   r   exp   s    
zexpand.<locals>.expz
\$(\$|\w*))resub)r^   rg   rf   rh   r   re   r   expand   s    rk   )	__doc__ri   r   r   objectr	   r;   r_   rk   r   r   r   r   <module>   s    