Revert "Revert "Convert hardware/interfaces/compatibility_matric..."
Revert submission 3235656-revert-3195743-compatibility_matrix-KLJOLWYIMW
Reason for revert: The root cause of the break is already be merged. Related changes: ag/29139095, ag/29139608
Reverted changes: /q/submissionid:3235656-revert-3195743-compatibility_matrix-KLJOLWYIMW
Change-Id: I6ef91cbf72f63013778056183e0997d5ece06854
diff --git a/compatibility_matrices/build/Android.bp b/compatibility_matrices/build/Android.bp
index 79ef36d..6011fcc 100644
--- a/compatibility_matrices/build/Android.bp
+++ b/compatibility_matrices/build/Android.bp
@@ -30,6 +30,7 @@
"kernel-config-soong-rules",
"soong",
"soong-android",
+ "soong-selinux",
],
srcs: [
"vintf_compatibility_matrix.go",
diff --git a/compatibility_matrices/build/vintf_compatibility_matrix.go b/compatibility_matrices/build/vintf_compatibility_matrix.go
index c72cbde..b8f2a14 100644
--- a/compatibility_matrices/build/vintf_compatibility_matrix.go
+++ b/compatibility_matrices/build/vintf_compatibility_matrix.go
@@ -24,6 +24,7 @@
"android/soong/android"
"android/soong/kernel/configs"
+ "android/soong/selinux"
)
type dependencyTag struct {
@@ -35,10 +36,10 @@
pctx = android.NewPackageContext("android/vintf")
assembleVintfRule = pctx.AndroidStaticRule("assemble_vintf", blueprint.RuleParams{
- Command: `${assembleVintfCmd} -i ${inputs} -o ${out}`,
- CommandDeps: []string{"${assembleVintfCmd}"},
+ Command: `${assembleVintfEnv} ${assembleVintfCmd} -i ${inputs} -o ${out} ${extraArgs}`,
+ CommandDeps: []string{"${assembleVintfCmd}", "${AvbToolCmd}"},
Description: "assemble_vintf -i ${inputs}",
- }, "inputs")
+ }, "inputs", "extraArgs", "assembleVintfEnv")
xmllintXsd = pctx.AndroidStaticRule("xmllint-xsd", blueprint.RuleParams{
Command: `$XmlLintCmd --quiet --schema $xsd $in > /dev/null && touch -a $out`,
@@ -52,7 +53,11 @@
)
const (
- relpath = "vintf"
+ relpath = "vintf"
+ emptyManifest = "hardware/interfaces/compatibility_matrices/manifest.empty.xml"
+ compatibilityEmptyMatrix = "hardware/interfaces/compatibility_matrices/compatibility_matrix.empty.xml"
+ deviceFcmType = "device_fcm"
+ productFcmType = "product_fcm"
)
type vintfCompatibilityMatrixProperties struct {
@@ -64,6 +69,9 @@
// list of kernel_config modules to be combined to final output
Kernel_configs []string
+
+ // Type of the FCM type, the allowed type are device_fcm and product_fcm and it should only be used under hardware/interfaces/compatibility_matrices
+ Type *string
}
type vintfCompatibilityMatrixRule struct {
@@ -72,11 +80,13 @@
genFile android.WritablePath
additionalDependencies android.WritablePaths
+ phonyOnly bool
}
func init() {
pctx.HostBinToolVariable("assembleVintfCmd", "assemble_vintf")
pctx.HostBinToolVariable("XmlLintCmd", "xmllint")
+ pctx.HostBinToolVariable("AvbToolCmd", "avbtool")
android.RegisterModuleType("vintf_compatibility_matrix", vintfCompatibilityMatrixFactory)
}
@@ -131,6 +141,20 @@
}
func (g *vintfCompatibilityMatrixRule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+ // Types attribute only allow `device_fcm` or `product_fcm` if set and only restricted it being used under
+ // `hardware/interfaces/compatibility_matrices` to prevent accidental external usages.
+ matrixType := proptools.String(g.properties.Type)
+ if matrixType != "" {
+ if matrixType != deviceFcmType && matrixType != productFcmType {
+ panic(fmt.Errorf("The attribute 'type' value must be either 'device_fcm' or 'product_fcm' if set!"))
+ }
+ if !strings.HasPrefix(android.PathForModuleSrc(ctx).String(), "hardware/interfaces/compatibility_matrices") {
+ panic(fmt.Errorf("Attribute type can only be set for module under `hardware/interfaces/compatibility_matrices`!"))
+ }
+ if (len(g.properties.Srcs) + len(g.properties.Kernel_configs)) > 0 {
+ panic(fmt.Errorf("Attribute 'type' and 'srcs' or 'kernel_configs' should not set simultaneously! To update inputs for this rule, edit vintf_compatibility_matrix.go directly."))
+ }
+ }
outputFilename := proptools.String(g.properties.Stem)
if outputFilename == "" {
@@ -158,15 +182,72 @@
}
})
+ // For product_compatibility_matrix.xml the source is from the product configuration
+ // DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE.
+ extraArgs := []string{}
+ if matrixType == productFcmType {
+ productMatrixs := android.PathsForSource(ctx, ctx.Config().DeviceProductCompatibilityMatrixFile())
+ if len(productMatrixs) > 0 {
+ inputPaths = append(inputPaths, productMatrixs...)
+ extraArgs = append(extraArgs, "-c", android.PathForSource(ctx, emptyManifest).String())
+ } else {
+ // For product_fcm, if DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE not set, treat it as a phony target without any output generated.
+ g.phonyOnly = true
+ return
+ }
+ }
+
+ // For framework_compatibility_matrix.device.xml the source may come from the product configuration
+ // DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE or use compatibilityEmptyMatrix if not set. We can't
+ // use a phony target because we still need to install framework_compatibility_matrix.device.xml to
+ // include sepolicy versions.
+ frameworkRuleImplicits := []android.Path{}
+
+ if matrixType == deviceFcmType {
+ frameworkMatrixs := android.PathsForSource(ctx, ctx.Config().DeviceFrameworkCompatibilityMatrixFile())
+ if len(frameworkMatrixs) > 0 {
+ inputPaths = append(inputPaths, frameworkMatrixs...)
+
+ // Generate BuildAction for generating the check manifest.
+ emptyManifestPath := android.PathForSource(ctx, emptyManifest)
+ genCheckManifest := android.PathForModuleGen(ctx, "manifest.check.xml")
+ checkManifestInputs := []android.Path{emptyManifestPath}
+ genCheckManifestEnvs := []string{
+ "BOARD_SEPOLICY_VERS=" + ctx.DeviceConfig().BoardSepolicyVers(),
+ "VINTF_IGNORE_TARGET_FCM_VERSION=true",
+ }
+
+ ctx.Build(pctx, android.BuildParams{
+ Rule: assembleVintfRule,
+ Description: "Framework Check Manifest",
+ Implicits: checkManifestInputs,
+ Output: genCheckManifest,
+ Args: map[string]string{
+ "inputs": android.PathForSource(ctx, emptyManifest).String(),
+ "extraArgs": "",
+ "assembleVintfEnv": strings.Join(genCheckManifestEnvs, " "),
+ },
+ })
+
+ frameworkRuleImplicits = append(frameworkRuleImplicits, genCheckManifest)
+ extraArgs = append(extraArgs, "-c", genCheckManifest.String())
+ } else {
+ inputPaths = append(inputPaths, android.PathForSource(ctx, compatibilityEmptyMatrix))
+ }
+ }
+
g.genFile = android.PathForModuleGen(ctx, outputFilename)
+ frameworkRuleImplicits = append(frameworkRuleImplicits, inputPaths...)
ctx.Build(pctx, android.BuildParams{
Rule: assembleVintfRule,
Description: "Framework Compatibility Matrix",
- Implicits: inputPaths,
+ Implicits: frameworkRuleImplicits,
Output: g.genFile,
Args: map[string]string{
- "inputs": strings.Join(inputPaths.Strings(), ":"),
+ "inputs": strings.Join(inputPaths.Strings(), ":"),
+ "extraArgs": strings.Join(extraArgs, " "),
+ "assembleVintfEnv": g.getAssembleVintfEnv(ctx),
},
})
g.generateValidateBuildAction(ctx, g.genFile, schema.Path())
@@ -174,7 +255,39 @@
ctx.InstallFile(android.PathForModuleInstall(ctx, "etc", relpath), outputFilename, g.genFile)
}
+func (g *vintfCompatibilityMatrixRule) getAssembleVintfEnv(ctx android.ModuleContext) string {
+ if proptools.String(g.properties.Type) == deviceFcmType {
+ assembleVintfEnvs := []string{
+ // POLICYVERS defined in system/sepolicy/build/soong/policy.go
+ fmt.Sprintf("POLICYVERS=%d", selinux.PolicyVers),
+ fmt.Sprintf("PLATFORM_SEPOLICY_VERSION=%s", ctx.DeviceConfig().PlatformSepolicyVersion()),
+ fmt.Sprintf("PLATFORM_SEPOLICY_COMPAT_VERSIONS=\"%s\"", strings.Join(ctx.DeviceConfig().PlatformSepolicyCompatVersions(), " ")),
+ }
+
+ if ctx.Config().BoardAvbEnable() {
+ assembleVintfEnvs = append(assembleVintfEnvs, fmt.Sprintf("FRAMEWORK_VBMETA_VERSION=\"$$(${AvbToolCmd} add_hashtree_footer --print_required_libavb_version %s)\"", strings.Join(ctx.Config().BoardAvbSystemAddHashtreeFooterArgs(), " ")))
+ } else {
+ assembleVintfEnvs = append(assembleVintfEnvs, "FRAMEWORK_VBMETA_VERSION=\"0.0\"")
+ }
+
+ return strings.Join(assembleVintfEnvs, " ")
+ }
+
+ return ""
+}
+
func (g *vintfCompatibilityMatrixRule) AndroidMk() android.AndroidMkData {
+ if g.phonyOnly {
+ return android.AndroidMkData{
+ Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
+ fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)", " # vintf.vintf_compatibility_matrix")
+ fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir)
+ fmt.Fprintln(w, "LOCAL_MODULE :=", name)
+ fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)")
+ },
+ }
+ }
+
return android.AndroidMkData{
Class: "ETC",
OutputFile: android.OptionalPathForPath(g.genFile),