aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-08-21 14:28:06 +0200
committerAleksandr Nogikh <nogikh@google.com>2024-08-22 09:49:03 +0000
commitea1cd5ff3029315c1f89b98b820ceeebfba0e4df (patch)
treeead4b8475abce2fecb5a30f3cc1d6d62a2bac982
parentaa99fc3349e97ea596c31624efde306de4136241 (diff)
pkg/build: introduce the build jobs parameter
This parameter defines the number of cores dedicated to the kernel build process. By default, it's equal to the number of available CPUs.
-rw-r--r--pkg/build/build.go5
-rw-r--r--pkg/build/freebsd.go12
-rw-r--r--pkg/build/linux.go13
-rw-r--r--pkg/build/netbsd.go8
-rw-r--r--pkg/build/openbsd.go7
-rw-r--r--sys/syz-extract/linux.go2
6 files changed, 26 insertions, 21 deletions
diff --git a/pkg/build/build.go b/pkg/build/build.go
index 4d6e3bce3..2274ceb8e 100644
--- a/pkg/build/build.go
+++ b/pkg/build/build.go
@@ -12,6 +12,7 @@ import (
"os"
"path/filepath"
"regexp"
+ "runtime"
"strings"
"time"
@@ -37,6 +38,7 @@ type Params struct {
SysctlFile string
Config []byte
Tracer debugtracer.DebugTracer
+ BuildJobs int // If 0, all CPUs will be used.
Build json.RawMessage
}
@@ -71,6 +73,9 @@ func Image(params Params) (details ImageDetails, err error) {
if params.Tracer == nil {
params.Tracer = &debugtracer.NullTracer{}
}
+ if params.BuildJobs == 0 {
+ params.BuildJobs = runtime.NumCPU()
+ }
var builder builder
builder, err = getBuilder(params.TargetOS, params.TargetArch, params.VMType)
if err != nil {
diff --git a/pkg/build/freebsd.go b/pkg/build/freebsd.go
index 2f4aa1313..2c6e0fcc9 100644
--- a/pkg/build/freebsd.go
+++ b/pkg/build/freebsd.go
@@ -45,12 +45,12 @@ options DIAGNOSTIC
return ImageDetails{}, err
}
objPrefix := filepath.Join(params.KernelDir, "obj")
- output, err := ctx.make(params.KernelDir, objPrefix, "kernel-toolchain")
+ output, err := ctx.make(params.KernelDir, objPrefix, params.BuildJobs, "kernel-toolchain")
if err != nil {
return ImageDetails{}, err
}
- if _, err := ctx.make(params.KernelDir, objPrefix, "buildkernel", "WITH_EXTRA_TCP_STACKS=",
- fmt.Sprintf("KERNCONF=%v", confFile)); err != nil {
+ if _, err := ctx.make(params.KernelDir, objPrefix, params.BuildJobs, "buildkernel",
+ "WITH_EXTRA_TCP_STACKS=", fmt.Sprintf("KERNCONF=%v", confFile)); err != nil {
// The kernel-toolchain make target has to be built separately
// because FreeBSD's build doesn't correctly order the two
// targets. Its output is useful for debugging though, so
@@ -121,16 +121,16 @@ sudo mdconfig -d -u ${md#md}
func (ctx freebsd) clean(kernelDir, targetArch string) error {
objPrefix := filepath.Join(kernelDir, "obj")
- _, err := ctx.make(kernelDir, objPrefix, "cleanworld")
+ _, err := ctx.make(kernelDir, objPrefix, runtime.NumCPU(), "cleanworld")
return err
}
-func (ctx freebsd) make(kernelDir, objPrefix string, makeArgs ...string) ([]byte, error) {
+func (ctx freebsd) make(kernelDir, objPrefix string, jobs int, makeArgs ...string) ([]byte, error) {
args := append([]string{
fmt.Sprintf("MAKEOBJDIRPREFIX=%v", objPrefix),
"make",
"-C", kernelDir,
- "-j", strconv.Itoa(runtime.NumCPU()),
+ "-j", strconv.Itoa(jobs),
}, makeArgs...)
output, err := osutil.RunCmd(3*time.Hour, kernelDir, "sh", "-c", strings.Join(args, " "))
return output, err
diff --git a/pkg/build/linux.go b/pkg/build/linux.go
index 4069e0202..b68a87bc1 100644
--- a/pkg/build/linux.go
+++ b/pkg/build/linux.go
@@ -142,7 +142,7 @@ func (linux) createImage(params Params, kernelPath string) error {
}
func (linux) clean(kernelDir, targetArch string) error {
- return runMakeImpl(targetArch, "", "", "", kernelDir, []string{"distclean"})
+ return runMakeImpl(targetArch, "", "", "", kernelDir, runtime.NumCPU(), []string{"distclean"})
}
func (linux) writeFile(file string, data []byte) error {
@@ -152,9 +152,9 @@ func (linux) writeFile(file string, data []byte) error {
return osutil.SandboxChown(file)
}
-func runMakeImpl(arch, compiler, linker, ccache, kernelDir string, extraArgs []string) error {
+func runMakeImpl(arch, compiler, linker, ccache, kernelDir string, jobs int, extraArgs []string) error {
target := targets.Get(targets.Linux, arch)
- args := LinuxMakeArgs(target, compiler, linker, ccache, "")
+ args := LinuxMakeArgs(target, compiler, linker, ccache, "", jobs)
args = append(args, extraArgs...)
cmd := osutil.Command("make", args...)
if err := osutil.Sandbox(cmd, true, true); err != nil {
@@ -179,12 +179,13 @@ func runMakeImpl(arch, compiler, linker, ccache, kernelDir string, extraArgs []s
}
func runMake(params Params, extraArgs ...string) error {
- return runMakeImpl(params.TargetArch, params.Compiler, params.Linker, params.Ccache, params.KernelDir, extraArgs)
+ return runMakeImpl(params.TargetArch, params.Compiler, params.Linker, params.Ccache,
+ params.KernelDir, params.BuildJobs, extraArgs)
}
-func LinuxMakeArgs(target *targets.Target, compiler, linker, ccache, buildDir string) []string {
+func LinuxMakeArgs(target *targets.Target, compiler, linker, ccache, buildDir string, jobs int) []string {
args := []string{
- "-j", fmt.Sprint(runtime.NumCPU()),
+ "-j", fmt.Sprint(jobs),
"ARCH=" + target.KernelArch,
}
if target.Triple != "" {
diff --git a/pkg/build/netbsd.go b/pkg/build/netbsd.go
index 962b6e82c..80ea02481 100644
--- a/pkg/build/netbsd.go
+++ b/pkg/build/netbsd.go
@@ -44,25 +44,25 @@ func (ctx netbsd) build(params Params) (ImageDetails, error) {
if strings.HasSuffix(params.Compiler, "clang++") {
// Build tools before building kernel.
if _, err := osutil.RunCmd(60*time.Minute, params.KernelDir, "./build.sh", "-m", params.TargetArch,
- "-U", "-j"+strconv.Itoa(runtime.NumCPU()), "-V", "MKCTF=no",
+ "-U", "-j"+strconv.Itoa(params.BuildJobs), "-V", "MKCTF=no",
"-V", "MKLLVM=yes", "-V", "MKGCC=no", "-V", "HAVE_LLVM=yes", "tools"); err != nil {
return ImageDetails{}, err
}
// Build kernel.
if _, err := osutil.RunCmd(20*time.Minute, params.KernelDir, "./build.sh", "-m", params.TargetArch,
- "-U", "-j"+strconv.Itoa(runtime.NumCPU()), "-V", "MKCTF=no",
+ "-U", "-j"+strconv.Itoa(params.BuildJobs), "-V", "MKCTF=no",
"-V", "MKLLVM=yes", "-V", "MKGCC=no", "-V", "HAVE_LLVM=yes", "kernel="+kernelName); err != nil {
return ImageDetails{}, err
}
} else if strings.HasSuffix(params.Compiler, "g++") {
if _, err := osutil.RunCmd(30*time.Minute, params.KernelDir, "./build.sh", "-m", params.TargetArch,
- "-U", "-j"+strconv.Itoa(runtime.NumCPU()), "-V", "MKCTF=no", "tools"); err != nil {
+ "-U", "-j"+strconv.Itoa(params.BuildJobs), "-V", "MKCTF=no", "tools"); err != nil {
return ImageDetails{}, err
}
if _, err := osutil.RunCmd(20*time.Minute, params.KernelDir, "./build.sh", "-m", params.TargetArch,
- "-U", "-j"+strconv.Itoa(runtime.NumCPU()), "-V", "MKCTF=no", "kernel="+kernelName); err != nil {
+ "-U", "-j"+strconv.Itoa(params.BuildJobs), "-V", "MKCTF=no", "kernel="+kernelName); err != nil {
return ImageDetails{}, err
}
}
diff --git a/pkg/build/openbsd.go b/pkg/build/openbsd.go
index 97f7c6a8f..bb069f90b 100644
--- a/pkg/build/openbsd.go
+++ b/pkg/build/openbsd.go
@@ -6,7 +6,6 @@ package build
import (
"fmt"
"path/filepath"
- "runtime"
"strconv"
"time"
@@ -32,7 +31,7 @@ func (ctx openbsd) build(params Params) (ImageDetails, error) {
return ImageDetails{}, err
}
for _, tgt := range []string{"clean", "obj", "config", "all"} {
- if err := ctx.make(compileDir, tgt); err != nil {
+ if err := ctx.make(compileDir, params.BuildJobs, tgt); err != nil {
return ImageDetails{}, err
}
}
@@ -63,8 +62,8 @@ func (ctx openbsd) clean(kernelDir, targetArch string) error {
return nil
}
-func (ctx openbsd) make(kernelDir string, args ...string) error {
- args = append([]string{"-j", strconv.Itoa(runtime.NumCPU())}, args...)
+func (ctx openbsd) make(kernelDir string, jobs int, args ...string) error {
+ args = append([]string{"-j", strconv.Itoa(jobs)}, args...)
_, err := osutil.RunCmd(10*time.Minute, kernelDir, "make", args...)
return err
}
diff --git a/sys/syz-extract/linux.go b/sys/syz-extract/linux.go
index d30529ba9..b458122ad 100644
--- a/sys/syz-extract/linux.go
+++ b/sys/syz-extract/linux.go
@@ -79,7 +79,7 @@ func (*linux) prepareArch(arch *Arch) error {
return nil
}
kernelDir := arch.sourceDir
- makeArgs := build.LinuxMakeArgs(arch.target, "", "", "", arch.buildDir)
+ makeArgs := build.LinuxMakeArgs(arch.target, "", "", "", arch.buildDir, runtime.NumCPU())
if arch.configFile != "" {
err := osutil.CopyFile(arch.configFile, filepath.Join(arch.buildDir, ".config"))
if err != nil {