diff options
| author | Florent Revest <revest@chromium.org> | 2026-01-26 15:59:20 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2026-01-26 18:04:21 +0000 |
| commit | 3d100869856aed9bca7cac3ab7c9c162b9fee802 (patch) | |
| tree | c639d611e1792163c9dd441296858ee35db82dee /pkg/aflow/action/kernel | |
| parent | 28819515a548ec25957603ae1fac0620c3eaa9a0 (diff) | |
pkg/aflow/action/crash/test: implement patch testing
Diffstat (limited to 'pkg/aflow/action/kernel')
| -rw-r--r-- | pkg/aflow/action/kernel/build.go | 71 |
1 files changed, 39 insertions, 32 deletions
diff --git a/pkg/aflow/action/kernel/build.go b/pkg/aflow/action/kernel/build.go index 575eec6be..564339867 100644 --- a/pkg/aflow/action/kernel/build.go +++ b/pkg/aflow/action/kernel/build.go @@ -34,42 +34,49 @@ 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 { +func BuildKernel(buildDir, srcDir, cfg string, cleanup bool) error { + if err := osutil.WriteFile(filepath.Join(buildDir, ".config"), []byte(cfg)); 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", buildDir, runtime.NumCPU()) + const compileCommands = "compile_commands.json" + makeArgs = append(makeArgs, "-s", path.Base(image), compileCommands) + if out, err := osutil.RunCmd(time.Hour, srcDir, "make", makeArgs...); err != nil { + return aflow.FlowError(fmt.Errorf("make failed: %w\n%s", err, out)) + } + if !cleanup { + return nil + } + // Remove main intermediate build files, we don't need them anymore + // and they take lots of space. But keep generated source files. + keepFiles := map[string]bool{ + image: true, + target.KernelObject: true, + compileCommands: true, + } + return filepath.WalkDir(buildDir, func(path string, d fs.DirEntry, err error) error { + if 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()) - const compileCommands = "compile_commands.json" - makeArgs = append(makeArgs, "-s", path.Base(image), compileCommands) - if out, err := osutil.RunCmd(time.Hour, args.KernelSrc, "make", makeArgs...); err != nil { - return aflow.FlowError(fmt.Errorf("make failed: %w\n%s", err, out)) + relative, err := filepath.Rel(buildDir, path) + if err != nil { + return err } - // Remove main intermediate build files, we don't need them anymore - // and they take lots of space. But keep generated source files. - keepFiles := map[string]bool{ - image: true, - target.KernelObject: true, - compileCommands: true, + if d.IsDir() || keepFiles[relative] || codesearch.IsSourceFile(relative) { + return nil } - return filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - relative, err := filepath.Rel(dir, path) - if err != nil { - return err - } - if d.IsDir() || keepFiles[relative] || codesearch.IsSourceFile(relative) { - return nil - } - return os.Remove(path) - }) + return os.Remove(path) + }) +} + +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 { + return BuildKernel(dir, args.KernelSrc, args.KernelConfig, true) }) return buildResult{KernelObj: dir}, err } |
