aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/aflow/action/kernel
diff options
context:
space:
mode:
authorFlorent Revest <revest@chromium.org>2026-01-26 15:59:20 +0100
committerDmitry Vyukov <dvyukov@google.com>2026-01-26 18:04:21 +0000
commit3d100869856aed9bca7cac3ab7c9c162b9fee802 (patch)
treec639d611e1792163c9dd441296858ee35db82dee /pkg/aflow/action/kernel
parent28819515a548ec25957603ae1fac0620c3eaa9a0 (diff)
pkg/aflow/action/crash/test: implement patch testing
Diffstat (limited to 'pkg/aflow/action/kernel')
-rw-r--r--pkg/aflow/action/kernel/build.go71
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
}