
YT                @   s  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	 m
 Z
 d d l	 m Z d d l	 m Z m Z d d l	 m Z d d	 l	 m Z d d
 l	 m Z d d l	 m Z d d l m Z d d l m Z d d l m Z m Z m Z d d l m Z m Z d d l
 m Z m Z d d l m Z e j   ryd d   Z d Z d Z  n e j! Z d Z d Z  d d   Z" Gd d   d  Z# Gd d   d e
 j$  Z% d S)    N)OrderedDict   )backends   )modules)environmentmesonlib)build)mlog)dependencies)	compilers)CompilerArgs)ArLinker)FileMesonException
OrderedSet)get_meson_scriptget_compiler_for_source)
CleanTreesInstallData)InvalidArgumentsc             C   s   d j  |   S)Nz"{}")format)s r   [/mnt/raid6/a/bak/reczko/tools/protein/utils/meson-0.42.1/mesonbuild/backend/ninjabackend.py<lambda>!   s    r   zcmd /czdel /f /s /q {} && zrm -f {} &&c             C   sF   x$ d D] } |  j  | d |  }  q Wd |  k rB t d   n  |  S)N$ :
zmNinja does not support newlines in rules. Please report this error with a test case to the Meson bug tracker.)r   r   r   )replacer   )textcharr   r   r   ninja_quote)   s
    r$   c               @   sX   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d S)NinjaBuildElementc             C   s   t  | t  r | g |  _ n	 | |  _ t  | t  s< t  | |  _ t  | t  rc | g |  _ n	 | |  _ t   |  _ t   |  _ g  |  _	 | |  _
 d  S)N)
isinstancestroutfilenamesAssertionErrorruleinfilenamessetdeps	orderdepselemsall_outputs)selfr0   r(   r*   r+   r   r   r   __init__3   s    				zNinjaBuildElement.__init__c             C   s6   t  | t  r" |  j j |  n |  j j |  d  S)N)r&   listr-   updateadd)r1   depr   r   r   add_depC   s    zNinjaBuildElement.add_depc             C   s6   t  | t  r" |  j j |  n |  j j |  d  S)N)r&   r3   r.   r4   r5   )r1   r6   r   r   r   add_orderdepI   s    zNinjaBuildElement.add_orderdepc             C   s5   t  | t  r | g } n  |  j j | | f  d  S)N)r&   r'   r/   append)r1   namer/   r   r   r   add_itemO   s    zNinjaBuildElement.add_itemc             C   s  |  j    d d j d d   |  j D  |  j d j d d   |  j D  f } t |  j  d k r | d d j d d   |  j D  7} n  t |  j  d k r | d	 d j d
 d   |  j D  7} n  | d 7} | j d d  } | j	 |  d d d d h } x |  j
 D] } | \ } } | | k } d | } d } g  }	 x | D]z }
 | si|
 d k rrt } n d d   } |
 j d d  }
 t d  d k r|
 j d d  }
 n  |	 j | |
   qPW| d j |	  7} | d 7} | j	 |  qW| j	 d  d  S)Nzbuild %s: %s %sr   c             S   s   g  |  ] } t  |   q Sr   )r$   ).0ir   r   r   
<listcomp>W   s   	 z+NinjaBuildElement.write.<locals>.<listcomp>c             S   s   g  |  ] } t  |   q Sr   )r$   )r<   r=   r   r   r   r>   Y   s   	 r   z | c             S   s   g  |  ] } t  |   q Sr   )r$   )r<   xr   r   r   r>   [   s   	 z || c             S   s   g  |  ] } t  |   q Sr   )r$   )r<   r?   r   r   r   r>   ]   s   	 r    \/DEPFILEDESCpooldescriptionz %s = z%sz&&c             S   s   t  t |    S)N)r$   
quote_func)r?   r   r   r   r   s   s    z)NinjaBuildElement.write.<locals>.<lambda>z\\r   z"""z\")check_outputsjoinr(   r*   r+   lenr-   r.   r!   writer/   r$   rF   r9   )r1   outfilelineZ	raw_nameser:   r/   Zshould_quoteZ	noq_templZnewelemsr=   quoterr   r   r   rK   T   s>    
#**

	
zNinjaBuildElement.writec             C   sG   x@ |  j  D]5 } | |  j k r2 t d |   n  d |  j | <q
 Wd  S)NzEMultiple producers for Ninja target "%s". Please rename your targets.T)r(   r0   r   )r1   nr   r   r   rH   }   s    zNinjaBuildElement.check_outputsN)	__name__
__module____qualname__r2   r7   r8   r;   rK   rH   r   r   r   r   r%   2   s   )r%   c                   sW  e  Z d  Z   f 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 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 d/ d0   Z d1 d2   Z d3 d4   Z d5 d6   Z d7 d8   Z d9 d:   Z d; d<   Z  d= d>   Z! d? d@   Z" dA dB   Z# dC dD   Z$ dE dF   Z% dG dH   Z& dI dJ   Z' dK dL   Z( dM dN   Z) dO dP   Z* dQ dR   Z+ dS dT   Z, dU dV   Z- dW dX   Z. dY dZ   Z/ d[ d\   Z0 d] d^   Z1 d_ d`   Z2 da db   Z3 dc dd   Z4 de df   Z5 dg dh   Z6 di dj   Z7 dk dl   Z8 dm dn   Z9 do dp   Z: dq dr   Z; ds dt   Z< du dv   Z= dw dx   Z> dy dz   Z? d{ d|   Z@ d} d~   ZA d d   ZB d d   ZC d d   ZD d d   ZE d d   ZF d d   ZG d d   ZH d d d  ZI d g  g  d d  ZJ d d   ZK d d   ZL d d   ZM d d   ZN d d   ZO d d   ZP d d   ZQ d d   ZR d d   ZS g  d d  ZT d d   ZU d d   ZV d d   ZW d d   ZX d d   ZY d d   ZZ d d   Z[ d d   Z\   S)NinjaBackendc                sA   t    j |  d |  _ d |  _ i  |  _ i  |  _ i  |  _ d  S)Nninjazbuild.ninja)superr2   r:   ninja_filenametarget_arg_cachefortran_depsr0   )r1   r	   )	__class__r   r   r2      s    				zNinjaBackend.__init__c             C   sl   | j  d  s- d } t | j |    n  | t d  d   } t |  j | d |  } | j |  d  S)Nzmeson-z.Invalid usage of create_target_alias with {!r}phony)
startswithr)   r   rJ   r%   r0   rK   )r1   Z	to_targetrL   mZfrom_targetelemr   r   r   create_target_alias   s    z NinjaBackend.create_target_aliasc             C   s_  x: |  j  j j   D] } | j d k r Pq q Wt | d  St j j |  j j	   d  } t | d   } | j
 d  Wd QXt j d d d	 d g d
 |  j j	   d t j d t j } | j   \ } } t j d  } xo | j d  D]^ }	 | j |	  }
 |
 r t | d  % } | j
 d |
 j d  d  Wd QXt | d  Sq Wt d   d S)z_VS writes its dependency in a locale dependent format.
        Detect the search prefix to use.msvcazincdetect.cwz#include<stdio.h>
int dummy;
Nclz/showIncludesz/ccwdstdoutstderrs   ^(.*\s)[a-zA-Z]:\\.*stdio.h$s   
abs   msvc_deps_prefix = r   s   
z4Could not determine vs dep dependency prefix string.)r	   r   valuesidopenospathrI   r   get_scratch_dirrK   
subprocessPopenPIPEcommunicaterecompilesplitmatchgroupr   )r1   tempfilenamecompilerfilenamefpcstdo_ZmatchrerM   ru   Zbinfiler   r   r   detect_vs_dep_prefix   s*    	$z!NinjaBackend.detect_vs_dep_prefixc             C   s  | |  _  t j j |  j j   |  j  } | d } t | d  H } | j d |  j	 j
    | j d  | j d  | j d  Wd  QX|  j |  } |  j |  |  j |  | j d  x- |  j	 j   j   D] } |  j | |  q W| j d  |  j |  | j d	  |  j |  |  j |  d
 |  j j j k r|  j j j d
 j r| j d  |  j |  n  | j d  |  j |  |  j |  Wd  QXt j | |  |  j   d  S)N~rb   z*# This is the build file for project "%s"
z1# It is autogenerated by the Meson build system.
z# Do not edit by hand.

z ninja_required_version = 1.5.1

z# Build rules for targets

z# Test rules

z# Install rules


b_coveragez# Coverage rules

z
# Suffix

)interpreterrk   rl   rI   r   get_build_dirrW   rj   rK   r	   get_projectr~   generate_rulesgenerate_phonyget_targetsrh   generate_targetgenerate_testsgenerate_installgenerate_distcoredatabase_optionsvaluegenerate_coverage_rulesgenerate_utilsgenerate_endingr!   generate_compdb)r1   interpZoutfilenamerw   rL   tr   r   r   generate   s:    	!
	zNinjaBackend.generatec       	      C   s   t  j   } d d   |  j j D } d d   |  j j D } d d   |  j j D } | d d g | | | } |  j  j   } yM t j | d | } t t	 j
 j | d  d	   } | j |  Wd  QXWn t k
 r t j d
  Yn Xd  S)Nc             S   s   g  |  ] } d  |  q S)z%s_PCHr   )r<   r=   r   r   r   r>      s   	 z0NinjaBackend.generate_compdb.<locals>.<listcomp>c             S   s   g  |  ] } d  |  q S)z%s_COMPILERr   )r<   r=   r   r   r   r>      s   	 c             S   s   g  |  ] } d  |  q S)z%s_CROSS_COMPILERr   )r<   r=   r   r   r   r>      s   	 z-tZcompdbrd   zcompile_commands.jsonwbz&Could not create compilation database.)r   detect_ninjar	   r   cross_compilersr   rn   check_outputrj   rk   rl   rI   rK   	Exceptionr
   warning)	r1   Z	ninja_exeZpch_compilersZnative_compilersr   Zninja_compdbbuilddirZjsondbrz   r   r   r   r      s    !zNinjaBackend.generate_compdbc             C   s  g  } xt | j    D]f } t | t j  r1 q n  xE | j   D]7 } |  j j |  r> | j |  j | | |   q> q> Wq Wd | j	 k r t | t j
  r t j |  j |  | j  } | j |  n  xB | j D]7 } t | t j t j f  r | |  j |  7} q q W| S)Nvala)get_generated_sourcesr&   r	   CustomTargetget_outputsr   	is_headerr9   get_target_generated_dirr   
Executabler   from_built_fileget_target_dirvala_headerlink_targetsStaticLibrarySharedLibraryget_generated_headers)r1   targetheader_depsgenlistsrcr   r6   r   r   r   r      s    '"z"NinjaBackend.get_generated_headersc             C   sZ   t    } xJ | j   D]< } x3 | j   D]% } |  j | | |  } | | | <q) Wq W| S)z
        Returns a dictionary with the keys being the path to the file
        (relative to the build directory) of that type and the value
        being the GeneratorList or CustomTarget that generated it.
        )r   r   r   r   )r1   r   srcsgensrcr   rz   r   r   r   get_target_generated_sources  s    	z)NinjaBackend.get_target_generated_sourcesc             C   sg   t    } xW | j   D]I } t | t  sC t d j |    n  | j |  j  } | | | <q W| S)Nz8All sources in target {!r} must be of type mesonlib.File)r   get_sourcesr&   r   r   r   rel_to_builddirbuild_to_src)r1   r   r   r   rz   r   r   r   get_target_sources  s    	zNinjaBackend.get_target_sourcesdfortranc             C   s   t  | t  r | j } n  |  j j |  s? |  j j |  rC d St j j |  d d d   } x@ |  j	 D]5 } | | j
 k r qm n  | | j
 | j k rm d Sqm Wd S)NFr   T)r&   r   fnamer   
is_llvm_iris_assemblyrk   rl   splitextlangs_cant_unityr   file_suffixes)r1   r   sourcesuffixlangr   r   r   get_target_source_can_unity#  s     z(NinjaBackend.get_target_source_can_unityc           	   C   s  t  | t j  r% |  j | |  n  t  | t j  rJ |  j | |  n  | j   } | |  j k ri d  Sd |  j | <|  j | |  t  | t j	  r |  j
 | |  d  Sd | j k r |  j | |  d  Sd | j k r |  j | |  d  Sd | j k r|  j | |  d  Sd | j k rB|  j | |  \ } } } n$ |  j |  } |  j |  } g  } |  j |  |  j | |  |  j |  } g  } |  j j j j d d  }	 |  j |  }
 |	 r| j   r|  j | |  } n g  } g  } g  } g  } | |  j |  7} |
 rt | j j    } | j |  j   } | rd j! |  j"   } } | t# |  d	 k r{d
 n d 7} d j$ | | | j%  } t& j' t& j( d  |  qn  g  } x| j)   D]\ } } t* j+ j, |  \ } } t- d | |  } |  j j. |  r|  j j/ |  r|
 rz|  j0 | |  rz| j1 |  t* j+ j! |  j j2   |  } | j1 |  q| j1 |  q|  j j3 |  r| j1 |  q|  j j4 |  rq| j1 |  qWxc | D][ } |  j j5 |  r	|  j6 | | |  } n |  j7 | | | d d | } | j1 |  qWg  } x | D] } t* j+ j, |  \ } } t- d | |  } |
 r| j1 t* j+ j! |  j j2   |   | j1 |  qE|  j j/ |  r| j1 |  qE| j1 |  qEWx3 | D]+ } | j1 |  j7 | | | d g  |   qWx | j)   D] \ } } |  j j/ |  s&|  j j5 |  ru| j1 |  j6 | | |   q|
 r|  j0 | |  rt* j+ j! |  j j2   | j8 |  j9   } | j1 |  q| j1 |  j7 | | | d g  |   q&q&W| |  j: |  7} |
 rRxC |  j; | |  D], } | j1 |  j7 | | | d | |   qWn  |  j< |  } |  j= | | | | | |  } |  j> | |  j? |   | j@ |  d  S)NTrustcsswiftr   b_pchFz, r   z arez isz`{} not supported in Unity builds yet, so {} sources in the {!r} target will be compiled normallyZFIXMEr   )Ar&   r	   r   generate_custom_target	RunTargetgenerate_run_targetget_idprocessed_targetsprocess_target_dependenciesJargenerate_jar_targetr   generate_rust_targetgenerate_cs_targetgenerate_swift_targetgenerate_vala_compiler   r   scan_fortran_module_outputsgenerate_generator_list_rulesget_target_filenamer   r   r   getis_unityhas_pchgenerate_pchr   r,   keysintersectionr   rI   upperrJ   r   r:   r
   logreditemsrk   rl   rt   r   	is_sourcer   r   r9   r   	is_object
is_libraryr   generate_llvm_ir_compilegenerate_single_compiler   r   Zflatten_object_listZgenerate_unity_filesZdetermine_linkergenerate_linkgenerate_shlib_aliasesr   rK   ) r1   r   rL   r:   Ztarget_sourcesZgenerated_sourcesZvala_generated_sourcesoutnameobj_listZuse_pchr   pch_objectsr   Z	unity_srcZ
unity_depslangsZ
langs_cantZ	langs_aremsgZgenerated_source_filesrel_srcr   ZdirpartZ	fnamepartZraw_srcabs_srcr   oZvala_generated_source_filesrz   linkerr^   r   r   r   r   1  s    "%	%),-zNinjaBackend.generate_targetc             C   sS   xL | j    D]> } | j   | j   } | |  j k r |  j | |  q q Wd  S)N)get_dependenciesget_basenametype_suffixr   r   )r1   r   rL   r   Ztnamer   r   r   r     s    z(NinjaBackend.process_target_dependenciesc             C   s[   xT | j  D]I } t | d  r+ | j } n  t | t j  r
 |  j | | |  q
 q
 Wd  S)Nheld_object)sourceshasattrr   r&   r	   GeneratedListgenerate_genlist_for_target)r1   r   rL   r   r   r   r   custom_target_generator_inputs  s
    z+NinjaBackend.custom_target_generator_inputsc             C   sy   g  } xl | j    D]^ } t | t  r5 | d } n  x9 | j   D]+ } | j t j j |  j |  |   qB Wq W| S)Nr   )	r   r&   r3   r   r9   rk   rl   rI   r   )r1   r   r-   r=   outputr   r   r   unwrap_dep_list  s    -zNinjaBackend.unwrap_dep_listc             C   s  |  j  | |  |  j |  \ } } } |  j |  } | |  j |  7} d } | j ri | j d  n  | j d  k r d } n d } t |  j | | |  }	 |	 j	 |  xM | j
 D]B }
 x9 |
 j   D]+ } |	 j	 t j j |  j |
  |   q Wq W| j sLt d d   | D  sLt j   s6t j   r|  j | j d  r|  j | j d | d d   |  j j   d	 | j r| d n d  } t j |  j j   d
 d | g } d } n d } | j d  k	 rAt j j |  j |  | j  } t j j |  j j   |  j |   } t j | d d |	 j d |  n  |  j | |  } |	 j d |  |	 j d | j  | j! |   |	 j" |  d |  j# | j! | j$   <d  S)Nz"Generating {0} with a {1} command.PHONYCUSTOM_COMMANDCUSTOM_COMMAND_DEPc             s   s   |  ] } d  | k Vq d S)r    Nr   )r<   cr   r   r   	<genexpr>  s    z6NinjaBackend.generate_custom_target.<locals>.<genexpr>r   r   capturez
--internalexezmeson_exe.py customcustomexist_okTrB   COMMANDrE   )%r   Zeval_custom_target_commandr   Zget_custom_target_depend_filesbuild_alwaysr9   depfiler%   r0   r7   extra_dependsr   rk   rl   rI   r   r   anyr   
is_windows	is_cygwinZdetermine_windows_extra_pathscommandZserialize_executabler   r   sys
executableget_build_commandmakedirsr;   replace_pathsr   r:   rK   r   r   )r1   r   rL   r   Z
ofilenamescmdr-   descrulenamer^   r   r   Zexe_dataZcmd_typeZ	rel_dfileZabs_pdirr   r   r   r     sF    		-"	!'z#NinjaBackend.generate_custom_targetc             C   s  t  j |  j j   d d g } |  j |  } g  } x | j D] } t | t  rb | j |  q= t | t	 j
 t	 j f  r |  j |  } | j t j j |  j j   |   | j |  q= t | t j  r| j |  j  } | j t j j |  j j   |   q= t d t |    q= Wt |  j d | j d g   } | |  j j   |  j j   | j t |  j d  g 7} | j }	 y |	 j }	 Wn t k
 rYn Xt |	 t	 j  rft j j |  j j   |  j |	   }
 | j |  j |	   |  j j    rV|  j j! j"   rV|  j j! j# d j$ d d   } | d  k	 rV| | g 7} qVn  | j |
  n t |	 t% j&  r| |	 j'   7} n t |	 t	 j  r| j |  j |	   | t j j |  j j   |  j |	   g 7} nP t |	 t j  r$| j |	 j( |  j j   |  j j     n | j | j  | | 7} | j) |  |  j* | |  } | j+ d	 |  | j+ d
 d | j  | j+ d d  | j, |  |  j- d | j |  d |  j. | j | j/   <d  S)Nz
--internalcommandrunnerz)Unreachable code in generate_run_target: zmeson-r   mesonintrospectbinariesexe_wrapperr  rE   zRunning external command %s.rD   consoleT)0r
  r  r   r  r   argsr&   r'   r9   r	   BuildTargetr   r   rk   rl   rI   r   r   r   r   r   r)   r%   r0   r:   get_source_dirsubdirr   r	  r   AttributeErrorr   is_cross_build
cross_infoneed_exe_wrapperconfigr   r   ExternalProgramget_commandabsolute_pathr7   r  r;   rK   r_   r   r   )r1   r   rL   r  r-   arg_stringsr=   Zrelfnamer^   ZtexeZabs_exeexe_wrapr   r   r   r     sd    %(	'1.
z NinjaBackend.generate_run_targetc          	   C   s   t  |  j d d d  } | j d t j |  j j   d d |  j j   |  j j   |  j j	   g  | j d d  | j
 |  |  j d |  |  j |  d  S)	Nzmeson-coverager   r   r  z
--internalcoveragerE   zGenerates coverage reports.)r%   r0   r;   r
  r  r   r  r  r   get_log_dirrK   r_   generate_coverage_legacy_rules)r1   rL   rN   r   r   r   r   S  s    z$NinjaBackend.generate_coverage_rulesc             C   s  t  j   \ } } } d } | r7d } t |  j d d d  } | j d | d d |  j  j   d	 t j j |  j  j	   d
  g  | j d d  | j
 |  |  j d |  t |  j d d d  } | j d | d |  j  j   d	 t j j |  j  j	   d  g  | j d d  | j
 |  |  j d |  n  | rn| rnd } t j j |  j  j	   d  } t j j |  j  j	   d  } t |  j d d t j j | d   }	 |	 j
 |  |  j d |  t |  j t j j | d  d d  } | d |  j  j   d d | d d | d |  j  j   d | d d d d | g }
 | j d |
  | j d d   | j
 |  n  | st j d!  n  d  S)"NFTzmeson-coverage-xmlr   r   r  z-xz-rz-ozcoverage.xmlrC   zGenerating XML coverage report.zmeson-coverage-textzcoverage.txtz Generating text coverage report.Zcoveragereportzcoverage.infozmeson-coverage-htmlr[   z
index.htmlz--directoryz	--capturez--output-filez--no-checksumz&&z--prefixz--output-directoryz--titlezCode coveragez--legendz--show-detailsz Generating HTML coverage report.z<coverage requested but neither gcovr nor lcov/genhtml found.)r   find_coverage_toolsr%   r0   r;   r  rk   rl   rI   r&  rK   r_   r   r
   r   )r1   rL   	gcovr_exelcov_exegenhtml_exeZ
added_ruler^   Z
htmloutdirZcovinfoZ
phony_elemr	  r   r   r   r'  a  sD    %%''z+NinjaBackend.generate_coverage_legacy_rulesc          
   C   s  t  j j |  j j   d  } |  j j   rx |  j j j d } d | k rb t j	 d  d  } q t
 j | d  } n |  j j } t |  j j   |  j j   |  j j   | t |  j d   } t |  j d d d  } | j d	  | j d
 d  | j d t j |  j j   d d | g  | j d d  |  j |  |  j |  |  j |  |  j |  |  j |  |  j |  |  j |  | j  |  |  j! d |  t" | d   } t# j$ | |  Wd  QXd  S)Nzinstall.datr  stripzFCross file does not specify strip binary, result will not be stripped.r  zmeson-installr   r   allrC   zInstalling files.r  z
--internalinstallrD   r  r   )%rk   rl   rI   r   rm   r  r  r  r
   r   r   stringlistifynative_strip_binr   r  r   
get_prefixr   r%   r0   r7   r;   r
  r  r  Zgenerate_depmf_installgenerate_target_installgenerate_header_installgenerate_man_installgenerate_data_installgenerate_custom_install_scriptgenerate_subdir_installrK   r_   rj   pickledump)r1   rL   Zinstall_data_fileZbinsZ	strip_binr   r^   ofiler   r   r   r     s:    	+zNinjaBackend.generate_installc             C   s0  x)|  j  j   j   D]} | j   s. q n  | j   } d } | d d  k	 ri | d d k	 ri d } n t | t  j  r |  j j   | d <n t | t  j	  r |  j j
   | d <n{ t | t  j  r |  j j   | d <nS t | t  j  r	|  j j   | d <n+ t | t  j  s!t  |  j j   | d <t |  t | j    } } | d k r| | k rd } t | j | j | | j   |    n  t | t  j  r+|  j d |  } | d d k	 r|  j |  | d | j   | | j g }	 | j j |	  t | t  j	  s.t | t  j  r| j   r| rM| d }
 n |  j j   }
 |  j |  |
 i  d d g }	 | j j |	  qn  | d k r(x t  | j   d d   | d d    D][ \ } } | d k rqn  t! j" j# |  j$ |  |  } | j j | | i  d d  g  qWq(q t | t  j%  r | d k r| d k rx | j   D]G } t! j" j# |  j$ |  |  } | j j | | d i  d d  g  qbWq(xu t  | j   |  D][ \ } } | d k rqn  t! j" j# |  j$ |  |  } | j j | | i  d d  g  qWq q Wd  S)NFr   Tr   zTarget {!r} has {} outputs: {!r}, but only {} "install_dir"s were found.
Pass 'false' for outputs that should not be installed and 'true' for
using the default installation directory for an output.r,  r   )&r	   r   rh   should_installget_custom_install_dirr&   SharedModuler   get_shared_module_dirr   get_shared_lib_dirr   get_static_lib_dirr   
get_bindirr  r)   
get_libdirrJ   r   r   r   r:   get_option_for_targetr   get_aliasesinstall_rpathtargetsr9   get_import_filenameget_import_lib_dirZget_target_filename_for_linkingziprk   rl   rI   r   r   )r1   r   r   Zoutdirscustom_install_dirZnum_outdirsZnum_outr]   Zshould_stripr=   Zimplib_install_dirr   outdirrz   r   r   r   r2    sh     	*6)*"z$NinjaBackend.generate_target_installc       
      C   s   g  } |  j  j   } |  j  j   } x |  j j D]{ } | d } | d } g  } x? | D]7 }	 |	 j d |  }	 |	 j d |  }	 | j |	  qX W| j t j | |   q1 W| | _ d  S)Nr   r  z@SOURCE_ROOT@z@BUILD_ROOT@)r   r  r   r	   install_scriptsr!   r9   	RunScript)
r1   r   resultsrcdirr   r=   r   r  Z
fixed_argsra   r   r   r   r6    s    

z+NinjaBackend.generate_custom_install_scriptc             C   s   |  j  j   } |  j j   } |  j  j   } |  j  j   } x | D] } | j   } | d  k r t j j	 | | j
    } n  xo | j   D]a } t | t  s d }	 t |	 j |    n  | j | |  }
 |
 | g } | j j |  q WqC Wd  S)Nz+Invalid header type {!r} can't be installed)r   get_includedirr	   get_headersr  r   r<  rk   rl   rI   get_install_subdirr   r&   r   r   r   r"  headersr9   )r1   r   ZincrootrS  rO  r   hrK  rz   r   abspathr=   r   r   r   r3    s    z$NinjaBackend.generate_header_installc             C   s   |  j  j   } |  j j   } x | D] } x | j   D] } | j d  d } | j   } | d  k r t j j	 | d |  } n  | j
 |  j  j   |  j  j    } t j j	 | t j j | j  d d  }	 | |	 g }
 | j j |
  q8 Wq% Wd  S)N.r   manz.gz)r   
get_mandirr	   get_manr   rt   r<  rk   rl   rI   r"  r  r   r   rW  r9   )r1   r   ZmanrootrW  r]   rz   numr  Zsrcabsdstabsr=   r   r   r   r4  #  s    $,z!NinjaBackend.generate_man_installc             C   s   |  j  j   } |  j j   } |  j j   } x | D] } t | t  j  sR t  | j } x | j	 D]z } t | t
 j  s t  t j j | j  d } t j j | |  }	 | j | |  |	 | j g }
 | j j |
  qe Wq4 Wd  S)Nr   )r	   get_datar   r  r   r&   Datar)   install_dirr   r   r   rk   rl   rt   r   rI   r"  install_modedatar9   )r1   r   ra  rO  r   der  rz   Zplain_fr\  r=   r   r   r   r5  1  s    	z"NinjaBackend.generate_data_installc       	      C   s   x |  j  j   D] } | j j d  } | j d  } t |  d k r t j j | j	 d j | d  d    } | d } n | j	 } | j } t j j |  j
 j   |  } t j j |  j
 j   | j  } | j j | | | | j | j g  q Wd  S)NrA   r   rX  rX  )r	   get_install_subdirsinstallable_subdirrstriprt   rJ   rk   rl   rI   source_subdirr   r  r1  r_  Zinstall_subdirsr9   r`  exclude)	r1   r   sdinst_subdirZ
idir_partsr  Zinst_dirsrc_dirZdst_dirr   r   r   r7  ?  s    +		!z$NinjaBackend.generate_subdir_installc          	   C   s|  |  j    t j d |  j j   d d g } |  j j j d  sP | d g 7} n  |  j j j d  ru | d g 7} n  t |  j d d	 d
 d g  } | j	 d |  | j	 d d  | j	 d d  | j
 |  |  j d |  t j d |  j j   d d d d d d g	 } t |  j d d	 d
 d g  } | j	 d |  | j	 d d  | j	 d d  | j
 |  |  j d |  d  S)Nz-utestz--no-rebuildstdsplitz--no-stdsplit	errorlogsz--print-errorlogsz
meson-testr   r-  r   r  rC   zRunning all tests.rD   r  z--benchmarkz	--logbaseZbenchmarklogz--num-processes=1zmeson-benchmarkzRunning benchmark suite.)Zserialize_testsr
  r  r   r  r   get_builtin_optionr%   r0   r;   rK   r_   )r1   rL   r  r^   r   r   r   r   M  s(    
!zNinjaBackend.generate_testsc             C   s  | j  d  |  j |  | j  d  |  j j j d j } | d k r] | j  d |  n  |  j j   r |  j d |  n  |  j d |  |  j |  | j  d  | j  d	  | j  d
  | j  d  | j  d  | j  d  | j  d
  | j  d  | j  d  | j  d  | j  d  | j  d  t	 t
 t j   t	 t
 |  j j     d d t	 t
 |  j j     t	 t
 |  j j     f } | j  d |  | j  d  | j  d  | j  d  d  S)Nz# Rules for compiling.

z# Rules for linking.

backend_max_linksr   zpool link_pool
  depth = %d

TFz# Other rules

zrule CUSTOM_COMMAND
z command = $COMMAND
z description = $DESC
z restat = 1

zrule CUSTOM_COMMAND_DEP
z deps = gcc
z depfile = $DEPFILE
zrule REGENERATE_BUILD
z
--internal
regeneratez- command = %s %s %s %s %s %s --backend ninja
z) description = Regenerating build files.
z generator = 1

r    )rK   generate_compile_rulesr   r   backend_optionsr   r  generate_static_link_rulesgenerate_dynamic_link_rulesr$   rF   r
  r  r  r  r   )r1   rL   	num_poolsr   r   r   r   r   g  sB    zNinjaBackend.generate_rulesc             C   s+   | j  d  | j  d  | j  d  d  S)Nz)# Phony build target, always out of date
zbuild PHONY: phony
r    )rK   )r1   rL   r   r   r   r     s    zNinjaBackend.generate_phonyc                s   j    } t j j   j   |  }  j   } g  }  j d } d } d }	 d }
 d }  j   } | d k r d }
 n  x3 | D]+ }   j |  | |  } | j	 |  q W   f d d   | D } d } | |	 |
 | g } |
 d k r| j	 |  n  | j	   j
    | d	   j   d
 g 7} t   j | | g   } | j |  | j d |  | j |  d  S)Njavar   r   rz   rN   c                s.   g  |  ]$ } t  j j   j   |   q Sr   )rk   rl   rI   get_target_private_dir)r<   r=   )r1   r   r   r   r>     s   	 z4NinjaBackend.generate_jar_target.<locals>.<listcomp>Zjava_LINKERz-CrV  ARGS)get_filenamerk   rl   rI   r   r   r   get_main_classgenerate_single_java_compiler9   r   rw  r%   r0   r7   r;   rK   )r1   r   rL   r   outname_relsrc_listZ
class_listrx   r   r]   rN   rz   
main_classr   plain_class_pathZclass_dep_listZjar_rulecommandsr^   r   )r1   r   r   r     s4    	z NinjaBackend.generate_jar_targetc             C   sO  g  } g  } x6| j  D]+} t j j |  j | j |  } | j d  rV d | } n | j d  st | j d  r$t j j t j j |   d d } t j j |  j	 |  |  }	 t
 |  j |	 d |  }
 |
 j d d | |	 g  |
 j d	 d
 |  |
 j |  | j |	  d |	 } n t d |   | j |  q W| | f S)Nz
.resourcesz
-resource:z.txtz.resxr   r   r  ZresgenrC   zCompiling resource %s.zUnknown resource file %s.)	resourcesrk   rl   rI   r   r  endswithr   basenamerw  r%   r0   r;   rK   r9   r   )r1   r   rL   r  r-   rZrel_sourcefilera   Z	ofilebase	ofilenamer^   r   r   r   generate_cs_resource_tasks  s$    &z'NinjaBackend.generate_cs_resource_tasksc                s    j  d |  } | j   } t j j   j |  |  } | j   } | j d }   f d d   | D } g  }	 | j j	 d g   }
 |
 | j
 |  7}
 t | t j  r |
 j d  n. t | t j  r |
 j d  n t d     j | |  \ } } |
 | 7}
 |	 | 7}	 |
 | j |  7}
 xU | j D]J } t j j   j |  | j    } |
 | j |  7}
 |	 j |  q5Wd |
 k r| | d	 g } n	 | g } t   j | d
 |  } | j |	  | j d |
  | j |  d  S)N	buildtyper   c                s"   g  |  ] } | j    j   q Sr   )r   r   )r<   r   )r1   r   r   r>     s   	 z3NinjaBackend.generate_cs_target.<locals>.<listcomp>z-target:exez-target:libraryzUnknown C# target type.z-gz.mdbZcs_COMPILERrx  )rC  ry  rk   rl   rI   r   r   r   
extra_argsr   get_buildtype_argsr&   r	   r   r9   r   r   r  get_output_argsr   get_link_argsr%   r0   r7   r;   rK   )r1   r   rL   r  r   r|  r}  rx   Zrel_srcsr-   r  Zresource_argsZresource_depsllnameoutputsr^   r   )r1   r   r     s:    

$	zNinjaBackend.generate_cs_targetc             C   s`  g  } | | j  |  j d |   7} | |  j j |  7} | |  j j | | j  7} | | j   7} | | j |  j |   7} xP | j	 D]E } x< | j
   D]. } | d t j j |  j | j |  g 7} q Wq W| j |  j  } | j d  d  d }	 t j j |  j |  |	  }
 t |  j |
 | j   d |  } | j d |  | j |  |	 S)Nr  z-sourcepath   class	_COMPILERrx  )r  rC  r	   get_global_argsget_project_args
subprojectget_java_argsr  rw  include_dirsget_incdirsrk   rl   rI   r   curdirr   r   r%   r0   get_languager;   rK   )r1   r   r   rx   rL   r  r=   idirr   r  rel_objelementr   r   r   r{    s     0"z)NinjaBackend.generate_single_java_compilec             C   sJ   d } d } d } | j  |  | j  |  | j  |  | j  d  d  S)Nzrule java_LINKER
z command = jar $ARGS
z" description = Creating JAR $out.
r    )rK   )r1   rL   r*   r	  rE   r   r   r   generate_java_link  s    zNinjaBackend.generate_java_linkc             C   s   t    } x | j | j D] } xw | j D]l } t | d  rK | j } n  | j d  r* | j d } t j	 j
 |  j |  |  } | j |  Pq* q* Wq Wt |  S)a  
        Peek into the sources of BuildTargets we're linking with, and if any of
        them was built with Vala, assume that it also generated a .vapi file of
        the same name as the BuildTarget and return the path to it relative to
        the build directory.
        r   r   z.vapi)r   r   link_whole_targetsr   r   r   r  r:   rk   rl   rI   r   r5   r3   )r1   r   rN  r6   r=   vapinamefullnamer   r   r   determine_dep_vapis  s    	z NinjaBackend.determine_dep_vapisc          
   C   s  t    } t    } t    } t    } x | j   D] } t | t  sg d j | |  } t |   n  | j |  j  } | j d  r | }	 n | j d  r | }	 n | }	 | |	 | <q1 Wx | j	   D] }
 x |
 j
   D] } |  j | |
 |  } | j d  r| }	 n | j d  r(| }	 n | }	 | |	 k r|	 | |
 k	 rd j | t |
  j |
 j |	 | j t |	 |  j  } t |   n  |
 |	 | <q Wq W| | | | f f S)a~  
        Splits the target's sources into .vala, .gs, .vapi, and other sources.
        Handles both pre-existing and generated sources.

        Returns a tuple (vala, vapi, others) each of which is a dictionary with
        the keys being the path to the file (relative to the build directory)
        and the value being the object that generated or represents the file.
        zBAll sources in target {!r} must be of type mesonlib.File, not {!r}.vala.gsz.vapizNDuplicate output {0!r} from {1!r} {2!r}; conflicts with {0!r} from {4!r} {3!r})r  r  )r  r  )r   r   r&   r   r   r   r   r   r  r   r   r   typerQ   r:   )r1   r   r   vapiothersZ	othersgenr   r   rz   Zsrctyper   r   r   r   split_vala_sources  s:    									 zNinjaBackend.split_vala_sourcesc             C   s(  |  j  |  \ } } } g  } | sE d } t | j | j    n  | j d } |  j |  }	 g  }
 g  } t | j    } x | j   D] \ } } | j	 |  t
 | t j t j f  s | j r t j j |  d d } n& t j j t j j |   d d } t j j |	 |  } |
 j	 |  | j	 |  q W|  j | |  } | | j |  j j j j d  j  7} | d |	 g 7} t
 | t j  s| d | j g 7} t j j |  j |  | j  } | d | g 7} |  j |  r| d	 g 7} n  | j	 |  t j j |  j |  | j  } | d
 t j j d | j  g 7} | j	 |  | j  | j | j g 7_  t! | j"  d k r| j" d d k r|  j j#   | j" d <n  t! | j"  d k r| j" d d k rt j j |  j j$   d d  | j" d <n  t
 | j% t&  rt j j |  j |  | j%  } | d t j j d | j%  g 7} | j	 |  | j  j	 | j%  t! | j"  d k r| j" d d k rt j j |  j j$   d  | j" d <qqn  xV | d j   D]D \ } } t
 | t' j(  r|  j) |  \ } | d | g 7} qqWg  } xh | j* j d g   D]Q } t
 | t+  r| j, |  j-  } | j	 |  | j	 |  qK| j	 |  qKW|  j. |  } | | 7} | | 7} t/ |  j0 | | j1   d | |  } | j2 d |  | j3 |  | j4 |  | d | d |
 f S)z?Vala is compiled into C. Set up all necessary build steps here.z4Vala library {!r} has no Vala or Genie source files.r   r   z.c
b_coloroutz-dz
--library=z-Hz--use-headerz--vapiz..r   Tr   r  z--gir   zgir-1.0z--gresources=r  rx  )5r  r   r   r:   r   rw  r3   r   r   r9   r&   r	   r   r   is_builtrk   rl   r   r  rI   generate_basic_compiler_argsget_colorout_argsr   r   r   r   r   r   r   r   r   	vala_vapir  rJ   r_  rP  get_datadirvala_girr'   r   GResourceTargetZget_custom_target_sourcesr  r   r   r   r  r%   r0   r  r;   r7   rK   )r1   r   rL   Zvala_srcZvapi_srcZ	other_srcZextra_dep_filesr   valacZ	c_out_dirZ
vala_c_srcZvalac_outputsZ	all_filesZ	vala_filer   Zvala_c_filer  hnamer  ZgirnameZgresZgres_xmlr  ra   ZrelnameZdependency_vapisr  r   r   r   r   K  s    $&(!!"((+!"(.

z"NinjaBackend.generate_vala_compilec             C   s  | j  d } g  } xU | j   D]G } | j |  sN t d | j     n  | j | j |  j   q  Wt j	 j
 | j | j    } d g } t | t j  r d } n] t | d  r | j } nB t | t j  r d } n' t | t j  r d } n t d   | j |  | d	 | j g 7} | | j |  j d
 |   7} t j	 j
 | j | j d  }	 | d d j |	  d d g 7} | | j d  7} | d t j	 j
 | j | j    g 7} d d   | j D }
 t   } x | j D] } d | | j <qWx9 | j   D]+ } | d k r*d } n  | d | g 7} qWd } x/ | j   D]! } t | t j  rQd } qQqQWt | t j  s| rw| d d g 7} d | j k sd | j k rt j	 j
 t j	 j | j  d |  j |   } n |  j |  } | j |  j  j!   | |  j" |  | j# | j$  } xB | D]7 } | d d | d t j	 j
 | j%   d  g 7} q9Wn  t& |  j' | d |  } t( |
  d k r| j) |
  n  | j* d  |  | j* d! |	  | j* d" |  | j+ |  t | t j  r|  j, | |  n  d  S)#Nr   z/Rust target %s contains a non-rust source file.z--crate-typebinrust_crate_typedylibrlibzUnknown target type for rustc.z--crate-namer  z.dz--emitzdep-info={}linkz-oc             S   s.   g  |  ]$ } t  j j | j | j     q Sr   )rk   rl   rI   r  ry  )r<   r   r   r   r   r>     s   	 z5NinjaBackend.generate_rust_target.<locals>.<listcomp>Tr   rV  z-LFz-Czprefer-dynamicrA   r@   r   z	link-arg=r   libZrust_COMPILERrx  Z	targetdep	cratetype)-r   r   can_compiler   r   r9   r   r   rk   rl   rI   r  ry  r&   r	   r   r   r  r   r   r:   r  rC  r   get_extra_argsr   r   r   r   rt   r   build_rpath_argsr   r   determine_rpath_dirsbuild_rpathrE  get_sysrootr%   r0   rJ   r8   r;   rK   generate_shsym)r1   r   rL   rustcrelsrcr=   target_namer  r  r  r.   Zlinkdirsr   Zhas_shared_depsr6   target_slashname_workaround_dirZ
rpath_argsZ	rpath_argr  r   r   r   r     st    				(		8z!NinjaBackend.generate_rust_targetc             C   s)   t  j j |  j |  |  j |  d  S)Nz.swiftmodule)rk   rl   rI   rw  target_swift_modulename)r1   r   r   r   r   swift_module_file_name  s    z#NinjaBackend.swift_module_file_namec             C   s   | j  S)N)r:   )r1   r   r   r   r   r    s    z$NinjaBackend.target_swift_modulenamec             C   s+   x$ | j  D] } | j d  r
 d Sq
 Wd S)Nr   TF)r   r  )r1   r   r   r   r   r   is_swift_target  s    zNinjaBackend.is_swift_targetc             C   sF   g  } x9 | j  D]. } |  j |  r | j |  j |   q q W| S)N)r   r  r9   r  )r1   r   rN  r  r   r   r   determine_swift_dep_modules  s
    z(NinjaBackend.determine_swift_dep_modulesc             C   s4   g  } x' | j  D] } | j |  j |   q W| S)N)r   r9   get_target_private_dir_abs)r1   r   rN  r  r   r   r   determine_swift_dep_dirs  s    z%NinjaBackend.determine_swift_dep_dirsc             C   s4   g  } x' | j  D] } | j |  j |   q W| S)N)r   r9   r   )r1   r   rN  r  r   r   r   get_swift_link_deps  s    z NinjaBackend.get_swift_link_depsc             C   sb   |  j  |  } g  } g  } x: | D]2 } | j d  rG | j |  q" | j |  q" W| | f S)Nz.swift)r   r  r9   )r1   r   Zall_srcsr   r  r=   r   r   r   split_swift_generated_sources  s    z*NinjaBackend.split_swift_generated_sourcesc       %         s    j  |  } | j d } g  } g  } g  } x | j   D] } | j |  r | j   j  }	 t j j t j j	   j
 j   |	   }
 | j |
  q;   j
 j |  r| j   j  } t j j t j j	   j
 j   |   } | j |  | | j |  7} q; t d | j     q; Wt j   j |  d d | j   } | | j |  7} |   j j | | j  7} |   j j |  7} x t | j    D] } | j   } x | j   D]y } | d k rt j j	 | |  } n | } t j j t j j	   j
 j     j |   } | j |  } | | 7} qWqW| j t j j	   j
 j     j |    } |   j j  | | j  7} |   j j! |  7}   j" |  }   j# |  }   j$ |  }   j% |  } g  } x! | D] } | | j |  7} qW  j& |  }   f d d   | D } xi | j' D]^ }   j( |  } | d k rkd } n  | d	 t j j t j j	   j
 j   |   g 7} qAW  j) |  \ } }   f d
 d   | D } g  }  g  }! xt | | D]h } t j j* |  d }" t j j+ |"  d d }# |  j |#  |! j t j j	   j" |  |#   qWt,   j- |! d |  }$ |$ j. | |  |$ j. |  |$ j/ d | | | |  |$ j/ d |  |$ j0 |  t,   j- | d |  }$ |$ j. | |  |$ j/ d | | | | j1    |$ j/ d |  |$ j0 |  t2 | t j3  rw  j4 | |   j |  |!   j j5  }$ |$ j0 |  n t2 | t j6  rt,   j-   j |  d g   }$ |$ j. |!  |$ j. |  |$ j/ d | | j7   |  |  |$ j/ d |  |$ j0 |  n t8 d   d  S)Nr   z1Swift target %s contains a non-swift source file.r  Tr   rV  c                s.   g  |  ]$ } t  j j   j j   |   q Sr   )rk   rl   rI   r   r   )r<   r?   )r1   r   r   r>   O  s   	 z6NinjaBackend.generate_swift_target.<locals>.<listcomp>z-Lc                s.   g  |  ]$ } t  j j   j j   |   q Sr   )rk   rl   rI   r   r   )r<   r?   )r1   r   r   r>   V  s   	 r   r   z.oZswift_COMPILERrx  ZRUNDIRz:Swift supports only executable and static library targets.)r   rV  )9r  r   r   r  r   r   rk   rl   normpathrI   r   r   r9   r   get_header_import_argsr   r   r  r  get_compile_only_argsget_module_argsr	   r  r  r  reversedget_include_dirs
get_curdirr  get_include_argsr  r   get_project_link_argsget_global_link_argsrw  r  r  r  r  r   r   r  rt   r   r%   r0   r7   r;   rK   get_mod_gen_argsr&   r   r   static_linkerr   get_std_exe_link_argsr   )%r1   r   rL   module_nameswiftcZabssrcZabs_headersZheader_importsr=   r  ZabssZrelhZabshcompile_argsbasedirr   expdir
srctreedirsargs	link_argsZrundirZout_module_nameZin_module_filesZabs_module_dirsZmodule_includesr?   Z	link_depsZabs_link_depsZreldirZrel_generatedr}   Zabs_generatedobjectsZrel_objectsbaseZonamer^   r   )r1   r   r   #  s    **00	8)		"!"z"NinjaBackend.generate_swift_targetc             C   s  |  j  j j d j } d |  j j k rA | sA |  j |  qA n  | r} |  j  j j   rh |  j j	 } n |  j j
 } d } n |  j j
 } d } | d  k r d  Sd | } t j   r t | t  r d } n d } g  } t | t  rt j   rt t j d  g } n  | | j   7} | j d	 d
 j |  d d
 j | j d    }	 d }
 | j |  | j |	  | d k r| j d  n  | j |
  d  S)Nro  rv  _CROSSr   zrule STATIC%s_LINKER
zf command = {executable} @$out.rsp
 rspfile = $out.rsp
 rspfile_content = $LINK_ARGS {output_args} $in
z5 command = {executable} $LINK_ARGS {output_args} $in
z$outr  r   output_argsz, description = Linking static target $out.

r   z pool = link_pool
)r   r   rr  r   r	   r   r  r  need_cross_compilerstatic_cross_linkerr  r   r  r&   r   execute_wrapperrmfile_prefixr   get_exelistrI   r  rK   )r1   is_crossrL   ru  r  crstrr*   command_templatecmdlistr	  rE   r   r   r   rs    s<    	
		z'NinjaBackend.generate_static_link_rulesc             C   s  |  j  j j d j } |  j j d f g } |  j  j   r |  j  j j   rh | j	 |  j j
 d f  q | j	 |  j j d f  n | j	 |  j j
 d f  x| D]w\ } } xh| j   D]Z\ } } | d k s | d k s | d k s | d k r q n  d } g  }	 | rNd	 } y |  j  j j d
 | d }	 WqNt k
 rJYqNXn  d | | f }
 t j   rsd } n d } | j d d j | j    d d j |	  d d j | j d    } d } | j |
  | j |  | d k r| j d  n  | j |  | j d  q Wq W| j d  d } d t t j  |  j  j   d d d d f } d } d } | j |  | j |  | j |  | j |  | j d  d  S)Nro  FTrv  r   r   r   r   r  
properties
_link_argszrule %s%s_LINKER
z command = {executable} @$out.rsp
 rspfile = $out.rsp
 rspfile_content = $ARGS  {output_args} $in $LINK_ARGS {cross_args} $aliasing
zR command = {executable} $ARGS {output_args} $in $LINK_ARGS {cross_args} $aliasing
r  r   
cross_argsr  z$outz$ description = Linking target $out.
r   z pool = link_pool
r    zrule SHSYM
z( command = "%s" "%s" %s %s %s %s $CROSS
z
--internalsymbolextractorz$inz restat = 1
z, description = Generating symbol file $out.
)r   r   rr  r   r	   r   r  r  r  r9   r   r   r  KeyErrorr   r  r   rI   get_linker_exelistget_linker_output_argsrK   r$   r
  r  r  )r1   rL   ru  ctypesZcomplistr  langnamerx   r  r  r*   r  r	  rE   ZsymruleZsymcmdZsynstatZsyndescr   r   r   rt    sh    		
z(NinjaBackend.generate_dynamic_link_rulesc             C   sz   d | j    } d j d d   | j   D  } d | } d } | j |  | j |  | j |  | j d  d  S)Nzrule %s_COMPILER
r   c             S   s   g  |  ] } t  |   q Sr   )r$   )r<   r=   r   r   r   r>     s   	 z;NinjaBackend.generate_java_compile_rule.<locals>.<listcomp>z command = %s $ARGS $in
z* description = Compiling Java object $in.
r    )r  rI   r  rK   )r1   rx   rL   r*   invocr	  rE   r   r   r   generate_java_compile_rule  s    "
z'NinjaBackend.generate_java_compile_rulec             C   sz   d | j    } d j d d   | j   D  } d | } d } | j |  | j |  | j |  | j d  d  S)Nzrule %s_COMPILER
r   c             S   s   g  |  ] } t  |   q Sr   )r$   )r<   r=   r   r   r   r>     s   	 z9NinjaBackend.generate_cs_compile_rule.<locals>.<listcomp>z command = %s $ARGS $in
z. description = Compiling C Sharp target $out.
r    )r  rI   r  rK   )r1   rx   rL   r*   r  r	  rE   r   r   r   generate_cs_compile_rule  s    "
z%NinjaBackend.generate_cs_compile_rulec             C   s   d | j    } d j d d   | j   D  } d | } d } d } | j |  | j |  | j |  | j |  | j d  d  S)	Nzrule %s_COMPILER
r   c             S   s   g  |  ] } t  |   q Sr   )r$   )r<   r=   r   r   r   r>     s   	 z<NinjaBackend.generate_vala_compile_rules.<locals>.<listcomp>z command = %s $ARGS $in
z* description = Compiling Vala source $in.
z restat = 1
r    )r  rI   r  rK   )r1   rx   rL   r*   r  r	  rE   Zrestatr   r   r   generate_vala_compile_rules  s    "
z(NinjaBackend.generate_vala_compile_rulesc       	      C   s   d | j    } d j d d   | j   D  } d | } d } d } d } | j |  | j |  | j |  | j |  | j |  | j d	  d  S)
Nzrule %s_COMPILER
r   c             S   s   g  |  ] } t  |   q Sr   )r$   )r<   r=   r   r   r   r>     s   	 z<NinjaBackend.generate_rust_compile_rules.<locals>.<listcomp>z command = %s $ARGS $in
z* description = Compiling Rust source $in.
z depfile = $targetdep
z deps = gcc
r    )r  rI   r  rK   )	r1   rx   rL   r*   r  r	  rE   r  Zdepstyler   r   r   generate_rust_compile_rules  s    "
z(NinjaBackend.generate_rust_compile_rulesc             C   s   d | j    } t t j  t |  j j    d d d g } d j |  d d j d d   | j   D  } d | } d	 } | j |  | j |  | j |  | j d
  d  S)Nzrule %s_COMPILER
z
--internal
dirchangerz$RUNDIRr   c             s   s   |  ] } t  |  Vq d  S)N)r$   )r<   r=   r   r   r   r   %  s    z<NinjaBackend.generate_swift_compile_rules.<locals>.<genexpr>z command = %s $ARGS $in
z+ description = Compiling Swift source $in.
r    )	r  r$   r
  r  r   r  rI   r  rK   )r1   rx   rL   r*   Zfull_exer  r	  rE   r   r   r   generate_swift_compile_rules  s    	#
z)NinjaBackend.generate_swift_compile_rulesc             C   s6   t  j   r d } n d } d } | j | |  d  S)Nz	cmd /C ""truez# Workaround for these issues:
# https://groups.google.com/forum/#!topic/ninja-build/j-2RfBIOd_8
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485
rule FORTRAN_DEP_HACK
 command = %s
 description = Dep hack
 restat = 1

)r   r  rK   )r1   rL   r  templater   r   r   generate_fortran_dep_hack-  s
    		z&NinjaBackend.generate_fortran_dep_hackc          
   C   s  t  |  d d  r d  Sd j | r( d n d  } t j   rF d } n d } | j d d	 j d
 d   | j   D  d d	 j |  j | j |   d d	 j | j d   d d	 j | j	     } d } | j
 |  | j
 |  | j
 |  | j
 d  d |  _ d  S)Ncreated_llvm_ir_ruleFzrule llvm_ir{}_COMPILER
r  r   z command = {executable} @$out.rsp
 rspfile = $out.rsp
 rspfile_content = {cross_args} $ARGS {output_args} {compile_only_args} $in
zQ command = {executable} {cross_args} $ARGS {output_args} {compile_only_args} $in
r  r   c             S   s   g  |  ] } t  |   q Sr   )r$   )r<   r=   r   r   r   r>   H  s   	 z>NinjaBackend.generate_llvm_ir_compile_rule.<locals>.<listcomp>r  r  z$outcompile_only_argsz- description = Compiling LLVM IR object $in.
r    T)getattrr   r   r  rI   r  get_cross_info_lang_argslanguager  r  rK   r  )r1   rx   r  rL   r*   r  r	  rE   r   r   r   generate_llvm_ir_compile_rule=  s"    		"z*NinjaBackend.generate_llvm_ir_compile_rulec             C   s?   | r; y |  j  j j d | d SWq; t k
 r7 Yq; Xn  g  S)Nr  _args)r   r  r  r  )r1   r   r  r   r   r   r  T  s    z%NinjaBackend.get_cross_info_lang_argsc             C   s  | d k r) | s% |  j  | |  n  d  S| d k rR | sN |  j | |  n  d  S| d k r{ | sw |  j | |  n  d  S| d k r | s |  j | |  n  d  S| d k r | s |  j | |  n  d  S| d k r |  j |  n  | r d } n d } d	 | | f } | j d
 d  } g  } xB | D]: }	 |	 d
 k rZ|	 d k rZt |	  }	 n  | j |	  q-W|  j	 | |  }
 t
 j   rd } n d } | j d d j d d   | j   D  d d j |
  d d j |  d d j | j d
   d d j | j     } d | j   } | j   d k r<d } n d } | d 7} | j |  | j |  | j |  | j |  | j d  d  S)Nrv  r   r   r   r   r   r  r   zrule %s%s_COMPILER
z$outz$DEPFILEz$inz command = {executable} @$out.rsp
 rspfile = $out.rsp
 rspfile_content = {cross_args} $ARGS {dep_args} {output_args} {compile_only_args} $in
z\ command = {executable} {cross_args} $ARGS {dep_args} {output_args} {compile_only_args} $in
r  r   c             S   s   g  |  ] } t  |   q Sr   )r$   )r<   r=   r   r   r   r>     s   	 z:NinjaBackend.generate_compile_rule_for.<locals>.<listcomp>r  dep_argsr  r  z) description = Compiling %s object $out.
r`   z deps = msvc
z deps = gcc
z depfile = $DEPFILE
r    )r  r  r  r  r  r  get_dependency_gen_argsrF   r9   r  r   r  r   rI   r  r  r  get_display_languager   rK   )r1   r  rx   r  rL   r  r*   depargsquoted_depargsr   r  r  r	  rE   r-   r   r   r   generate_compile_rule_for\  sh    			"	
z&NinjaBackend.generate_compile_rule_forc             C   s  | d k r | d k r d  S| r+ d } n d } d | | f } | j  d d  } g  } | r y |  j j j d | d	 } Wq t k
 r Yq Xn  g  }	 xB | D]: }
 |
 d k r |
 d
 k r t |
  }
 n  |	 j |
  q W| j   d k r d } n d j | j	 d   } d j
 d d j | j    d d j |  d d j |	  d | d d j | j     } d d
 } | j   d k rd } n d } | d 7} | j |  | j |  | j |  | j |  | j d  d  S)Nr   cppr  r   zrule %s%s_PCH
z$outz$DEPFILEr  r	  z$inr`   r   z\ command = {executable} {cross_args} $ARGS {dep_args} {output_args} {compile_only_args} $in
r  r  r
  r  r  z' description = Precompiling header %s.
z deps = msvc
z deps = gcc
z depfile = $DEPFILE
r    )r  r   r  r  r  rF   r9   r   rI   r  r   r  r  rK   )r1   r  rx   r  rL   r  r*   r  r  r  r   r   r	  rE   r-   r   r   r   generate_pch_rule_for  sJ    			
	
z"NinjaBackend.generate_pch_rule_forc             C   s8  xt |  j  j j   D]` \ } } | j   d k rG |  j | d |  n  |  j | | d |  |  j | | d |  q W|  j j   r'|  j j	 j
   r |  j  j } n |  j  j } xq | j   D]` \ } } | j   d k r |  j | d |  n  |  j | | d |  |  j | | d |  q Wn  | j d  d  S)NclangFTr    )r	   r   r   r   r  r  r  r   r  r  r  r   rK   )r1   rL   r  rx   Zcclistr   r   r   rq    s    z#NinjaBackend.generate_compile_rulesc             C   sF   x? | j    D]1 } t | t j  r+ q n  |  j | | |  q Wd  S)N)r   r&   r	   r   r   )r1   r   rL   r   r   r   r   r     s    z*NinjaBackend.generate_generator_list_rulesc                sp    j  |    j |       f d d   | D }  f d d   | D }  f d d   | D } | S)Nc                s1   g  |  ]' } | j  d   j  j  d     q S)z@SOURCE_DIR@z@BUILD_DIR@)r!   r   )r<   r?   )reloutr1   r   r   r>     s   	z.NinjaBackend.replace_paths.<locals>.<listcomp>c                s"   g  |  ] } | j  d      q S)z@CURRENT_SOURCE_DIR@)r!   )r<   r?   )source_target_dirr   r   r>     s   	 c                s1   g  |  ]' } | j  d    j  j  d d   q S)z@SOURCE_ROOT@z@BUILD_ROOT@rV  )r!   r   )r<   r?   )r1   r   r   r>     s   	)get_target_source_dirrw  )r1   r   r  r   )r  r1   r  r   r    s    

zNinjaBackend.replace_pathsc                s  | j    } | j   }  j |  } | j   } | j   } | j   }	  f d d   | j D }
  j   } xXt t	 |   D]D} t	 | j
  d k r t j j  j   | |   n d  | | } | j  j   | j |  }   f d d   | D } | j d  k r4d } |	 } nL d } | j   } t j j  j   |      f d d   |	 D }   f d	 d   | D }  j |  j   |  }  d k r| t	 | j
  d   } n   j   }  j  |  } |  j | |  } t  j | |   } | j d  k	 rS| j d
    n  t	 |
  d k ru| j |
  n  | j d d  t | t j  r| j  j |   n  | j d |  | j |  q Wd  S)Nc                s(   g  |  ] } t  j j   j |   q Sr   )rk   rl   rI   r   )r<   r=   )r1   r   r   r>     s   	 z<NinjaBackend.generate_genlist_for_target.<locals>.<listcomp>r   r   c                s.   g  |  ]$ } t  j j   j   |   q Sr   )rk   rl   rI   rw  )r<   Zof)r1   r   r   r   r>     s   	 r   r   c                s"   g  |  ] } | j  d      q S)z	@DEPFILE@)r!   )r<   r?   )r  r   r   r>     s   	 c                s.   g  |  ]$ } | j  d     j  d    q S)z@INPUT@z@OUTPUT@)r!   )r<   r?   )
infilenamesole_outputr   r   r>     s   	rB   r   rC   zGenerating $outr  ) get_generatorget_exeZexe_object_to_cmd_array
get_inputsr   get_arglistr  r  rangerJ   r  rk   rl   rI   rw  r   r   get_outputs_forr  get_dep_outnameZreplace_outputsr  Zreplace_extra_argsr%   r0   r;   r7   r&   r	   r  r   rK   )r1   r   r   rL   	generatorr   Zexe_arr
infilelistoutfilelistZ	base_argsZextra_dependenciesr  r=   Zcurfileoutfilesr  r  Zdepfilenamer  r  r^   r   )r  r  r1   r  r   r   r     sR    %
	
z(NinjaBackend.generate_genlist_for_targetc             C   s  d  } x6 |  j  j j   D]" \ } } | d k r | } Pq q W| d  k rb i  |  j | j   <d  St j d t j  } i  } x | j   D] } | j	 |  s q n  | j
 |  j j   |  j j    } t | d d  }	 x |	 D] }
 | j |
  } | d  k	 r | j d  j   } | d k r-q n  | | k rYt d | | | | f   n  | | | <q q WWd  QXq W| |  j | j   <d  S)Nr   z\s*module\s+(\w+)errorsignorer   Z	procedurez>Namespace collision: module %s defined in two files %s and %s.)r	   r   r   rY   r   rr   rs   
IGNORECASEr   r  r"  r   r  r   rj   ru   rv   lowerr   )r1   r   rx   r   r   ZmodreZmodule_filesr   ry   rz   rM   Zmodmatchmodnamer   r   r   r     s8    z(NinjaBackend.scan_fortran_module_outputsc             C   s  g  } t  j d t  j  } |  j |  } |  j | j   } t |   } x | D] }	 | j |	  }
 |
 d  k	 rS |
 j d  j	   } | | k r qS n  | | } | j
 t j j |  d k r qS n  | j |
 j d   } | j t j j | |   qS qS WWd  QX| S)Nz\s*use\s+(\w+)r   )rr   rs   r%  rw  rY   r   rj   ru   rv   r&  r   rk   rl   rt   module_name_to_filenamer9   rI   )r1   rx   r   r   Z	mod_filesZuseredirnameZtdepsrz   rM   ZusematchZusenameZmod_source_fileZmod_namer   r   r   get_fortran_deps>  s$    
)zNinjaBackend.get_fortran_depsc             C   s3   | j  s g  S|  j j j | j  s) g  S| j   S)N)r  r   r  
has_stdlibr  get_no_stdinc_args)r1   r   rx   r   r   r   get_cross_stdlib_args_  s
    	z"NinjaBackend.get_cross_stdlib_argsc             C   sX   | j  d k r g  S| j   rA |  j |  } | j | d d S| j | d d Sd  S)Nr`   pchTF)ri   r   get_target_filename_absget_compile_debugfile_args)r1   rx   r   objfileZ	tfilenamer   r   r   r0  f  s    1z'NinjaBackend.get_compile_debugfile_argsc             C   s   | j  |  S)N)get_link_debugfile_args)r1   r   r   r   r   r   r   r2    s    z$NinjaBackend.get_link_debugfile_argsc             C   s  t  | j j   |  } t |  } | t j |  j j j |  7} t | t	  r | j
 ry t j j | j | j  } q | j } n- t j j |  r t j j |  } n | } | j d d  j d d  } t j j |  j |  |  } | d |  j j   7} | |  j | | |  7} t | t	  rB| j
 rB| j }	 n9 t | t	  rf| j |  j  }	 n t d j |    d j | j rd n d  }
 t |  j | |
 |	  } | j   } | j d	 |  | j |  | S)
NrA   r}   r@   rV  zInvalid source type: {!r}zllvm_ir{}_COMPILERr  r   rx  ) r   r   rh   r   get_base_compile_argsr   r   r   r&   r   r  rk   rl   rI   r  r   isabsr  r!   rw  get_object_suffixr0  r   r   r   r   r  r%   r0   	to_nativer;   rK   )r1   r   rL   r   rx   r  src_filenameobj_basenamer  r   compiler_namer  r   r   r   r     s4    
	z%NinjaBackend.generate_llvm_ir_compilec             C   s@   | j    } t j j t j j |  j |   } | j | d  S)NF)
get_subdirrk   rl   r  rI   r   r  )r1   r   rx   r  Ztmppathr   r   r   get_source_dir_include_args  s    $z(NinjaBackend.get_source_dir_include_argsc             C   s1   | j    } | d k r! d } n  | j | d  S)Nr   rV  F)r:  r  )r1   r   rx   r  r   r   r   get_build_dir_include_args  s    	z'NinjaBackend.get_build_dir_include_argsc             C   s   g  } xW | j    D]I } t | t j  s1 q n  |  j |  } | | k r | j |  q q Wg  } x$ | D] } | | j | d  7} qm W| S)NF)r   r&   r	   r   r   r9   r  )r1   r   rx   Zcustom_target_include_dirsr=   r  incsr   r   r   "get_custom_target_dir_include_args  s    z/NinjaBackend.get_custom_target_dir_include_argsFc             C   s*  t  j | j |  j j j  } t |  } | t j | |  7} | d k } | |  j	 | | |  7} | |  j
 | |  7} x t | j    D]} | j   } x | j   D] }	 |	 d k r t j j | |	  }
 n | }
 t j j |  j |
  } | j | | j  } | | 7} t j j t j j |  j j   |
   rV| j |
 | j  } n g  } | | 7} q Wx- | j   D] }	 | | j |	 | j  7} qwWq W| |  j | | j | j     7} | j r| |  j | |  7} n  | j r| |  j | |  7} n  | | j |  j |  d  7} | S)Nr   r   rV  F)r   rV  )r   ZOptionOverrideProxyoption_overridesr   r   r   r   r   r3  r  r>  r  r  r  r  rk   rl   rI   r   r  	is_systemisdirr   get_extra_build_dirsZescape_extra_argsr  r  implicit_include_directoriesr;  r<  rw  )r1   r   rx   is_generatedZ
base_proxyr  Zno_warn_argsr=   r  r   r  r  r  Zbargsr   r   r   _generate_single_compile  s>    


*!
		z%NinjaBackend._generate_single_compilec             C   s  t  | t  r6 | j d  r6 t d j |    n  t | j j   |  } | | | f } | |  j k r| |  j | }	 n" |  j	 | | |  }	 |	 |  j | <t
 |	 j |	  }	 t  | t j  r]| j r]t j j | j | j  }
 t j j |
  r<|
 j |  j j    st  |
 t |  j j    d d  }
 n  t j j |  j j   |
  } n t  | t j  r| j |  j  }
 | j |  j j   |  j j    } nu | rt d j |    nW t  | t  r| j |  j  }
 n t d j |    t j j |  j j   |
  } t  | t  r| j rt j j | j | j  } t j j |  r| j |  j j    st  | t |  j j    d d  } qq| j } n- t j j |  rt j j |  } n | } | j d d  j d	 d  } t j j |  j  |  |  } | d
 |  j j!   7} | j" |  } |	 |  j# | | |  7}	 |  j j$ j% j& d d  r|	 |  j' | |  7}	 | j( | j)  } n g  } | sg  } n\ | j* d k rg  } nD g  } t j j |  j  |  | j+ | d   } | j, |  | } d } | j- r,d } n  d | j.   | f } g  } | j.   d k r | s|| |  j/ | | |  7} n  x |  j0 | j1   j2   D]g \ } } t j j |  j  |  | j3 |   } | | k rt4 |  j5 | d |  } | j6 |  qqW|	 | j7 |  j  |   7}	 n  t4 |  j5 | | |
  } xo | D]g } t  | t  ri| j |  j  } n0 |  j8 |  st j j |  j  |  |  } n  | j9 |  q?Wx | D] } | j9 |  qWxo | D]g } t  | t  r| j |  j  } n0 |  j8 |  s)t j j |  j  |  |  } n  | j: |  qW| j: |  |	 j;   }	 x' |  j< | |  D] } | j: |  qfW| j= d |  | j= d |	  | j6 |  | S)zE
        Compiles C/C++, ObjC/ObjC++, Fortran, and D sources
        z.hz,BUG: sources should not contain headers {!r}r   Nz3BUG: broken generated source file handling for {!r}zInvalid source type: {!r}rA   r}   r@   rV  r   Fintelr   r   r  z%s%s_COMPILERr   ZFORTRAN_DEP_HACKrB   rx  )>r&   r'   r  r)   r   r   r   rh   rX   rE  r   rx   r   r   r  rk   rl   rI   r  r   r4  r\   r   r   rJ   r   r   r"  r  r   r  r!   rw  r5  depfile_for_objectr0  r   r   r   Zget_pch_include_argsget_pchr  ri   get_pch_namer9   r  r  r*  rY   r   r   r(  r%   r0   rK   get_module_outdir_argshas_dir_partr7   r8   r6  get_fortran_orderdepsr;   )r1   r   rL   r   rD  r   Z
order_depsrx   keyr  r   r   r7  r8  r  Zdep_filepchlistZpch_deparrr=   r  r9  
extra_depsr'  ZsrcfileZmodfileZdepelemr  r   r   r   r   r   /  s    &!	)		+		&!!z$NinjaBackend.generate_single_compilec             C   s2   t  | t  r | j d k Sd | k p1 d | k S)Nr   rA   r@   )r&   r   r  )r1   r   r   r   r   rK    s    zNinjaBackend.has_dir_partc                s-   | j  d k r g  S  f d d   | j D S)Nr   c                s4   g  |  ]* } t  j j   j |  | j     q Sr   )rk   rl   rI   r   ry  )r<   lt)r1   r   r   r>     s   	 z6NinjaBackend.get_fortran_orderdeps.<locals>.<listcomp>)r  r   )r1   r   rx   r   )r1   r   rL    s    z"NinjaBackend.get_fortran_orderdepsc             C   s   t  |  d k r! t d   n  | d } | d } | j |  } t j j |  j |  |  } g  } | |  j | |  7} t j j |  d }	 | j	 |	 | |  \ }
 } | | 7} | |  j
 | | |
  7} | d | j   } | | | |
 g f S)Nr   zGMSVC requires one header and one source to produce precompiled headers.r   r   rV  )rJ   RuntimeErrorrI  rk   rl   rI   rw  r  rt   gen_pch_argsr0  get_depfile_suffix)r1   r   rx   r.  headerr   pchnamedstr  Z	just_nameobjnameZpch_argsr6   r   r   r   generate_msvc_pch_command  s    


z&NinjaBackend.generate_msvc_pch_commandc             C   sr   |  j  | |  } t j j |  j |  t j j |  d d | j    } | d | j   } | | | g  f S)Nr   rV  rX  )rE  rk   rl   rI   rw  rt   get_pch_suffixrT  )r1   r   rx   r.  r  rW  r6   r   r   r   generate_gcc_pch_command  s
    'z%NinjaBackend.generate_gcc_pch_commandc             C   s  d } g  } | j  r d } n  xd d g D]} | j |  } | sL q+ n  d | d k sl d | d k r d j | j    } t |   n  | j | } | j d	 k rt j j	 |  j
 | j   | d  }	 |  j | | |  \ }
 } } } t j j	 |  j
 | j   | d  } ne | j d
 k r/q+ nP t j j	 |  j
 | j   | d  }	 |  j | | | d  \ }
 } } } d  } | | 7} | j   | d } t |  j | | |	  } | d  k	 r| j |  n  | j d |
  | j d |  | j |  q+ W| S)Nr   r  r   r  rA   r   r   zhPrecompiled header of {!r} must not be in the same directory as source, please put it in a subdirectory.r`   rF  Z_PCHrx  rB   rX  rX  )r  rH  r   r   r   r   ri   rk   rl   rI   r   get_source_subdirrY  r[  r  r%   r0   r7   r;   rK   )r1   r   rL   Zcstrr   r   r.  r   rx   r   r  r6   rW  objsZextradepr  r^   r   r   r   r     s<    		 %!(%%
zNinjaBackend.generate_pchc             C   s   |  j  |  } |  j |  } t j j | | d  } t |  j | d |  } |  j j   r |  j j	 j
   r | j d d |  j j	 j d d  n  | j |  d  S)Nz.symbolsZSHSYMZCROSSz--cross-host=host_machinesystem)r   rw  rk   rl   rI   r%   r0   r   r  r  r  r;   r  rK   )r1   rL   r   r  Z	targetdirZsymnamer^   r   r   r   r    s    !(zNinjaBackend.generate_shsymc             C   sF   t  | t j  s | j r  g  S|  j j j | j  s< g  S| j   S)N)	r&   r	   r   r  r   r  r+  r  get_no_stdlib_link_args)r1   r   r   r   r   r   get_cross_stdlib_link_args  s
    z'NinjaBackend.get_cross_stdlib_link_argsc          
   C   s  t  j j |  j j   | j  } g  } t | t j  r | | j	   7} | j
 rt t | d  rt | | j   7} n  | j r| | j t  j j |  j |  | j   7} qn<t | t j  rt | t j  r | | j   7} n | | j   7} | | j   7} | | j | j | j | j | | j t | t j   7} | j rt | d  r| | j | j j |  j   7} n  | j r| | j t  j j |  j |  | j   7} qn1 t | t j  r| | j   7} n t  d   | S)Nget_gui_app_argsgen_vs_module_defs_argszUnknown build target type.)!rk   rl   rI   r   r   r  r&   r	   r   r  gui_appr   rb  import_filenamegen_import_library_argsr   r   r=  get_std_shared_module_link_argsget_std_shared_lib_link_argsget_pic_argsget_soname_argsprefixr:   r   	soversionvs_module_defsrc  r   r   r   get_std_link_argsrR  )r1   r   r   rU  r  r   r   r   get_target_type_link_args	  s0    !	4	%	4z&NinjaBackend.get_target_type_link_argsc             C   s2   |  j  | | j  } t |  r. | j |  Sg  S)N)build_target_link_argumentsr  rJ   get_link_whole_for)r1   r   r   Ztarget_argsr   r   r   get_link_whole_args%	  s    z NinjaBackend.get_link_whole_argsc                s8  t  | t j  r d } n | j   } t  | t j  rL   j | |  n  d } | j rd d } n  | | d }	 t |  }
 t  | t j  s |
 t j	   j
 j j | t  | t j   7}
 n  |
   j | |  7}
 |
 | j   7}
 |
 | j   j d |   7}
 |
   j | | |  7}
 |
   j | |  7}
 t  | t j  s`|
   j | |  7}
 n  t  | t j  s|
   j j | | j  7}
 |
   j j |  7}
 | j s|
   j
 j j | j   7}
 qn  | d k rg  } n | j   } |
   j | |  7}
 x0 | j D]% } | j   r|
 | j   7}
 qqWt  | t j  s|
 | j 7}
 x' | j   D] } |
 j  | j!    qfWxV | j   D]E } t  | t j  rx* | j   D] } |
 j  | j!    qWqqWn  |
 | j"   j
 j j#  7}
 d | j$ k sd | j$ k rJt% j& j' t% j& j( | j$  d   j) |   } n   j) |  } |
 | j*   j
 j+   |   j, |  | j- | j.  7}
   j/ |  } |
 | 7}
 |
 | 7}
 |
 j0   }
   f d	 d
   | D } | j1   f d d
   | j2 D  t3   j4 | |	 |  } | j5 | |  | j6 d |
  | S)NZSTATICr   r  Z_LINKERr  rA   r@   r   c                s   g  |  ] }   j  |   q Sr   )get_dependency_filename)r<   r   )r1   r   r   r>   	  s   	 z.NinjaBackend.generate_link.<locals>.<listcomp>c                s   g  |  ] }   j  |   q Sr   )rs  )r<   r   )r1   r   r   r>   	  s   	Z	LINK_ARGS)7r&   r	   r   r  r   r  r  r   r   get_base_link_argsr   r   r   r=  ra  get_linker_always_argsget_buildtype_linker_argsrC  r2  ro  rr  r  r  r  external_link_argsr   rp  external_depsneed_threadsthread_link_flagsr  get_external_depsextend_directr  get_option_link_argscompiler_optionsr:   rk   rl   rI   rt   r   r  r   r  r  rE  Z$get_custom_target_provided_librariesr6  extendlink_dependsr%   r0   r7   r;   )r1   r   rL   r   r   r   r  Zlinker_baser  Zlinker_ruler  r   r   r6   r  Zcustom_target_librariesZdep_targetsr^   r   )r1   r   r   )	  s~    				#	!	

zNinjaBackend.generate_linkc             C   s   t  | t j  r; t j j |  j |  |  j |  d  St  | t j	  r | j
 r` | j   S| j |  j j   |  j j    Sn  |  j |  S)Nz.symbols)r&   r	   r   rk   rl   rI   rw  r   r   r   r  relative_namer"  r   r  r   )r1   r   r   r   r   rs  	  s    )	
z$NinjaBackend.get_dependency_filenamec             C   s   | j    } x | j   D] \ } } t j j |  j j   | |  } y t j |  Wn t k
 rk Yn Xy t j	 | |  Wq t
 k
 r t j d  Yq t k
 r t j d  Yq Xq Wd  S)Nz?Library versioning disabled because symlinks are not supported.zOLibrary versioning disabled because we do not have symlink creation privileges.)rD  r   rk   rl   rI   r   r   remover   symlinkNotImplementedErrorr
   debugOSError)r1   r   rK  aliasesaliastoZ	aliasfiler   r   r   r   	  s    !z#NinjaBackend.generate_shlib_aliasesc          
   C   s   t  |  j d d d  } t |  j j   |  } t j j |  j j   d  } | j	 d t
 j |  j j   d d | g  | j	 d d	  | j |  |  j d |  t | d
   } t j | |  Wd  QXd S)Nzmeson-clean-ctlistr   r   zcleantrees.datr  z
--internal
cleantreesrE   z#Cleaning custom target directories.r   zclean-ctlist)r%   r0   r   r   r   rk   rl   rI   rm   r;   r
  r  r  rK   r_   rj   r8  r9  )r1   rL   ZtreesrN   r   Zd_filer:  r   r   r   generate_custom_target_clean	  s    z)NinjaBackend.generate_custom_target_cleanc             C   s  t  |  j d d d  } |  j j   } t j j | d  } | j d t j	 | d d g  | j d d	  | j
 |  |  j d |  t  |  j d
 d d  } |  j j   } t j j | d  } | j d t j	 | d d g  | j d d  | j
 |  |  j d
 |  d  S)Nzmeson-clean-gcnor   r   zdelwithsuffix.pyr  rV  ZgcnorE   zDeleting gcno files.zmeson-clean-gcdaZgcdazDeleting gcda files.)r%   r0   r   get_script_dirrk   rl   rI   r;   r
  r  rK   r_   )r1   rL   Z	gcno_elemZscript_rootZclean_scriptZ	gcda_elemr   r   r   generate_gcov_clean	  s    z NinjaBackend.generate_gcov_cleanc             C   sy   g  } xf |  j  j j j   D]O \ } } | j d | d t | j t  rT | j n t | j  j    q Wt	 |  S)Nz-D=)
r   r   user_optionsr   r9   r&   r   r'   r&  sorted)r1   Zcmdskvr   r   r   get_user_option_args	  s    "Gz!NinjaBackend.get_user_option_argsc          
   C   s   t  |  j d d d  } | j d d  | j d t j |  j j   d d |  j j |  j j t j |  j j   g  | j d	 d
  | j	 |  |  j
 d |  d  S)Nz
meson-distr   r   rC   zCreating source packagesr  z
--internaldistrD   r  )r%   r0   r;   r
  r  r   r  
source_dir	build_dirrK   r_   )r1   rL   r^   r   r   r   r   	  s    		zNinjaBackend.generate_distc             C   s  t  j |  j j   d d |  j j |  j j t  j |  j j   g |  j   } t |  j d d d  } | j	 d |  | j	 d d  | j
 |  |  j d |  t  j |  j j   d d	 g } t |  j d
 d d  } | j	 d |  | j	 d d  | j
 |  |  j d
 |  d  S)Nz
--internal	scanbuildzmeson-scan-buildr   r   r  rD   r  	uninstallzmeson-uninstall)r
  r  r   r  r  r  r  r%   r0   r;   rK   r_   )r1   rL   r  r^   r   r   r   r   	  s    "zNinjaBackend.generate_utilsc       
      C   s  g  } xI |  j    j   D]5 } | j t j j |  j |  | j   d   q Wt |  j	 d d |  } | j
 |  d } | j
 |  t j   } | d  k r t d   n  t |  j	 d d d  } | j d	 | d
 d g  | j d d  |  j d |  g  } xn |  j j   j   D]W } t | t j  rx< | j   D]+ } | j t j j |  j |  |   qCWqqW| r| j |  j | |   n  d |  j j j k r|  j j j d j r|  j |  | j d  | j d  n  | j
 |  |  j   }	 t |  j	 d d |	  } | j d d  | j
 |  t |  j	 d d d  } | j d d  | j
 |  t |  j	 |	 d d  } | j
 |  d  S)Nr   r-  r[   zdefault all

z$Could not detect Ninja v1.6 or newerzmeson-cleanr   r   r  z-tcleanrE   z	Cleaning.r   z
clean-gcdaz
clean-gcnozbuild.ninjaZREGENERATE_BUILDrD   r  reconfigurer   )Zget_build_by_default_targetsrh   r9   rk   rl   rI   r   r   r%   r0   rK   r   r   r   r;   r_   r	   r   r&   r   r7   r  r   r   r   r  Zget_regen_filelist)
r1   rL   Z
targetlistr   r^   defaultZninja_commandZctlistr   r-   r   r   r   r   
  sH    30zNinjaBackend.generate_ending)r   zfortran)]rQ   rR   rS   r2   r_   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'  r   r2  r6  r3  r4  r5  r7  r   r   r   r   r  r   r{  r  r  r  r   r   r  r  r  r  r  r  r  r   rs  rt  r  r  r  r  r  r  r  r  r  r  rq  r   r  r   r   r*  r-  r0  r2  r   r;  r<  r>  rE  r   rK  rL  rY  r[  r   r  ra  ro  rr  r   rs  r   r  r  r  r   r   r   r   r   )rZ   r   rT      s   '"38'#W'!	5bK\1>

=,
.%!9#Ov$	#y	rT   )&rk   r8  rr   shlexshutilrn   r
  collectionsr   r   r   r   r   r   r	   r
   r   r   r   linkersr   r   r   r   r   r   r   r   r   r  rF   r  r  quoter$   r%   ZBackendrT   r   r   r   r   <module>   s0   T			Q