pkg/kernel: move partial config functionality into a separate function

Move partial config functionality into BuildWithPartConfig.
It is used only for syz-gce which will be removed soon.
Provide a better interface for new continuous build system.
This commit is contained in:
Dmitry Vyukov 2017-06-20 19:56:13 +02:00
parent 5cc5b2714e
commit e39114dc0c
2 changed files with 37 additions and 31 deletions

View File

@ -25,35 +25,43 @@ import (
"github.com/google/syzkaller/pkg/osutil"
)
func Build(dir, compiler, config string, fullConfig bool) error {
const timeout = 10 * time.Minute // default timeout for command invocations
if fullConfig {
if err := ioutil.WriteFile(filepath.Join(dir, ".config"), []byte(config), 0600); err != nil {
return fmt.Errorf("failed to write config file: %v", err)
}
} else {
os.Remove(filepath.Join(dir, ".config"))
configFile := filepath.Join(dir, "syz.config")
if err := ioutil.WriteFile(configFile, []byte(config), 0600); err != nil {
return fmt.Errorf("failed to write config file: %v", err)
}
defer os.Remove(configFile)
if _, err := osutil.RunCmd(timeout, dir, "make", "defconfig"); err != nil {
return err
}
if _, err := osutil.RunCmd(timeout, dir, "make", "kvmconfig"); err != nil {
return err
}
if _, err := osutil.RunCmd(timeout, dir, "scripts/kconfig/merge_config.sh", "-n", ".config", configFile); err != nil {
return err
}
func Build(dir, compiler, config string) error {
if err := fileutil.CopyFile(config, filepath.Join(dir, ".config")); err != nil {
return fmt.Errorf("failed to write config file: %v", err)
}
return build(dir, compiler)
}
// TODO(dvyukov): this is only for syz-gce, remove when syz-gce is deleted.
func BuildWithPartConfig(dir, compiler, config string) error {
const timeout = 10 * time.Minute // default timeout for command invocations
os.Remove(filepath.Join(dir, ".config"))
configFile := filepath.Join(dir, "syz.config")
if err := ioutil.WriteFile(configFile, []byte(config), 0600); err != nil {
return fmt.Errorf("failed to write config file: %v", err)
}
defer os.Remove(configFile)
if _, err := osutil.RunCmd(timeout, dir, "make", "defconfig"); err != nil {
return err
}
if _, err := osutil.RunCmd(timeout, dir, "make", "kvmconfig"); err != nil {
return err
}
if _, err := osutil.RunCmd(timeout, dir, "scripts/kconfig/merge_config.sh", "-n", ".config", configFile); err != nil {
return err
}
return build(dir, compiler)
}
func build(dir, compiler string) error {
const timeout = 10 * time.Minute // default timeout for command invocations
if _, err := osutil.RunCmd(timeout, dir, "make", "olddefconfig"); err != nil {
return err
}
// We build only bzImage as we currently don't use modules.
// Build of a large kernel can take a while on a 1 CPU VM.
if _, err := osutil.RunCmd(3*time.Hour, dir, "make", "bzImage", "-j", strconv.Itoa(runtime.NumCPU()), "CC="+compiler); err != nil {
cpu := strconv.Itoa(runtime.NumCPU())
if _, err := osutil.RunCmd(3*time.Hour, dir, "make", "bzImage", "-j", cpu, "CC="+compiler); err != nil {
return err
}
return nil

View File

@ -354,16 +354,14 @@ func (a *LocalBuildAction) Build() error {
}
}
Logf(0, "building kernel on %v...", hash)
config, full := syzconfig, false
if cfg.Linux_Config != "" {
data, err := ioutil.ReadFile(cfg.Linux_Config)
if err != nil {
return fmt.Errorf("failed to read config file: %v", err)
if err := kernel.Build(dir, a.Compiler, cfg.Linux_Config); err != nil {
return fmt.Errorf("build failed: %v", err)
}
} else {
if err := kernel.BuildWithPartConfig(dir, a.Compiler, syzconfig); err != nil {
return fmt.Errorf("build failed: %v", err)
}
config, full = string(data), true
}
if err := kernel.Build(dir, a.Compiler, config, full); err != nil {
return fmt.Errorf("build failed: %v", err)
}
Logf(0, "building image...")
os.MkdirAll("image/obj", 0700)