55 lines
2.2 KiB
Markdown
55 lines
2.2 KiB
Markdown
|
<!---
|
||
|
Copyright (C) 2015 The Android Open Source Project
|
||
|
|
||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
you may not use this file except in compliance with the License.
|
||
|
You may obtain a copy of the License at
|
||
|
|
||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, software
|
||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
See the License for the specific language governing permissions and
|
||
|
limitations under the License.
|
||
|
-->
|
||
|
|
||
|
makeparallel
|
||
|
============
|
||
|
makeparallel communicates with the [GNU make jobserver](http://make.mad-scientist.net/papers/jobserver-implementation/)
|
||
|
in order claim all available jobs, and then passes the number of jobs
|
||
|
claimed to a subprocess with `-j<jobs>`.
|
||
|
|
||
|
The number of available jobs is determined by reading tokens from the jobserver
|
||
|
until a read would block. If the makeparallel rule is the only one running the
|
||
|
number of jobs will be the total size of the jobserver pool, i.e. the value
|
||
|
passed to make with `-j`. Any jobs running in parallel with with the
|
||
|
makeparellel rule will reduce the measured value, and thus reduce the
|
||
|
parallelism available to the subprocess.
|
||
|
|
||
|
To run a multi-thread or multi-process binary inside GNU make using
|
||
|
makeparallel, add
|
||
|
```Makefile
|
||
|
+makeparallel subprocess arguments
|
||
|
```
|
||
|
to a rule. For example, to wrap ninja in make, use something like:
|
||
|
```Makefile
|
||
|
+makeparallel ninja -f build.ninja
|
||
|
```
|
||
|
|
||
|
To determine the size of the jobserver pool, add
|
||
|
```Makefile
|
||
|
+makeparallel echo > make.jobs
|
||
|
```
|
||
|
to a rule that is guarantee to run alone (i.e. all other rules are either
|
||
|
dependencies of the makeparallel rule, or the depend on the makeparallel
|
||
|
rule. The output file will contain the `-j<num>` flag passed to the parent
|
||
|
make process, or `-j1` if no flag was found. Since GNU make will run
|
||
|
makeparallel during the execution phase, after all variables have been
|
||
|
set and evaluated, it is not possible to get the output of makeparallel
|
||
|
into a make variable. Instead, use a shell substitution to read the output
|
||
|
file directly in a recipe. For example:
|
||
|
```Makefile
|
||
|
echo Make was started with $$(cat make.jobs)
|
||
|
```
|