diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2026-01-02 17:09:18 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2026-01-09 12:51:45 +0000 |
| commit | 56054e7aaaa59d71b97a772fc02f153e8fbf23ff (patch) | |
| tree | 8c8d2ae8ae288350d4bd143abc0722537a747e1f | |
| parent | 689342b414b92a6049e52ea3811807d0273901b7 (diff) | |
pkg/aflow/action/kernel: add build action
| -rw-r--r-- | pkg/aflow/action/kernel/build.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/pkg/aflow/action/kernel/build.go b/pkg/aflow/action/kernel/build.go new file mode 100644 index 000000000..17e9fb242 --- /dev/null +++ b/pkg/aflow/action/kernel/build.go @@ -0,0 +1,63 @@ +// Copyright 2025 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package kernel + +import ( + "fmt" + "io/fs" + "os" + "path" + "path/filepath" + "runtime" + "time" + + "github.com/google/syzkaller/pkg/aflow" + "github.com/google/syzkaller/pkg/build" + "github.com/google/syzkaller/pkg/hash" + "github.com/google/syzkaller/pkg/osutil" + "github.com/google/syzkaller/sys/targets" +) + +// Build action builds the Linux kernel from the given sources, +// outputs directory with build artifacts. +var Build = aflow.NewFuncAction("kernel-builder", buildKernel) + +type buildArgs struct { + KernelSrc string + KernelCommit string + KernelConfig string +} + +type buildResult struct { + KernelObj string // Directory with build artifacts. +} + +func buildKernel(ctx *aflow.Context, args buildArgs) (buildResult, error) { + desc := fmt.Sprintf("kernel commit %v, kernel config hash %v", + args.KernelCommit, hash.String(args.KernelConfig)) + dir, err := ctx.Cache("build", desc, func(dir string) error { + if err := osutil.WriteFile(filepath.Join(dir, ".config"), []byte(args.KernelConfig)); err != nil { + return err + } + target := targets.List[targets.Linux][targets.AMD64] + image := filepath.FromSlash(build.LinuxKernelImage(targets.AMD64)) + makeArgs := build.LinuxMakeArgs(target, targets.DefaultLLVMCompiler, targets.DefaultLLVMLinker, + "ccache", dir, runtime.NumCPU()) + makeArgs = append(makeArgs, path.Base(image), "compile_commands.json") + if _, err := osutil.RunCmd(time.Hour, args.KernelSrc, "make", makeArgs...); err != nil { + return err + } + // Remove main intermediate build files, we don't need them anymore + // and they take lots of space. Keep generated source files. + keepExt := map[string]bool{"h": true, "c": true, "s": true, "S": true} + keepFiles := map[string]bool{image: true} + return filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { + if err != nil || d.IsDir() || keepFiles[path] || keepExt[filepath.Ext(d.Name())] { + return err + } + return os.Remove(path) + }) + }) + return buildResult{KernelObj: dir}, err +} |
