Revert "Sandbox soong_build by changing to root directory"
This reverts commit 05c25ccb4adb5329add700b533416c226cdbfa96.
Reason for revert: broke absolute OUT_DIR
Bug: 146437378
Change-Id: I523ed79d40e1c1ef040212ba794a7a084abea75d
diff --git a/android/androidmk.go b/android/androidmk.go
index dbf3aa8..f3c15e4 100644
--- a/android/androidmk.go
+++ b/android/androidmk.go
@@ -323,7 +323,7 @@
return
}
- err := translateAndroidMk(ctx, absolutePath(transMk.String()), androidMkModulesList)
+ err := translateAndroidMk(ctx, transMk.String(), androidMkModulesList)
if err != nil {
ctx.Errorf(err.Error())
}
@@ -364,8 +364,8 @@
}
// Don't write to the file if it hasn't changed
- if _, err := os.Stat(absolutePath(mkFile)); !os.IsNotExist(err) {
- if data, err := ioutil.ReadFile(absolutePath(mkFile)); err == nil {
+ if _, err := os.Stat(mkFile); !os.IsNotExist(err) {
+ if data, err := ioutil.ReadFile(mkFile); err == nil {
matches := buf.Len() == len(data)
if matches {
@@ -383,7 +383,7 @@
}
}
- return ioutil.WriteFile(absolutePath(mkFile), buf.Bytes(), 0666)
+ return ioutil.WriteFile(mkFile, buf.Bytes(), 0666)
}
func translateAndroidMkModule(ctx SingletonContext, w io.Writer, mod blueprint.Module) error {
diff --git a/android/config.go b/android/config.go
index 3c49c1a..101f457 100644
--- a/android/config.go
+++ b/android/config.go
@@ -135,12 +135,12 @@
}
func loadConfig(config *config) error {
- err := loadFromConfigFile(&config.FileConfigurableOptions, absolutePath(config.ConfigFileName))
+ err := loadFromConfigFile(&config.FileConfigurableOptions, config.ConfigFileName)
if err != nil {
return err
}
- return loadFromConfigFile(&config.productVariables, absolutePath(config.ProductVariablesFileName))
+ return loadFromConfigFile(&config.productVariables, config.ProductVariablesFileName)
}
// loads configuration options from a JSON file in the cwd.
@@ -204,17 +204,6 @@
return nil
}
-// NullConfig returns a mostly empty Config for use by standalone tools like dexpreopt_gen that
-// use the android package.
-func NullConfig(buildDir string) Config {
- return Config{
- config: &config{
- buildDir: buildDir,
- fs: pathtools.OsFs,
- },
- }
-}
-
// TestConfig returns a Config object suitable for using for tests
func TestConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config {
envCopy := make(map[string]string)
@@ -331,7 +320,7 @@
buildDir: buildDir,
multilibConflicts: make(map[ArchType]bool),
- fs: pathtools.NewOsFs(absSrcDir),
+ fs: pathtools.OsFs,
}
config.deviceConfig = &deviceConfig{
@@ -361,7 +350,7 @@
}
inMakeFile := filepath.Join(buildDir, ".soong.in_make")
- if _, err := os.Stat(absolutePath(inMakeFile)); err == nil {
+ if _, err := os.Stat(inMakeFile); err == nil {
config.inMake = true
}
@@ -409,8 +398,6 @@
return Config{config}, nil
}
-var TestConfigOsFs = map[string][]byte{}
-
// mockFileSystem replaces all reads with accesses to the provided map of
// filenames to contents stored as a byte slice.
func (c *config) mockFileSystem(bp string, fs map[string][]byte) {
@@ -914,13 +901,8 @@
return c.productVariables.BootJars
}
-func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) {
- if c.productVariables.DexpreoptGlobalConfig == nil {
- return nil, nil
- }
- path := absolutePath(*c.productVariables.DexpreoptGlobalConfig)
- ctx.AddNinjaFileDeps(path)
- return ioutil.ReadFile(path)
+func (c *config) DexpreoptGlobalConfig() string {
+ return String(c.productVariables.DexpreoptGlobalConfig)
}
func (c *config) FrameworksBaseDirExists(ctx PathContext) bool {
diff --git a/android/env.go b/android/env.go
index 46bd3d6..d9f2db2 100644
--- a/android/env.go
+++ b/android/env.go
@@ -52,17 +52,6 @@
os.Clearenv()
}
-// getenv checks either os.Getenv or originalEnv so that it works before or after the init()
-// function above. It doesn't add any dependencies on the environment variable, so it should
-// only be used for values that won't change. For values that might change use ctx.Config().Getenv.
-func getenv(key string) string {
- if originalEnv == nil {
- return os.Getenv(key)
- } else {
- return originalEnv[key]
- }
-}
-
func EnvSingleton() Singleton {
return &envSingleton{}
}
@@ -77,12 +66,7 @@
return
}
- data, err := env.EnvFileContents(envDeps)
- if err != nil {
- ctx.Errorf(err.Error())
- }
-
- err = WriteFileToOutputDir(envFile, data, 0666)
+ err := env.WriteEnvFile(envFile.String(), envDeps)
if err != nil {
ctx.Errorf(err.Error())
}
diff --git a/android/makevars.go b/android/makevars.go
index aba4cce..38a028c 100644
--- a/android/makevars.go
+++ b/android/makevars.go
@@ -23,6 +23,7 @@
"strings"
"github.com/google/blueprint"
+ "github.com/google/blueprint/pathtools"
"github.com/google/blueprint/proptools"
)
@@ -40,6 +41,7 @@
Config() Config
DeviceConfig() DeviceConfig
AddNinjaFileDeps(deps ...string)
+ Fs() pathtools.FileSystem
ModuleName(module blueprint.Module) string
ModuleDir(module blueprint.Module) string
@@ -149,8 +151,7 @@
return
}
- outFile := absolutePath(PathForOutput(ctx,
- "make_vars"+proptools.String(ctx.Config().productVariables.Make_suffix)+".mk").String())
+ outFile := PathForOutput(ctx, "make_vars"+proptools.String(ctx.Config().productVariables.Make_suffix)+".mk").String()
if ctx.Failed() {
return
@@ -174,15 +175,15 @@
outBytes := s.writeVars(vars)
- if _, err := os.Stat(absolutePath(outFile)); err == nil {
- if data, err := ioutil.ReadFile(absolutePath(outFile)); err == nil {
+ if _, err := os.Stat(outFile); err == nil {
+ if data, err := ioutil.ReadFile(outFile); err == nil {
if bytes.Equal(data, outBytes) {
return
}
}
}
- if err := ioutil.WriteFile(absolutePath(outFile), outBytes, 0666); err != nil {
+ if err := ioutil.WriteFile(outFile, outBytes, 0666); err != nil {
ctx.Errorf(err.Error())
}
}
diff --git a/android/module.go b/android/module.go
index 67d1f12..c998007 100644
--- a/android/module.go
+++ b/android/module.go
@@ -16,13 +16,13 @@
import (
"fmt"
- "os"
"path"
"path/filepath"
"strings"
"text/scanner"
"github.com/google/blueprint"
+ "github.com/google/blueprint/pathtools"
"github.com/google/blueprint/proptools"
)
@@ -91,8 +91,7 @@
Glob(globPattern string, excludes []string) Paths
GlobFiles(globPattern string, excludes []string) Paths
- IsSymlink(path Path) bool
- Readlink(path Path) string
+ Fs() pathtools.FileSystem
}
// BaseModuleContext is the same as blueprint.BaseModuleContext except that Config() returns
@@ -1173,22 +1172,6 @@
return pathsForModuleSrcFromFullPath(e, ret, false)
}
-func (b *earlyModuleContext) IsSymlink(path Path) bool {
- fileInfo, err := b.config.fs.Lstat(path.String())
- if err != nil {
- b.ModuleErrorf("os.Lstat(%q) failed: %s", path.String(), err)
- }
- return fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink
-}
-
-func (b *earlyModuleContext) Readlink(path Path) string {
- dest, err := b.config.fs.Readlink(path.String())
- if err != nil {
- b.ModuleErrorf("os.Readlink(%q) failed: %s", path.String(), err)
- }
- return dest
-}
-
func (e *earlyModuleContext) Module() Module {
module, _ := e.EarlyModuleContext.Module().(Module)
return module
diff --git a/android/package_ctx.go b/android/package_ctx.go
index a228910..d3527fa 100644
--- a/android/package_ctx.go
+++ b/android/package_ctx.go
@@ -19,6 +19,7 @@
"strings"
"github.com/google/blueprint"
+ "github.com/google/blueprint/pathtools"
)
// PackageContext is a wrapper for blueprint.PackageContext that adds
@@ -59,6 +60,10 @@
e.pctx.AddNinjaFileDeps(deps...)
}
+func (e *configErrorWrapper) Fs() pathtools.FileSystem {
+ return nil
+}
+
type PackageVarContext interface {
PathContext
errorfContext
diff --git a/android/paths.go b/android/paths.go
index 02f56d0..a03fe17 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -16,8 +16,6 @@
import (
"fmt"
- "io/ioutil"
- "os"
"path/filepath"
"reflect"
"sort"
@@ -27,11 +25,10 @@
"github.com/google/blueprint/pathtools"
)
-var absSrcDir string
-
// PathContext is the subset of a (Module|Singleton)Context required by the
// Path methods.
type PathContext interface {
+ Fs() pathtools.FileSystem
Config() Config
AddNinjaFileDeps(deps ...string)
}
@@ -393,7 +390,7 @@
return PathsWithModuleSrcSubDir(ctx, paths, ""), nil
} else {
p := pathForModuleSrc(ctx, s)
- if exists, _, err := ctx.Config().fs.Exists(p.String()); err != nil {
+ if exists, _, err := ctx.Fs().Exists(p.String()); err != nil {
reportPathErrorf(ctx, "%s: %s", p, err.Error())
} else if !exists {
reportPathErrorf(ctx, "module source path %q does not exist", p)
@@ -723,7 +720,7 @@
var deps []string
// We cannot add build statements in this context, so we fall back to
// AddNinjaFileDeps
- files, deps, err = ctx.Config().fs.Glob(path.String(), nil, pathtools.FollowSymlinks)
+ files, deps, err = pathtools.Glob(path.String(), nil, pathtools.FollowSymlinks)
ctx.AddNinjaFileDeps(deps...)
}
@@ -755,7 +752,7 @@
if !exists {
modCtx.AddMissingDependencies([]string{path.String()})
}
- } else if exists, _, err := ctx.Config().fs.Exists(path.String()); err != nil {
+ } else if exists, _, err := ctx.Fs().Exists(path.String()); err != nil {
reportPathErrorf(ctx, "%s: %s", path, err.Error())
} else if !exists {
reportPathErrorf(ctx, "source path %q does not exist", path)
@@ -1359,6 +1356,7 @@
config Config
}
+func (x *testPathContext) Fs() pathtools.FileSystem { return x.config.fs }
func (x *testPathContext) Config() Config { return x.config }
func (x *testPathContext) AddNinjaFileDeps(...string) {}
@@ -1404,16 +1402,3 @@
}
return rel, true, nil
}
-
-// Writes a file to the output directory. Attempting to write directly to the output directory
-// will fail due to the sandbox of the soong_build process.
-func WriteFileToOutputDir(path WritablePath, data []byte, perm os.FileMode) error {
- return ioutil.WriteFile(absolutePath(path.String()), data, perm)
-}
-
-func absolutePath(path string) string {
- if filepath.IsAbs(path) {
- return path
- }
- return filepath.Join(absSrcDir, path)
-}
diff --git a/android/paths_test.go b/android/paths_test.go
index 46e3e1f..ec5e598 100644
--- a/android/paths_test.go
+++ b/android/paths_test.go
@@ -21,6 +21,7 @@
"strings"
"testing"
+ "github.com/google/blueprint/pathtools"
"github.com/google/blueprint/proptools"
)
@@ -206,6 +207,10 @@
inRoot bool
}
+func (moduleInstallPathContextImpl) Fs() pathtools.FileSystem {
+ return pathtools.MockFs(nil)
+}
+
func (m moduleInstallPathContextImpl) Config() Config {
return m.baseModuleContext.config
}
diff --git a/android/register.go b/android/register.go
index b48d3d1..b5defec 100644
--- a/android/register.go
+++ b/android/register.go
@@ -84,9 +84,7 @@
}
func NewContext() *Context {
- ctx := &Context{blueprint.NewContext()}
- ctx.SetSrcDir(absSrcDir)
- return ctx
+ return &Context{blueprint.NewContext()}
}
func (ctx *Context) Register() {
diff --git a/android/sandbox.go b/android/sandbox.go
deleted file mode 100644
index ed022fb..0000000
--- a/android/sandbox.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2020 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package android
-
-import (
- "fmt"
- "os"
-)
-
-func init() {
- // Stash the working directory in a private variable and then change the working directory
- // to "/", which will prevent untracked accesses to files by Go Soong plugins. The
- // SOONG_SANDBOX_SOONG_BUILD environment variable is set by soong_ui, and is not
- // overrideable on the command line.
-
- orig, err := os.Getwd()
- if err != nil {
- panic(fmt.Errorf("failed to get working directory: %s", err))
- }
- absSrcDir = orig
-
- if getenv("SOONG_SANDBOX_SOONG_BUILD") == "true" {
- err = os.Chdir("/")
- if err != nil {
- panic(fmt.Errorf("failed to change working directory to '/': %s", err))
- }
- }
-}
-
-// DO NOT USE THIS FUNCTION IN NEW CODE.
-// Deprecated: This function will be removed as soon as the existing use cases that use it have been
-// replaced.
-func AbsSrcDirForExistingUseCases() string {
- return absSrcDir
-}
diff --git a/android/singleton.go b/android/singleton.go
index 91268ad..5519ca0 100644
--- a/android/singleton.go
+++ b/android/singleton.go
@@ -16,6 +16,7 @@
import (
"github.com/google/blueprint"
+ "github.com/google/blueprint/pathtools"
)
// SingletonContext
@@ -73,6 +74,8 @@
// builder whenever a file matching the pattern as added or removed, without rerunning if a
// file that does not match the pattern is added to a searched directory.
GlobWithDeps(pattern string, excludes []string) ([]string, error)
+
+ Fs() pathtools.FileSystem
}
type singletonAdaptor struct {