aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/build/cuttlefish.go
diff options
context:
space:
mode:
authorLiz Prucka <lizprucka@google.com>2023-06-02 21:40:52 +0000
committerTaras Madan <tarasmadan@google.com>2023-06-29 14:45:26 +0000
commit7b33cf8fc1db47587d63fdba731651da20226503 (patch)
tree94f3a985eae2f28b9ad277d041fe180076de6843 /pkg/build/cuttlefish.go
parentd76708ad1c17c0d3a118ff00b736e4b3c1539bee (diff)
build/cuttlefish: build from config file
Android Bazel requires an input 'defconfig' file to build. This is ensured by check_defconfig (https://cs.android.com/android/kernel/superproject/+/common-android-mainline:build/kernel/_setup_env.sh;l=283). Create an input 'defconfig' file from a given config, then build the kernel.
Diffstat (limited to 'pkg/build/cuttlefish.go')
-rw-r--r--pkg/build/cuttlefish.go44
1 files changed, 42 insertions, 2 deletions
diff --git a/pkg/build/cuttlefish.go b/pkg/build/cuttlefish.go
index 312da054b..8580aeba1 100644
--- a/pkg/build/cuttlefish.go
+++ b/pkg/build/cuttlefish.go
@@ -6,6 +6,7 @@ package build
import (
"archive/tar"
"compress/gzip"
+ "errors"
"fmt"
"io"
"os"
@@ -34,15 +35,48 @@ func (c cuttlefish) runBuild(kernelDir, buildConfig string) error {
}
func (c cuttlefish) runBazel(kernelDir string) error {
- cmd := osutil.Command("tools/bazel", "run", "--kasan", bazelTarget, "--", "--dist_dir=dist")
+ cmd := osutil.Command("tools/bazel", "run", bazelTarget, "--", "--dist_dir=dist")
if err := osutil.Sandbox(cmd, true, false); err != nil {
- return err
+ return fmt.Errorf("failed to sandbox build command: %w", err)
}
cmd.Dir = kernelDir
_, err := osutil.Run(time.Hour, cmd)
return err
}
+func (c cuttlefish) createDefconfig(commonDir string, config []byte) error {
+ configFile := filepath.Join(commonDir, ".config")
+ if err := osutil.WriteFile(configFile, config); err != nil {
+ return fmt.Errorf("writing config failed: %w", err)
+ }
+ if err := osutil.SandboxChown(configFile); err != nil {
+ return fmt.Errorf("error changing config owner: %w", err)
+ }
+
+ // Create a 'defconfig' file from full '.config'.
+ cmd := osutil.Command("make", "savedefconfig")
+ cmd.Dir = commonDir
+ if err := osutil.Sandbox(cmd, true, false); err != nil {
+ return fmt.Errorf("failed to sandbox defconfig creation: %w", err)
+ }
+ if _, err := osutil.Run(time.Hour, cmd); err != nil {
+ return fmt.Errorf("failed to create defconfig: %w", err)
+ }
+
+ // Copy defconfig to expected config directory.
+ defconfigFile := filepath.Join(commonDir, "arch", "x86", "configs", "gki_defconfig")
+ if err := os.Rename(filepath.Join(commonDir, "defconfig"), defconfigFile); err != nil {
+ return fmt.Errorf("writing config failed: %w", err)
+ }
+ if err := osutil.SandboxChown(defconfigFile); err != nil {
+ return fmt.Errorf("error changing defconfig owner: %w", err)
+ }
+ if err := os.Remove(configFile); err != nil {
+ return fmt.Errorf("failure removing temp config: %w", err)
+ }
+ return nil
+}
+
func (c cuttlefish) readCompiler(archivePath string) (string, error) {
f, err := os.Open(archivePath)
if err != nil {
@@ -95,6 +129,12 @@ func (c cuttlefish) build(params Params) (ImageDetails, error) {
}
// Default to build.sh if compiler is not specified.
if params.Compiler == "bazel" {
+ if params.Config == nil {
+ return details, errors.New("kernel config was not provided for build")
+ }
+ if err := c.createDefconfig(filepath.Join(params.KernelDir, "common"), params.Config); err != nil {
+ return details, fmt.Errorf("failed to create defconfig file: %v", err)
+ }
if err := c.runBazel(params.KernelDir); err != nil {
return details, fmt.Errorf("failed to build kernel: %s", err)
}