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:
@@ -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
17
shared/debug.go
Normal 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
|
||||
}
|
@@ -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)
|
||||
|
@@ -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
32
shared/paths_test.go
Normal 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"))
|
||||
}
|
Reference in New Issue
Block a user