From ea1cd5ff3029315c1f89b98b820ceeebfba0e4df Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Wed, 21 Aug 2024 14:28:06 +0200 Subject: 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. --- pkg/build/build.go | 5 +++++ pkg/build/freebsd.go | 12 ++++++------ pkg/build/linux.go | 13 +++++++------ pkg/build/netbsd.go | 8 ++++---- pkg/build/openbsd.go | 7 +++---- sys/syz-extract/linux.go | 2 +- 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 { -- cgit mrf-deployment