Skip to content

Commit 56054e7

Browse files
committed
pkg/aflow/action/kernel: add build action
1 parent 689342b commit 56054e7

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

pkg/aflow/action/kernel/build.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// Copyright 2025 syzkaller project authors. All rights reserved.
2+
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
3+
4+
package kernel
5+
6+
import (
7+
"fmt"
8+
"io/fs"
9+
"os"
10+
"path"
11+
"path/filepath"
12+
"runtime"
13+
"time"
14+
15+
"github.com/google/syzkaller/pkg/aflow"
16+
"github.com/google/syzkaller/pkg/build"
17+
"github.com/google/syzkaller/pkg/hash"
18+
"github.com/google/syzkaller/pkg/osutil"
19+
"github.com/google/syzkaller/sys/targets"
20+
)
21+
22+
// Build action builds the Linux kernel from the given sources,
23+
// outputs directory with build artifacts.
24+
var Build = aflow.NewFuncAction("kernel-builder", buildKernel)
25+
26+
type buildArgs struct {
27+
KernelSrc string
28+
KernelCommit string
29+
KernelConfig string
30+
}
31+
32+
type buildResult struct {
33+
KernelObj string // Directory with build artifacts.
34+
}
35+
36+
func buildKernel(ctx *aflow.Context, args buildArgs) (buildResult, error) {
37+
desc := fmt.Sprintf("kernel commit %v, kernel config hash %v",
38+
args.KernelCommit, hash.String(args.KernelConfig))
39+
dir, err := ctx.Cache("build", desc, func(dir string) error {
40+
if err := osutil.WriteFile(filepath.Join(dir, ".config"), []byte(args.KernelConfig)); err != nil {
41+
return err
42+
}
43+
target := targets.List[targets.Linux][targets.AMD64]
44+
image := filepath.FromSlash(build.LinuxKernelImage(targets.AMD64))
45+
makeArgs := build.LinuxMakeArgs(target, targets.DefaultLLVMCompiler, targets.DefaultLLVMLinker,
46+
"ccache", dir, runtime.NumCPU())
47+
makeArgs = append(makeArgs, path.Base(image), "compile_commands.json")
48+
if _, err := osutil.RunCmd(time.Hour, args.KernelSrc, "make", makeArgs...); err != nil {
49+
return err
50+
}
51+
// Remove main intermediate build files, we don't need them anymore
52+
// and they take lots of space. Keep generated source files.
53+
keepExt := map[string]bool{"h": true, "c": true, "s": true, "S": true}
54+
keepFiles := map[string]bool{image: true}
55+
return filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
56+
if err != nil || d.IsDir() || keepFiles[path] || keepExt[filepath.Ext(d.Name())] {
57+
return err
58+
}
59+
return os.Remove(path)
60+
})
61+
})
62+
return buildResult{KernelObj: dir}, err
63+
}

0 commit comments

Comments
 (0)