support sandboxed rust rules
This commit adds support for compiling rust rules inside the sbox
sandbox. To compile a rust module with sandboxing enabled, the entry
point to the crate must be specified via the `crate_root` property, and
all input sources and compile-time data must be specified via the `srcs`
and `compile_data` properties.
Bug: 286077158
Change-Id: I8c9dc5cf7578037a583b4be2e2f73cf20ffd4408
diff --git a/android/depset_generic.go b/android/depset_generic.go
index 45c1937..9f07596 100644
--- a/android/depset_generic.go
+++ b/android/depset_generic.go
@@ -95,6 +95,12 @@
}
}
+// AddDirectToDepSet returns a new DepSet with additional elements added to its direct set.
+// The transitive sets remain untouched.
+func AddDirectToDepSet[T depSettableType](d *DepSet[T], direct ...T) *DepSet[T] {
+ return NewDepSet[T](d.order, Concat(d.direct, direct), d.transitive)
+}
+
// DepSetBuilder is used to create an immutable DepSet.
type DepSetBuilder[T depSettableType] struct {
order DepSetOrder
@@ -188,3 +194,14 @@
}
return list
}
+
+// ToListDirect returns the direct elements of a DepSet flattened to a list.
+func (d *DepSet[T]) ToListDirect() []T {
+ if d == nil {
+ return nil
+ }
+ list := make([]T, len(d.direct))
+ copy(list, d.direct)
+ list = firstUniqueInPlace(list)
+ return list
+}
diff --git a/android/paths.go b/android/paths.go
index 325a953..d4b1d6e 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -171,6 +171,9 @@
// Base returns the last element of the path
Base() string
+ // Dir returns a path pointing the directory containing the path
+ Dir() Path
+
// Rel returns the portion of the path relative to the directory it was created from. For
// example, Rel on a PathsForModuleSrc would return the path relative to the module source
// directory, and OutputPath.Join("foo").Rel() would return "foo".
@@ -1012,6 +1015,12 @@
return filepath.Base(p.path)
}
+func (p basePath) Dir() Path {
+ p.path = filepath.Dir(p.path)
+ p.rel = filepath.Dir(p.rel)
+ return p
+}
+
func (p basePath) Rel() string {
if p.rel != "" {
return p.rel
@@ -1046,6 +1055,11 @@
return p
}
+func (p SourcePath) Dir() Path {
+ p.basePath = p.basePath.Dir().(basePath)
+ return p
+}
+
// safePathForSource is for paths that we expect are safe -- only for use by go
// code that is embedding ninja variables in paths
func safePathForSource(ctx PathContext, pathComponents ...string) (SourcePath, error) {
@@ -1248,6 +1262,12 @@
return p
}
+func (p OutputPath) Dir() Path {
+ p.basePath = p.basePath.Dir().(basePath)
+ p.fullPath = filepath.Dir(p.fullPath)
+ return p
+}
+
func (p OutputPath) WithoutRel() OutputPath {
p.basePath.rel = filepath.Base(p.basePath.path)
return p
@@ -1280,6 +1300,11 @@
basePath
}
+func (p toolDepPath) Dir() Path {
+ p.basePath = p.basePath.Dir().(basePath)
+ return p
+}
+
func (t toolDepPath) RelativeToTop() Path {
ensureTestOnly()
return t
@@ -1463,6 +1488,11 @@
OutputPath
}
+func (p ModuleOutPath) Dir() Path {
+ p.OutputPath = p.OutputPath.Dir().(OutputPath)
+ return p
+}
+
func (p ModuleOutPath) RelativeToTop() Path {
p.OutputPath = p.outputPathRelativeToTop()
return p
@@ -1507,6 +1537,11 @@
ModuleOutPath
}
+func (p ModuleGenPath) Dir() Path {
+ p.ModuleOutPath = p.ModuleOutPath.Dir().(ModuleOutPath)
+ return p
+}
+
func (p ModuleGenPath) RelativeToTop() Path {
p.OutputPath = p.outputPathRelativeToTop()
return p
@@ -1546,6 +1581,11 @@
ModuleOutPath
}
+func (p ModuleObjPath) Dir() Path {
+ p.ModuleOutPath = p.ModuleOutPath.Dir().(ModuleOutPath)
+ return p
+}
+
func (p ModuleObjPath) RelativeToTop() Path {
p.OutputPath = p.outputPathRelativeToTop()
return p
@@ -1570,6 +1610,11 @@
ModuleOutPath
}
+func (p ModuleResPath) Dir() Path {
+ p.ModuleOutPath = p.ModuleOutPath.Dir().(ModuleOutPath)
+ return p
+}
+
func (p ModuleResPath) RelativeToTop() Path {
p.OutputPath = p.outputPathRelativeToTop()
return p
@@ -1606,6 +1651,11 @@
makePath bool
}
+func (p InstallPath) Dir() Path {
+ p.basePath = p.basePath.Dir().(basePath)
+ return p
+}
+
// Will panic if called from outside a test environment.
func ensureTestOnly() {
if PrefixInList(os.Args, "-test.") {
@@ -1922,6 +1972,11 @@
basePath
}
+func (p PhonyPath) Dir() Path {
+ p.basePath = p.basePath.Dir().(basePath)
+ return p
+}
+
func (p PhonyPath) writablePath() {}
func (p PhonyPath) getSoongOutDir() string {
@@ -1947,6 +2002,11 @@
basePath
}
+func (p testPath) Dir() Path {
+ p.basePath = p.basePath.Dir().(basePath)
+ return p
+}
+
func (p testPath) RelativeToTop() Path {
ensureTestOnly()
return p
diff --git a/android/prebuilt_build_tool.go b/android/prebuilt_build_tool.go
index 17b3230..c00b22b 100644
--- a/android/prebuilt_build_tool.go
+++ b/android/prebuilt_build_tool.go
@@ -14,7 +14,11 @@
package android
-import "path/filepath"
+import (
+ "path/filepath"
+
+ "github.com/google/blueprint"
+)
func init() {
RegisterModuleType("prebuilt_build_tool", NewPrebuiltBuildTool)
@@ -55,6 +59,13 @@
}
}
+type PrebuiltBuildToolInfo struct {
+ Src Path
+ Deps Paths
+}
+
+var PrebuiltBuildToolInfoProvider = blueprint.NewProvider(PrebuiltBuildToolInfo{})
+
func (t *prebuiltBuildTool) GenerateAndroidBuildActions(ctx ModuleContext) {
sourcePath := t.prebuilt.SingleSourcePath(ctx)
installedPath := PathForModuleOut(ctx, t.BaseModuleName())
@@ -82,6 +93,11 @@
}
t.toolPath = OptionalPathForPath(installedPath)
+
+ ctx.SetProvider(PrebuiltBuildToolInfoProvider, PrebuiltBuildToolInfo{
+ Src: sourcePath,
+ Deps: deps,
+ })
}
func (t *prebuiltBuildTool) MakeVars(ctx MakeVarsModuleContext) {
diff --git a/android/util.go b/android/util.go
index 5375373..7f6af2d 100644
--- a/android/util.go
+++ b/android/util.go
@@ -33,12 +33,17 @@
return append([]T{}, s...)
}
-// Concat returns a new slice concatenated from the two input slices. It does not change the input
+// Concat returns a new slice concatenated from the input slices. It does not change the input
// slices.
-func Concat[T any](s1, s2 []T) []T {
- res := make([]T, 0, len(s1)+len(s2))
- res = append(res, s1...)
- res = append(res, s2...)
+func Concat[T any](slices ...[]T) []T {
+ newLength := 0
+ for _, s := range slices {
+ newLength += len(s)
+ }
+ res := make([]T, 0, newLength)
+ for _, s := range slices {
+ res = append(res, s...)
+ }
return res
}