o
    7d$                     @   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   6/home/core/prj/e3t/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   )textwrapZ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.   r/   r0   r1   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   r3   r   r4   r5   r   r   r   r8   P   r9   c                 S   r3   r   r4   r5   r   r   r   r8   S   r9   |c                 S   r3   r   r4   r5   r   r   r   r8   W   r9   z||c                 S   r3   r   r4   r5   r   r   r   r8   [   s    zbuild %s: %sr   z  pool = %sz  dyndep = %sr$   r%   )
as_listappendextendr   r   r   dictiteritemsr"   )r   Zoutputsr2   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   rF   )Nzsubninja %srG   rH   r   r   r   subninjau   rK   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   rfindrR   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   rV      s   zWriter.close)r   )r   )NNFNFNNN)NNNNNNN)__name__
__module____qualname__r   r   r   r"   r(   r2   rE   rJ   rL   rN   rR   r   rV   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 newlinesrO   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$   rO    )groupget)mvar
local_varsvarsr   r   exp   s   
zexpand.<locals>.expz
\$(\$|\w*))resub)r[   rd   rc   re   r   rb   r   expand   s   rh   )	__doc__rf   r   r   objectr
   r;   r\   rh   r   r   r   r   <module>   s    