o
    6d$                     @   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)Zword r   ;/home/core/prj/personal/ioneye/spacetime_py/ninja_syntax.pyescape_path      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)Zbreak_long_wordsZbreak_on_hyphensz# r   )textwrapwrapr   r   r   )r   textliner   r   r   comment&   s
   
zWriter.commentr   c                 C   s>   |d u 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 |r| jd|dd |r#| jd|dd |r-| jdddd |r7| jd	|dd |rA| jd
ddd |rK| jd|dd |	rU| jd|	dd |
ra| jd|
dd d S d S )Nzrule %scommandr%   r&   descriptiondepfile	generator1r)   restatrspfilerspfile_contentdepsr'   )r   r(   r*   r+   r,   r-   r)   r/   r0   r1   r2   r   r   r   rule6   s&   zWriter.rulec
                 C   s<  t |}dd |D }
dd t |D }|r)dd t |D }|d || |r>dd t |D }|d || |rSdd t |D }|
d |
| | d	d
|
d
|g| f  |d urp| d|  |	d ur{| d|	  |rt|trt| }nt|}|D ]\}}| j	||dd q|S )Nc                 S      g | ]}t |qS r   r   .0xr   r   r   
<listcomp>O       z Writer.build.<locals>.<listcomp>c                 S   r4   r   r5   r6   r   r   r   r9   P   r:   c                 S   r4   r   r5   r6   r   r   r   r9   S   r:   |c                 S   r4   r   r5   r6   r   r   r   r9   W   r:   z||c                 S   r4   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   Zoutputsr3   inputsZimplicitZ
order_onlyZ	variablesimplicit_outputsr)   ZdyndepZout_outputsZ
all_inputsiteratorr    valr   r   r   buildL   s>   






zWriter.buildc                 C      |  d|  d S )Nz
include %sr   r   pathr   r   r   includer      zWriter.includec                 C   rG   )Nzsubninja %srH   rI   r   r   r   subninjau   rL   zWriter.subninjac                 C   s   |  ddt|  d S )Nz
default %sr   )r   r   r<   )r   pathsr   r   r   defaultx   r	   zWriter.defaultc                 C   sH   d}|d }|dkr"|| dkr"|d7 }|d8 }|dkr"|| dks|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 s2| ||d dkr3nq|dk rU|d }	 |d|d }|dk sS| ||d dkrTnq=|dk rZn'| j||d|  d  ||d d	 }d|d  }t |t | | jks| j|| d
  d	S )z3Write 'text' word-wrapped at self.width characters.z  z $Tr   r   r   r%   z $
Nr   )lenr   rfindrS   findr   r   )r   r   r"   Zleading_spaceZavailable_spaceZspacer   r   r   r      s2   zWriter._linec                 C   s   | j   d S r   )r   closer   r   r   r   rW      s   zWriter.close)r   )r   )NNFNFNNN)NNNNNNN)__name__
__module____qualname__r   r   r   r#   r)   r3   rF   rK   rM   rO   rS   r   rW   r   r   r   r   r
      s&    



&
	$r
   c                 C   s    | d u rg S t | tr| S | gS r   )r   r   )inputr   r   r   r<      s
   
r<   c                 C   s   d| vsJ 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$$r   )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\   re   rd   rf   r   rc   r   expand   s   ri   )	__doc__rg   r   r   objectr
   r<   r]   ri   r   r   r   r   <module>   s    