mesonbuild / mesonbuild/meson

Generator.process crashes when using results of another generator

Open
#9,753 9 comments 0 reactions 1 assignee Assigned to @bonzini View on GitHub
bug
Dominant language
Python
Stars
6.6k
Forks
1.9k
Avg merge
2d 6h
Merged PRs (30d)
33

Description

**Describe the bug**
Trying to chain generators raises an AssertionError. Patching this code then produces an invalid ninja.build

**To Reproduce**
For this toy example, all that is required is this `meson.build` and a blank file, `blank.txt`.

```meson
project('gentest', 'c')

cat = find_program('cat')
copy = find_program('cp')

gen1 = generator(copy, arguments: ['@INPUT@', '@OUTPUT@'], output: '@BASENAME@.g1')
gen2 = generator(copy, arguments: ['@INPUT@', '@OUTPUT@'], output: '@BASENAME@.g2')

# works OK
res1 = gen1.process('blank.txt')
# no longer OK
res2 = gen2.process(res1)
# let's use the generated result somewhere
custom_target(
output: 'b.out',
input: [res1, res2],
command: [cat, '@INPUT@'],
capture: true,
build_by_default: true,
)
```

**output**
```
Traceback (most recent call last):
File "/home/mon/meson/mesonbuild/mesonmain.py", line 138, in run
return options.run_func(options)
File "/home/mon/meson/mesonbuild/msetup.py", line 294, in run
app.generate()
File "/home/mon/meson/mesonbuild/msetup.py", line 185, in generate
self._generate(env)
File "/home/mon/meson/mesonbuild/msetup.py", line 247, in _generate
intr.backend.generate()
File "/home/mon/meson/mesonbuild/backend/ninjabackend.py", line 553, in generate
self.generate_target(t)
File "/home/mon/meson/mesonbuild/backend/ninjabackend.py", line 725, in generate_target
self.generate_custom_target(target)
File "/home/mon/meson/mesonbuild/backend/ninjabackend.py", line 986, in generate_custom_target
self.custom_target_generator_inputs(target)
File "/home/mon/meson/mesonbuild/backend/ninjabackend.py", line 972, in custom_target_generator_inputs
self.generate_genlist_for_target(s, target)
File "/home/mon/meson/mesonbuild/backend/ninjabackend.py", line 2242, in generate_genlist_for_target
elem.add_dep([self.get_target_filename(x) for x in generator.depends])
File "/home/mon/meson/mesonbuild/backend/ninjabackend.py", line 2242, in
elem.add_dep([self.get_target_filename(x) for x in generator.depends])
File "/home/mon/meson/mesonbuild/backend/backends.py", line 319, in get_target_filename
assert isinstance(t, build.BuildTarget)
AssertionError
```

Modifying the code here so that `GeneratedList` is treated identically to `CustomTarget` starts producing invalid ninja depedencies:
```
ninja: error: 'blank.g1', needed by 'b.out.p/blank.g2', missing and no known rule to make it
```

I've got halfway to a solution using a new sentinel type which is put into the target's private directory during ninja.build generation, but it feels like a very heavy solution. I am dedicated to fixing it but would like some guidance on easier strategies.

**system parameters**
* 0.60.99
* `master` at time of submission - 95a4c6a62a925fc888e7c07ae3d9937c87e1c759
* Ubuntu on WSL
* Python 3.8.10
* ninja 1.10.0

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.