summary refs log tree commit diff stats
path: root/gitlab/issues/target_missing/host_missing/accel_missing/1898.toml
blob: d9f944735ec8dfa49f08ceed08bba4fb4f716ec1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
id = 1898
title = "Ninja makeserver support"
state = "closed"
created_at = "2023-09-21T08:01:32.084Z"
closed_at = "2024-04-11T11:08:50.838Z"
labels = ["Build System"]
url = "https://gitlab.com/qemu-project/qemu/-/issues/1898"
host-os = "Linux"
host-arch = "x86_64"
qemu-version = "8.1"
guest-os = "n/a"
guest-arch = "n/a"
description = """Building `qemu` using a patched version of `ninja`[0] to utilize `make`'s jobserver feature doesn't work when building `qemu`. Usually, when using a jobserver to control the number of jobs being built in parallel across multiple different builds (i.e. when building with `open-embedded` or `buildroot`), the `-j$(nproc)` argument is left out. In this case, the `Qemu` `Makefile` interprets the absent `-j` argument as a wish for a single process only, and adds a `-j1` argument to the `ninja` call."""
reproduce = """1. Built/install the patched `ninja` from [0]: `export PATH=<path/to/ninja>:$PATH`
2. Start the attached [jobserver.py](/uploads/8215e8a470c97cd456d2d14e2c71c6a5/jobserver.py) script: `python jobserver.py /tmp/jobserver 4`
3. Configure `qemu`: `mkdir build; ../configure`
4. Build `qemu`: `MAKEFLAGS="--jobserver-auth=fifo:/tmp/jobserver" make`
5. Observe that only a single CPU/core is being used.

Now, to avoid passing `-j1` to `ninja`, remove filtering of `-j` arguments from the `Makefile`:

```patch
diff --git a/Makefile b/Makefile
index bfc4b2c8e9..d66141787e 100644
--- a/Makefile
+++ b/Makefile
@@ -142,7 +142,6 @@ MAKE.k = $(findstring k,$(firstword $(filter-out --%,$(MAKEFLAGS))))
 MAKE.q = $(findstring q,$(firstword $(filter-out --%,$(MAKEFLAGS))))
 MAKE.nq = $(if $(word 2, $(MAKE.n) $(MAKE.q)),nq)
 NINJAFLAGS = $(if $V,-v) $(if $(MAKE.n), -n) $(if $(MAKE.k), -k0) \\
-        $(filter-out -j, $(lastword -j1 $(filter -l% -j%, $(MAKEFLAGS)))) \\
         -d keepdepfile
 ninja-cmd-goals = $(or $(MAKECMDGOALS), all)
 ninja-cmd-goals += $(foreach g, $(MAKECMDGOALS), $(.ninja-goals.$g))
```

Run the build again, and see four jobs being run in parallel:

`make clean; MAKEFLAGS="--jobserver-auth=fifo:/tmp/jobserver" make`"""
additional = """[0] https://github.com/stefanb2/ninja/tree/topic-issue-1139-part-3-jobserver-fifo"""