
Y                 @   sa  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 d d l m Z d  d l	 Z	 d  d l
 Z
 d d l m Z m Z d d	 l m Z m Z d d
 l m Z d  d l m Z Gd d   d  Z Gd d   d  Z Gd d   d  Z Gd d   d  Z Gd d   d  Z Gd d   d  Z Gd d   d  Z d S)    N   )build)dependencies)mesonlib)mlog)	compilers)MesonExceptionget_meson_script)get_compiler_for_sourceclassify_unity_sources)CompilerArgs)OrderedDictc               @   s"   e  Z d  Z d Z d d   Z d S)
CleanTreesz
    Directories outputted by custom targets that have to be manually cleaned
    because on Linux `ninja clean` only deletes empty directories.
    c             C   s   | |  _  | |  _ d  S)N)	build_dirtrees)selfr   r    r   W/mnt/raid6/a/bak/reczko/tools/protein/utils/meson-0.42.1/mesonbuild/backend/backends.py__init__!   s    	zCleanTrees.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d d   Z d S)InstallDatac             C   sy   | |  _  | |  _ | |  _ | |  _ g  |  _ g  |  _ g  |  _ g  |  _ d |  _ g  |  _	 g  |  _
 g  |  _ | |  _ d  S)N )
source_dirr   prefix	strip_bintargetsheadersmandataZpo_package_namepoinstall_scriptsinstall_subdirsmesonintrospect)r   r   r   r   r   r%   r   r   r   r   &   s    												zInstallData.__init__N)r   r   r   r   r   r   r   r   r   %   s   r   c               @   s   e  Z d  Z d d   Z d S)ExecutableSerialisationc
       
      C   sU   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ |	 |  _ d  S)N)	namefnamecmd_argsenvis_cross
exe_runnerworkdirextra_pathscapture)
r   r'   r(   r)   r*   r+   exe_wrapperr-   r.   r/   r   r   r   r   6   s    								z ExecutableSerialisation.__init__N)r   r   r   r   r   r   r   r   r&   5   s   r&   c               @   s   e  Z d  Z d d   Z d S)TestSerialisationc             C   sp   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ |	 |  _ |
 |  _	 | |  _
 | |  _ d  S)N)r'   suiter(   r+   r,   is_parallelr)   r*   should_failtimeoutr-   r.   )r   r'   r2   r(   r+   r0   r3   r)   r*   r4   r5   r-   r.   r   r   r   r   C   s    											zTestSerialisation.__init__N)r   r   r   r   r   r   r   r   r1   B   s   r1   c               @   s   e  Z d  Z d d   Z d S)OptionProxyc             C   s   | |  _  | |  _ d  S)N)r'   value)r   r'   r7   r   r   r   r   S   s    	zOptionProxy.__init__N)r   r   r   r   r   r   r   r   r6   R   s   r6   c               @   s.   e  Z d  Z d Z d d   Z d d   Z d S)OptionOverrideProxyzKMimic an option list but transparently override
    selected option values.c             C   s   | |  _  | |  _ d  S)N)	overridesoptions)r   r9   r:   r   r   r   r   Z   s    	zOptionOverrideProxy.__init__c             C   s@   |  j  | } | |  j k r< t | j | j |  j |   S| S)N)r:   r9   r6   r'   validate_value)r   option_nameZbase_optr   r   r   __getitem__^   s     zOptionOverrideProxy.__getitem__N)r   r   r   r   r   r=   r   r   r   r   r8   W   s   r8   c               @   s  e  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 d  Z i  d d d   Z d! d"   Z d# d$   Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z e d- d.    Z d/ d0 d1  Z d2 d3   Z d4 d5   Z d6 d7   Z d8 d9   Z d: d;   Z d< d=   Z  d> d?   Z! d@ dA   Z" dB dC   Z# dD dE   Z$ dF dG   Z% dH dI   Z& dJ dK   Z' dL dM   Z( d/ dN dO  Z) d/ dP dQ  Z* dR dS   Z+ d S)TBackendc             C   s   | |  _  | j |  _ i  |  _ t j j |  j j   |  j j    |  _ x6 |  j  j	 D]( } |  j
 |  } t j | d d qU Wd  S)Nexist_okT)r   environmentprocessed_targetsospathrelpathget_source_dirget_build_dirbuild_to_srcr   get_target_private_dir_absmakedirs)r   r   tZpriv_dirnamer   r   r   r   g   s    		zBackend.__init__c             C   s   t  | t j  rY t | j    d k rF t j d j | j   n  | j   d } n$ t  | t j	  sq t
  | j   } t j j |  j |  |  S)N   zAcustom_target {!r} has more than one output! Using the first one.r   )
isinstancer   CustomTargetlenget_outputsr   warningformatr'   BuildTargetAssertionErrorget_filenamerB   rC   joinget_target_dir)r   rJ   filenamer   r   r   get_target_filenameq   s    zBackend.get_target_filenamec             C   s%   t  j j |  j j   |  j |   S)N)rB   rC   rU   r@   rF   rX   )r   targetr   r   r   get_target_filename_abs|   s    zBackend.get_target_filename_absc             C   sE   | | j  k r2 | j  | } |  j j j | |  S|  j j j |  S)N)option_overridesr@   coredatavalidate_option_valueget_builtin_option)r   r<   rY   Zoverrider   r   r   get_option_for_target   s    zBackend.get_option_for_targetc             C   s   t  | t j  rF | j   p' | j   } t j j |  j |  |  St  | t j	  rz t j j |  j |  | j    St  | t j
  r | j r t j j |  j |  | j    Sd  Sn  t d j |    d  S)Nz0BUG: Tried to link to {!r} which is not linkable)rL   r   SharedLibraryget_import_filenamerT   rB   rC   rU   rV   StaticLibrary
Executableimport_filenamerS   rQ   )r   rY   Zlink_libr   r   r   get_target_filename_for_linking   s    "	"z'Backend.get_target_filename_for_linkingc             C   s4   |  j  j j d  d k r* | j   } n d } | S)Nlayoutmirrorz	meson-out)r@   r\   r^   
get_subdir)r   rY   dirnamer   r   r   rV      s    zBackend.get_target_dirc             C   s%   t  j j |  j |  j |   } | S)N)rB   rC   rU   rG   rV   )r   rY   ri   r   r   r   get_target_source_dir   s    !zBackend.get_target_source_dirc             C   s2   t  j j |  j |  | j   | j    } | S)N)rB   rC   rU   rV   get_basenametype_suffix)r   rY   ri   r   r   r   get_target_private_dir   s    .zBackend.get_target_private_dirc             C   s+   t  j j |  j j   |  j |   } | S)N)rB   rC   rU   r@   rF   rm   )r   rY   ri   r   r   r   rH      s    'z"Backend.get_target_private_dir_absc             C   sJ   t  | t j  r. t j j |  j |  |  St j j |  j |  |  S)z
        Takes a BuildTarget, a generator source (CustomTarget or GeneratedList),
        and a generated source filename.
        Returns the full path of the generated source relative to the build root
        )rL   r   rM   rB   rC   rU   rV   rm   )r   rY   gensrcsrcr   r   r   get_target_generated_dir   s    z Backend.get_target_generated_dirc             C   s   | j  d | S)Nz-unity.)r'   )r   rY   suffixr   r   r   get_unity_source_filename   s    z!Backend.get_unity_source_filenamec       	         s   g    g   t   j j   |  }      f d d   } xW | j   D]I \ } } | | j    ) } x | D] } | j d |  qt WWd  QXqL Wd d     D  S)Nc                s    j   |   }  j   } t j j | |  } t j j  j j   |  } | d }   j |  t j j |  } t j j	 |  s t j
 |  n   j t j d | |   t | d  S)Nz.tmpTw)rr   rH   rB   rC   rU   r@   rF   appendri   existsrI   r   Fileopen)rq   Zunity_src_nameZunity_src_subdiroutfilenameZ
outfileabsZoutfileabs_tmpZoutfileabs_tmp_dir)	abs_filesresultr   rY   r   r   init_language_file   s    		
z8Backend.generate_unity_files.<locals>.init_language_filez#include<%s>
c             S   s&   g  |  ] } t  j | | d    q S)z.tmp)r   replace_if_different).0xr   r   r   
<listcomp>   s   	 z0Backend.generate_unity_files.<locals>.<listcomp>)r   r   valuesitemsget_default_suffixwrite)	r   rY   	unity_srccompsrcsr{   compsrcsofilero   r   )ry   rz   r   rY   r   generate_unity_files   s    zBackend.generate_unity_filesc             C   s1   t  j j t  j j d |  t  j j d |   S)NZdummyprefixdir)rB   rC   rD   rU   )r   ZtodirZfromdirr   r   r   rD      s    zBackend.relpathr   c             C   s   g  } x | j    D] } t | t  r\ t j j | |  j | j   |  } | j |  q t | t	 j
  r | j | j |  j   q t | t j  r | |  j | | |  7} q t d   q W| S)Nz!Unknown data type in object list.)get_objectsrL   strrB   rC   rU   rG   rh   rt   r   rv   rel_to_builddirr   ExtractedObjectsdetermine_ext_objsr   )r   rY   proj_dir_to_build_rootobj_listobjor   r   r   flatten_object_list   s    zBackend.flatten_object_listNc             C   s(  d d  l  } t | t j t j t j f  r9 | j } n t j	 j
 |  } t t t | j     t |  t |  t |  d d } | j |  j   }	 d j | |	  }
 t j	 j |  j j   |
  } t | d  A} t | t j  r| j   } d } nH t | t j t j f  rD|  j |  g } | j } n | g } d } | o|  j j   o|  j j j   o|  j j j   } | r|  j j j d j d d   } n d  } t j    st j!   r|  j" |  } n g  } t# | | | | | | | | | 	 } t$ j% | |  Wd  QX| S)	Nr   encodingzutf-8zmeson_exe_{0}_{1}.datwbFbinariesr0   )&hashlibrL   r   ExternalProgramr   rR   rM   r'   rB   rC   basenamebytesr   sortedr   sha1	hexdigestrQ   rU   r@   get_scratch_dirrw   get_commandrZ   r+   is_cross_build
cross_infoneed_cross_compilerneed_exe_wrapperconfiggetr   
is_windows	is_cygwindetermine_windows_extra_pathsr&   pickledump)r   exer)   r-   r*   r/   r   r   r!   digestZscratch_fileexe_datafZexe_cmdZexe_needs_wrapperr+   r0   r.   esr   r   r   serialize_executable   sD    9			"	zBackend.serialize_executablec             C   s   t  j j |  j j   d  } t | d   } |  j |  Wd  QXt  j j |  j j   d  } t | d   } |  j |  Wd  QX| | f S)Nzmeson_test_setup.datr   zmeson_benchmark_setup.dat)rB   rC   rU   r@   r   rw   write_test_filewrite_benchmark_file)r   Z	test_datadatafileZbenchmark_datar   r   r   serialize_tests  s    zBackend.serialize_testsc             C   si   t  | t j  r2 | j r% |  j j S|  j j Sn  | j   } | se d } t | j | j	    n  | S)z
        If we're building a static library, there is only one static linker.
        Otherwise, we query the target for the dynamic linker.
        z)Couldn't determine linker for target {!r})
rL   r   rb   r+   static_cross_linkerstatic_linkerget_clike_dynamic_linkerr   rQ   r'   )r   rY   lmr   r   r   determine_linker  s    	
zBackend.determine_linkerc             C   sR   | j    } g  } x9 | D]1 } |  j |  } | | k r | j |  q q W| S)N)get_all_link_depsrV   rt   )r   rY   	link_depsrz   ldZprospectiver   r   r   determine_rpath_dirs.  s    zBackend.determine_rpath_dirsc             C   s   t  | t j  r | j } n  | j d
  r | rR | d  d  d |  j j   St j j	 |  j
 |  | d  d  d  } n  | j d d  j d d  d	 |  j j   S)N.vala.gs   z.c.z.c/_\.)r   r   r   )rL   r   rv   r(   endswithr@   get_object_suffixrB   rC   rU   rm   replace)r   rY   sourceis_unityr   r   r   object_filename_from_source7  s    /z#Backend.object_filename_from_sourcec       
      C   s/  g  } |  j  | j  } |  j |  r t | j j j   | j d  } |  j | j | j    } t	 j
 j |  j  | j  |  } |  j | j | d  } | j d d  j d d  } t	 j
 j | | |  }	 |	 g SxN | j D]C } |  j | j | d  } t	 j
 j | | |  }	 | j |	  q W| S)Nr   Tr   r   r   F)rm   rY   r   r
   r   r   srclistrr   r   rB   rC   rU   r   r   rt   )
r   rY   Zextobjr   rz   	targetdirr   ZosrcobjnameZobjpathr   r   r   r   A  s"    !zBackend.determine_ext_objsc       	      C   s   g  } |  j  |  } | j | d  } xe d d g D]W } | j |  } | sU q4 n  | j | d  r4 | d } | | j | |  7} q4 q4 Wt |  d k r | | } n  | S)NFccpprK   r   )rm   get_include_argsget_pchcan_compileget_pch_use_argsrN   )	r   compilerrY   argsZpchpathZincludeargslangpheaderr   r   r   get_pch_include_argsY  s    
zBackend.get_pch_include_argsc             C   s  t  j   s | Sg  } |  j   d k r x | D]v } | j d  sS | j d  r | j d  ro | d 7} q | j d  r | d  d	  d } q n  | j |  q/ WnQ xN | D]F } | j d  s | j d  r | j d d  } n  | j |  q W| S)
Nmsvcz-Dz/Dr   z\"r   z\\"z\\)r   r   get_id
startswithr   rt   r   )r   r   
extra_argsargr   r   r   escape_extra_argsh  s     zBackend.escape_extra_argsFc             C   sc  t  |  } t | j |  j j j  } | |  j | |  7} | | j   7} | rf | | j   7} n: |  j	 d |  d k r | | j
 |  j	 d |   7} n  |  j	 d |  r | | j   7} n  | | j |  7} | | j |  j	 d |   7} | |  j j | | j  7} | |  j j |  7} | j sR| |  j j j | j   7} n  t | t j  rw| | j   7} n  t | t j  r| j r| | j   7} n  xGt | j    D]3} | j   sqn  | j d k rt | t j  ri| j  d k rS| j! d  k	 rSxA | j! D]3 } | j" d  r| d	 | d
 d   g 7} PqqWn  | d | j  g 7} qt | t j#  r| | j$ d  7} qn | | j%   7} t | t j&  r| | j' |  7} n  | j(   r| | j)   7} qqW| j d k r_x^ | j* D]P } t+ j, j- |  j. |  | j/   | j0    }	 | j1 |	 d  }
 | |
 7} qWn  | S)N	buildtypeplainwarning_levelwerrorvalazglib-2.0>===z--target-glibr   z--pkgfortranF)r   r   )2r   r8   r[   r@   r\   compiler_optionsget_cross_stdlib_argsget_always_argsget_no_warn_argsr_   get_warn_argsget_werror_argsget_option_compile_argsget_buildtype_argsr   get_project_args
subprojectget_global_argsr+   external_argsget_languagerL   r`   get_pic_argsrb   picreversedget_external_depsfoundlanguager   PkgConfigDependencyr'   version_reqsr   ExternalLibraryget_link_argsget_compile_argsrc   get_exe_argsneed_threadsthread_flagslink_targetsrB   rC   rU   rV   rk   rl   r   )r   rY   r   no_warn_argscommandsZ
copt_proxydepreqltpriv_dirZincflagr   r   r   generate_basic_compiler_args  sX    "	 .z$Backend.generate_basic_compiler_argsc             C   s   g  } x | D]{ } | j    s8 t d | j     n  |  j |  } | sS q n  t | t j t j f  r{ d | } n  | j |  q W| S)Nz-Tried to link with a non-library target "%s".z-L)	is_linkable_targetRuntimeErrorrk   re   rL   r   LLVMDCompilerDmdDCompilerrt   )r   r   depsr   dZd_argr   r   r   build_target_link_arguments  s    z#Backend.build_target_link_argumentsc             C   s   t  | t j  s g  S| j   } g  } xo | D]g } | d k s/ | d k rS q/ n  t j j |  j j   |  j	 |   } | | k r/ | j
 |  q/ q/ W| S)zOn Windows there is no such thing as an rpath.
        We must determine all locations of DLLs that this exe
        links to and return them so they can be used in unit
        tests.r   r   )rL   r   rc   get_transitive_link_depsrB   rC   rU   r@   rF   rV   rt   )r   rY   Zprospectivesrz   r   Zdirsegr   r   r   r     s    'z%Backend.determine_windows_extra_pathsc             C   s   |  j  |  j j   |  d  S)N)write_test_serialisationr   get_benchmarks)r   r   r   r   r   r     s    zBackend.write_benchmark_filec             C   s   |  j  |  j j   |  d  S)N)r  r   	get_tests)r   r   r   r   r   r     s    zBackend.write_test_filec             C   sf  g  } xI| D]A} | j    } t | t j  r@ | j   } n0 t j j |  j j	   |  j
 | j      g } |  j j   o |  j j j   o |  j j j   } t | t j  r | o | j } n  | r |  j j j d j d d   } n d  } t j   st j   r|  j |  }	 n g  }	 g  }
 x | j D] } t | d  rV| j } n  t | t j  rt j j |  j j	   | j |  j   } |
 j |  q5t | t  r|
 j |  q5t | t j   r|
 j |  j
 |   q5t! d   q5Wt" | j#   | j$ | | | | j% |
 | j& | j' | j( | j) |	  } | j |  q Wt* j+ | |  d  S)Nr   r0   held_objectzBad object in test command.),get_exerL   r   r   r   rB   rC   rU   r@   rF   rX   r   r   r   r   r   rR   r+   r   r   r   r   r   r   r)   hasattrr  rv   r   rG   rt   r   Targetr   r1   get_namer2   r3   r*   r4   r5   r-   r   r   )r   testsr   arrrJ   r   cmdr+   r0   r.   r)   atsr   r   r   r    sD    0"*z Backend.write_test_serialisationc          
   C   s   |  j  j d  k r d  St j j |  j j   d  } t j j |  j j   |  j  j  } i d d 6d d 6|  j  j d 6} t	 | d   } | j
 t j |   Wd  QX| j j | | d  g  d  S)Nz
depmf.jsonzdependency manifesttypez1.0versionprojectsrs   )r   dep_manifest_namerB   rC   rU   r@   rF   
get_prefixdep_manifestrw   r   jsondumpsr!   rt   )r   r  Z	ifilename	ofilenameZmfobjr   r   r   r   generate_depmf_install   s    $!zBackend.generate_depmf_installc                s.    f d d     j  j   D }   j j   r\ | j t j j   j   j j	 j
   n  | j d  t j j t j j   j j   d   r | j t j j   j d   n  xr   j j j   D]^ } t j j   j j   | d  } t j j |  r | j t j j   j | d   q q W| S)zcList of all files whose alteration means that the build
        definition needs to be regenerated.c                s(   g  |  ] } t  j j   j |   q Sr   )rB   rC   rU   rG   )r}   df)r   r   r   r   .  s   	z.Backend.get_regen_filelist.<locals>.<listcomp>zmeson-private/coredata.datzmeson_options.txt)interpreterget_build_def_filesr@   r   rt   rB   rC   rU   rG   r\   
cross_fileru   rE   r   subprojectskeysisfile)r   r  spr(   r   )r   r   get_regen_filelist+  s    *"!)zBackend.get_regen_filelistc             C   s   |  j  j   r |  j  j j   r t | t j  r | j r d |  j  j j d k r d } | d 7} | | j	 } t
 |   q n  t | t j  r t j j |  j  j   |  j |   g } n | j   } | S)Nr0   r   z?Can not use target %s as a generator because it is cross-built
zJand no exe wrapper is defined. You might want to set it to native instead.)r@   r   r   r   rL   r   rR   r+   r   r'   r   rB   rC   rU   rF   rX   r   )r   r   sexe_arrr   r   r   exe_object_to_cmd_array<  s    
-zBackend.exe_object_to_cmd_arrayc             C   sG   g  } x: | D]2 } | d k r2 | | j    7} q | j |  q W| S)Nz@EXTRA_ARGS@)get_extra_argsrt   )r   r   genlistZ
final_argsr"  r   r   r   replace_extra_argsK  s    zBackend.replace_extra_argsc       
      C   s   g  } t  j d  } x | D] } | j |  } xc | d  k	 r t | j d   } d | }	 | j |	 t j j | | |   } | j |  } q4 W| j	 |  q W| S)Nz@OUTPUT(\d+)@rK   z
@OUTPUT%d@)
recompilesearchintgroupr   rB   rC   rU   rt   )
r   r   private_dirZoutput_listZnewargsregexr   r   indexro   r   r   r   replace_outputsT  s    
%zBackend.replace_outputsc             C   s'  t    } xK |  j j   j   D]4 \ } } | j sF | j sF | j r | | | <q q Wx |  j j   D] } | j } t	 | d  r | j
 } n  t | t j t j f  r | | | j   <n  x] | j D]R } t	 | d  r | j
 } n  t | t j t j f  sq n  | | | j   <q Wqg W| S)Nr  )r   r   get_targetsr   build_by_defaultinstallbuild_alwaysr  r   r  r  rL   rM   rR   r   r)   )r   rz   r'   rJ   r   r   r   r   r   get_build_by_default_targetsa  s"    	"	z$Backend.get_build_by_default_targetsc             C   s   g  } x} | j    D]o } t | t j  s1 q n  xN | j   D]@ } |  j j |  r> | j t j	 j
 |  j |  |   q> q> Wq W| S)N)get_generated_sourcesrL   r   rM   rO   r@   
is_libraryrt   rB   rC   rU   rV   )r   rY   libsrJ   r   r   r   r   $get_custom_target_provided_librariesx  s    0z,Backend.get_custom_target_provided_librariesc             C   sA   |  j  d |  } | d k s9 | d k r= | j d k r= d Sd S)Nunityonr2  r   TF)r_   r   )r   rY   optvalr   r   r   r     s    'zBackend.is_unityc                sH  g  } x; j    D]-  t   d  r4   j   n  t   t  rg t j j  j  j	    g } n t   t
 j  r  j    g } n t   t
 j  r    f d d     j   D } nL t   t
 j  r   f d d     j   D } n   j  j  g }  j r6 f d d   | D } n  | | 7} q W| S)z
        Custom target sources can be of various object types; strings, File,
        BuildTarget, even other CustomTargets.
        Returns the path to them relative to the build root directory.
        r  c                s.   g  |  ]$ } t  j j  j    |   q Sr   )rB   rC   rU   rV   )r}   r   )ir   r   r   r     s   	 z5Backend.get_custom_target_sources.<locals>.<listcomp>c                s.   g  |  ]$ } t  j j   j   |   q Sr   )rB   rC   rU   rm   )r}   r   )r   rY   r   r   r     s   	 c                s.   g  |  ]$ } t  j j   j j   |   q Sr   )rB   rC   rU   r@   rF   )r}   r   )r   r   r   r     s   	 )get_sourcesr  r  rL   r   rB   rC   rU   rG   subdirr   rR   rX   rM   rO   GeneratedListr   absolute_paths)r   rY   r   r(   r   )rR  r   rY   r   get_custom_target_sources  s"    $%%	z!Backend.get_custom_target_sourcesc             C   s   g  } x | j  D] } t | t j  rx | r\ | j | j |  j j   |  j j     q | j | j	 |  j
   q | r | j t j j |  j j   |   q | j t j j |  j
 |   q W| S)N)depend_filesrL   r   rv   rt   absolute_pathr@   rE   rF   r   rG   rB   rC   rU   )r   rY   rV  r  rR  r   r   r   get_custom_target_depend_files  s    (#z&Backend.get_custom_target_depend_filesc             C   st  |  j  } d } |  j |  } | rc |  j j   } |  j j   } t j j |  j j   |  } n  g  } x0 | j   D]" } | j	 t j j | |   qv W|  j
 |  } g  }	 x|| j D]q} t | t j  r |	 |  j |  7}	 q n3t | t j  r/| j   d }
 t j j |  j |  |
  } nt | t j  r| j |  j   } | j rt j j |  j j   |  } qnt | t  sd } t | j t |  t t |      n]d | k r| j d |  } n<d | k r| j d |  } nd | k rm| j d  k r@d j | j  } t |   n  t j j | | j  } | j d |  } n d | k rt j d	 |  } | sd
 j | j |  } t |   n  | j d  } | j d  d  k r| j rd } n |  j j   } | j | t j j | |   } n  |	 j	 |  q Wt j  | |  } t j! |	 |  }	 d d   |	 D }	 | | |	 f S)Nr   r   z#Argument {0} is of unknown type {1}z@SOURCE_ROOT@z@BUILD_ROOT@z	@DEPFILE@zACustom target {!r} has @DEPFILE@ but no depfile keyword argument.z@PRIVATE_OUTDIR_z"@PRIVATE_OUTDIR_(ABS_)?([^/\s*]*)@z/Custom target {!r} has an invalid argument {!r}rK   r   c             S   s"   g  |  ] } | j  d  d   q S)r   r   )r   )r}   rR  r   r   r   r      s   	 z6Backend.eval_custom_target_command.<locals>.<listcomp>)"rG   rV   r@   rE   rB   rC   rU   rF   rO   rt   rW  commandrL   r   rc   r9  rM   r   rv   r   rV  r   r  rQ   r$  r   depfiler'   r   r=  r?  rA  get_filenames_templates_dictsubstitute_values)r   rY   Zabsolute_outputssource_root
build_rootoutdiroutputsrR  inputsr!  tmperr_msgmsgZ	dfilenamematchr   Zlead_dirr   r   r   r   eval_custom_target_command  sf    	! !	$-	$z"Backend.eval_custom_target_commandc             C   s   i |  j  j   d 6|  j  j   d 6t |  j  d  d 6} t j j   } | j |  x9 |  j j	 D]+ } | d | d } t
 j | d | qb Wd  S)NMESON_SOURCE_ROOTMESON_BUILD_ROOTr%   MESONINTROSPECTr   r   r*   )r@   rE   rF   r	   rB   environcopyupdater   postconf_scripts
subprocess
check_call)r   r*   	child_envr7  r!  r   r   r   run_postconf_scripts  s    zBackend.run_postconf_scripts),r   r   r   r   rX   rZ   r_   re   rV   rj   rm   rH   rp   rr   r   rD   r   r   r   r   r   r   r   r   staticmethodr   r  r  r   r   r   r  r-  r6  r9  r<  rE  rJ  rN  r   rW  rZ  rh  rs  r   r   r   r   r>   f   sR   
,		
Q(	
Rr>   )rB   r   r=  r   r   r   r   r   r   r*  rp  r   r	   r
   r   r   collectionsr   r   r   r&   r1   r6   r8   r>   r   r   r   r   <module>   s$   $	