Skip to content

Commit

Permalink
add_*_script: Merge first argument with the rest in a single list
Browse files Browse the repository at this point in the history
This has side effect to allow CustomTarget and CustomTargetIndex as
first argument of add_install_script() which is more consistent with
custom_target() command kwarg.
  • Loading branch information
xclaesse committed Aug 3, 2023
1 parent 97f36ab commit 8bb6f49
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 41 deletions.
5 changes: 5 additions & 0 deletions docs/markdown/snippets/add_install_script.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## `meson.add_install.script()` accepts CustomTarget as first argument

It was previously wrongly documented as supported, but now CustomTarget and
CustomTarget indexes are supported. It was already accepted in script arguments
before.
2 changes: 2 additions & 0 deletions docs/yaml/builtins/meson.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ methods:
[[custom_target]], as well as strings are accepted.
*(since 0.57.0)* [[@file]] objects and the output of [[configure_file]] may be used.
*(since 1.3.0)* [[@custom_tgt]] and [[@custom_idx]] objects may be used as the
first argument. They were already accepted as extra arguments.
varargs:
name: arg
Expand Down
72 changes: 32 additions & 40 deletions mesonbuild/interpreter/mesonmain.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from ..interpreterbase import TYPE_kwargs, TYPE_var
from ..mesonlib import ExecutableSerialisation
from .interpreter import Interpreter
from ..build import BuildTargetTypes

class FuncOverrideDependency(TypedDict):

Expand Down Expand Up @@ -87,43 +88,37 @@ def __init__(self, build: 'build.Build', interpreter: 'Interpreter'):
})

def _find_source_script(
self, name: str, prog: T.Union[str, mesonlib.File, build.Executable, ExternalProgram],
args: T.List[str]) -> 'ExecutableSerialisation':
largs: T.List[T.Union[str, build.Executable, ExternalProgram]] = []
self, name: str,
cmd: T.Sequence[T.Union[str, mesonlib.File, ExternalProgram, BuildTargetTypes]]) -> 'ExecutableSerialisation':
largs: T.List[T.Union[str, mesonlib.File, ExternalProgram, BuildTargetTypes]] = []

prog, *args = cmd
if isinstance(prog, (build.Executable, ExternalProgram)):
FeatureNew.single_use(f'Passing executable/found program object to script parameter of {name}',
'0.55.0', self.subproject, location=self.current_node)
largs.append(prog)
else:
elif isinstance(prog, (str, mesonlib.File)):
if isinstance(prog, mesonlib.File):
FeatureNew.single_use(f'Passing file object to script parameter of {name}',
'0.57.0', self.subproject, location=self.current_node)
found = self.interpreter.find_program_impl([prog])
largs.append(found)
else:
FeatureNew.single_use(
f'Calling "{name}" with CustomTarget or Index of CustomTarget as first argument',
'1.3.0', self.interpreter.subproject, location=self.current_node)
largs.append(prog)

largs.extend(args)
es = self.interpreter.backend.get_executable_serialisation(largs, verbose=True)
es.subproject = self.interpreter.subproject
return es

def _process_script_args(
self, name: str, args: T.Sequence[T.Union[
str, mesonlib.File, build.BuildTarget, build.CustomTarget,
build.CustomTargetIndex,
ExternalProgram,
]]) -> T.List[str]:
script_args = [] # T.List[str]
new = False
for a in args:
if isinstance(a, str):
script_args.append(a)
largs.append(a)
elif isinstance(a, mesonlib.File):
new = True
script_args.append(a.rel_to_builddir(self.interpreter.environment.source_dir))
largs.append(a.rel_to_builddir(self.interpreter.environment.source_dir))
elif isinstance(a, (build.BuildTarget, build.CustomTarget, build.CustomTargetIndex)):
new = True
script_args.extend([os.path.join(a.get_subdir(), o) for o in a.get_outputs()])
largs.extend([os.path.join(a.get_subdir(), o) for o in a.get_outputs()])

# This feels really hacky, but I'm not sure how else to fix
# this without completely rewriting install script handling.
Expand All @@ -134,20 +129,23 @@ def _process_script_args(
else:
a.build_by_default = True
else:
script_args.extend(a.command)
largs.extend(a.command)
new = True

if new:
FeatureNew.single_use(
f'Calling "{name}" with File, CustomTarget, Index of CustomTarget, '
'Executable, or ExternalProgram',
'0.55.0', self.interpreter.subproject, location=self.current_node)
return script_args

es = self.interpreter.backend.get_executable_serialisation(largs, verbose=True)
es.subproject = self.interpreter.subproject
return es

@typed_pos_args(
'meson.add_install_script',
(str, mesonlib.File, build.Executable, ExternalProgram),
varargs=(str, mesonlib.File, build.BuildTarget, build.CustomTarget, build.CustomTargetIndex, ExternalProgram)
varargs=(str, mesonlib.File, ExternalProgram, build.BuildTarget, build.CustomTarget, build.CustomTargetIndex),
min_varargs=1,
)
@typed_kwargs(
'meson.add_install_script',
Expand All @@ -157,50 +155,44 @@ def _process_script_args(
)
def add_install_script_method(
self,
args: T.Tuple[T.Union[str, mesonlib.File, build.Executable, ExternalProgram],
T.List[T.Union[str, mesonlib.File, build.BuildTarget, build.CustomTarget, build.CustomTargetIndex, ExternalProgram]]],
args: T.Tuple[T.List[T.Union[str, mesonlib.File, ExternalProgram, BuildTargetTypes]]],
kwargs: 'AddInstallScriptKW') -> None:
script_args = self._process_script_args('add_install_script', args[1])
script = self._find_source_script('add_install_script', args[0], script_args)
script = self._find_source_script('add_install_script', args[0])
script.skip_if_destdir = kwargs['skip_if_destdir']
script.tag = kwargs['install_tag']
script.dry_run = kwargs['dry_run']
self.build.install_scripts.append(script)

@typed_pos_args(
'meson.add_postconf_script',
(str, mesonlib.File, ExternalProgram),
varargs=(str, mesonlib.File, ExternalProgram)
varargs=(str, mesonlib.File, ExternalProgram),
min_varargs=1,
)
@noKwargs
def add_postconf_script_method(
self,
args: T.Tuple[T.Union[str, mesonlib.File, ExternalProgram],
T.List[T.Union[str, mesonlib.File, ExternalProgram]]],
args: T.Tuple[T.List[T.Union[str, mesonlib.File, ExternalProgram]]],
kwargs: 'TYPE_kwargs') -> None:
script_args = self._process_script_args('add_postconf_script', args[1])
script = self._find_source_script('add_postconf_script', args[0], script_args)
script = self._find_source_script('add_postconf_script', args[0])
self.build.postconf_scripts.append(script)

@typed_pos_args(
'meson.add_dist_script',
(str, mesonlib.File, ExternalProgram),
varargs=(str, mesonlib.File, ExternalProgram)
varargs=(str, mesonlib.File, ExternalProgram),
min_varargs=1,
)
@noKwargs
def add_dist_script_method(
self,
args: T.Tuple[T.Union[str, mesonlib.File, ExternalProgram],
T.List[T.Union[str, mesonlib.File, ExternalProgram]]],
args: T.Tuple[T.List[T.Union[str, mesonlib.File, ExternalProgram]]],
kwargs: 'TYPE_kwargs') -> None:
if args[1]:
if len(args[0]) > 1:
FeatureNew.single_use('Calling "add_dist_script" with multiple arguments',
'0.49.0', self.interpreter.subproject, location=self.current_node)
if self.interpreter.subproject != '':
FeatureNew.single_use('Calling "add_dist_script" in a subproject',
'0.58.0', self.interpreter.subproject, location=self.current_node)
script_args = self._process_script_args('add_dist_script', args[1])
script = self._find_source_script('add_dist_script', args[0], script_args)
script = self._find_source_script('add_dist_script', args[0])
self.build.dist_scripts.append(script)

@noPosargs
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"stdout": [
{
"line": "test cases/failing/116 run_target in add_install_script/meson.build:7:6: ERROR: meson.add_install_script argument 2 was of type \"RunTarget\" but should have been one of: \"str\", \"File\", \"BuildTarget\", \"CustomTarget\", \"CustomTargetIndex\", \"ExternalProgram\""
"line": "test cases/failing/116 run_target in add_install_script/meson.build:7:6: ERROR: meson.add_install_script argument 2 was of type \"RunTarget\" but should have been one of: \"str\", \"File\", \"ExternalProgram\", \"BuildTarget\", \"CustomTarget\", \"CustomTargetIndex\""
}
]
}
Expand Down

0 comments on commit 8bb6f49

Please sign in to comment.