@@ -1769,6 +1769,38 @@ def func_find_program(self, node: mparser.BaseNode, args: T.Tuple[T.List[mesonli
17691769 silent = False , wanted = kwargs ['version' ], version_arg = kwargs ['version_argument' ],
17701770 search_dirs = search_dirs )
17711771
1772+ def _local_program_impl (self , exe : T .Union [mesonlib .FileOrString , build .Executable , build .CustomTarget , build .CustomTargetIndex ],
1773+ depends_ : T .Optional [T .List [T .Union [build .BuildTarget , build .CustomTarget , build .CustomTargetIndex ]]] = None ,
1774+ depend_files_ : T .Optional [T .List [mesonlib .FileOrString ]] = None ,
1775+ interpreter : T .Optional [T .Union [ExternalProgram , T .List [T .Union [ExternalProgram , str ]]]] = None ) -> build .LocalProgram :
1776+ if isinstance (exe , build .CustomTarget ):
1777+ if len (exe .outputs ) != 1 :
1778+ raise InvalidArguments ('CustomTarget used as LocalProgram must have exactly one output.' )
1779+ depends = [d .target if isinstance (d , build .CustomTargetIndex ) else d for d in (depends_ or [])]
1780+ depend_files = self .source_strings_to_files (depend_files_ or [])
1781+ if isinstance (exe , (str , mesonlib .File )):
1782+ file = self .source_strings_to_files ([exe ])[0 ]
1783+ abspath = file .absolute_path (self .environment .source_dir , self .environment .build_dir )
1784+ prog = ExternalProgram (file .fname , command = [abspath ], silent = True )
1785+ return build .LocalProgram (prog , self .project_version , depends , depend_files )
1786+ if interpreter :
1787+ if not isinstance (exe , (build .CustomTarget , build .CustomTargetIndex )):
1788+ raise InvalidArguments ('The "interpreter" argument can only be used when the first argument is a custom target.' )
1789+ if isinstance (interpreter , list ):
1790+ interpreter , args = interpreter [0 ], interpreter [1 :]
1791+ if not isinstance (interpreter , ExternalProgram ) or any (not isinstance (a , str ) for a in args ):
1792+ raise InvalidArguments ('Interpreter must be an ExternalProgram followed by strings.' )
1793+ else :
1794+ args = []
1795+ if not interpreter .found ():
1796+ raise InvalidArguments (f'Specified interpreter program { interpreter .description ()!r} not found.' )
1797+ target = exe .target if isinstance (exe , build .CustomTargetIndex ) else exe
1798+ depends .append (target )
1799+ cmd = interpreter .get_command () + args + [self .backend .get_target_filename (exe )]
1800+ prog = ExternalProgram (exe .name , command = cmd , silent = True )
1801+ return build .LocalProgram (prog , self .project_version , depends , depend_files )
1802+ return build .LocalProgram (exe , self .project_version , depends , depend_files )
1803+
17721804 # When adding kwargs, please check if they make sense in dependencies.get_dep_identifier()
17731805 @typed_pos_args ('dependency' , varargs = str , min_varargs = 1 )
17741806 @typed_kwargs ('dependency' , * DEPENDENCY_KWS )
0 commit comments