cd to / before running soong_build .

This lets one avoid any decisions as to when to chdir there during its
execution and leads to better sandboxing because the pwd doesn't leak to
init() functions anymore.

Test: Manual.
Change-Id: I1560da8ed3a621249426f9e8908aa890c21e13ba
This commit is contained in:
Lukacs T. Berki
2021-02-26 14:27:36 +01:00
parent 3bed960399
commit 7690c09953
14 changed files with 199 additions and 79 deletions

View File

@@ -8,6 +8,10 @@ bootstrap_go_package {
srcs: [
"env.go",
"paths.go",
"debug.go",
],
testSrcs: [
"paths_test.go",
],
deps: [
"soong-bazel",

17
shared/debug.go Normal file
View File

@@ -0,0 +1,17 @@
package shared
import (
"os"
"os/exec"
)
// Finds the Delve binary to use. Either uses the SOONG_DELVE_PATH environment
// variable or if that is unset, looks at $PATH.
func ResolveDelveBinary() string {
result := os.Getenv("SOONG_DELVE_PATH")
if result == "" {
result, _ = exec.LookPath("dlv")
}
return result
}

View File

@@ -91,6 +91,28 @@ func StaleEnvFile(filepath string, getenv func(string) string) (bool, error) {
return false, nil
}
// Deserializes and environment serialized by EnvFileContents() and returns it
// as a map[string]string.
func EnvFromFile(envFile string) (map[string]string, error) {
result := make(map[string]string)
data, err := ioutil.ReadFile(envFile)
if err != nil {
return result, err
}
var contents envFileData
err = json.Unmarshal(data, &contents)
if err != nil {
return result, err
}
for _, entry := range contents {
result[entry.Key] = entry.Value
}
return result, nil
}
// Implements sort.Interface so that we can use sort.Sort on envFileData arrays.
func (e envFileData) Len() int {
return len(e)

View File

@@ -30,6 +30,21 @@ type SharedPaths interface {
BazelMetricsDir() string
}
// Joins the path strings in the argument list, taking absolute paths into
// account. That is, if one of the strings is an absolute path, the ones before
// are ignored.
func JoinPath(base string, rest ...string) string {
result := base
for _, next := range rest {
if filepath.IsAbs(next) {
result = next
} else {
result = filepath.Join(result, next)
}
}
return result
}
// Given the out directory, returns the root of the temp directory (to be cleared at the start of each execution of Soong)
func TempDirForOutDir(outDir string) (tempPath string) {
return filepath.Join(outDir, ".temp")

32
shared/paths_test.go Normal file
View File

@@ -0,0 +1,32 @@
// Copyright 2021 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 shared
import (
"testing"
)
func assertEqual(t *testing.T, expected, actual string) {
t.Helper()
if expected != actual {
t.Errorf("expected %q != got %q", expected, actual)
}
}
func TestJoinPath(t *testing.T) {
assertEqual(t, "/a/b", JoinPath("c/d", "/a/b"))
assertEqual(t, "a/b", JoinPath("a", "b"))
assertEqual(t, "/a/b", JoinPath("x", "/a", "b"))
}