Revert "Annotate dependency tags for dependencies of installed files"

This reverts commit 62a0cfd05460d0e760ce9133690e48861bb57eee.

Reason for revert: b/173475545

Change-Id: I4e834200c8e68dfa1b8144dfd1fa95ca68554980
diff --git a/android/Android.bp b/android/Android.bp
index 8f89a59..7bd1450 100644
--- a/android/Android.bp
+++ b/android/Android.bp
@@ -21,7 +21,6 @@
         "defaults.go",
         "defs.go",
         "depset.go",
-        "deptag.go",
         "expand.go",
         "filegroup.go",
         "hooks.go",
@@ -69,7 +68,6 @@
         "config_test.go",
         "csuite_config_test.go",
         "depset_test.go",
-        "deptag_test.go",
         "expand_test.go",
         "module_test.go",
         "mutator_test.go",
diff --git a/android/arch.go b/android/arch.go
index 16211f8..98ff07a 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -598,10 +598,6 @@
 	// has dependencies on all the OS variants.
 	CommonOS = NewOsType("common_os", Generic, false)
 
-	// CommonArch is the Arch for all modules that are os-specific but not arch specific,
-	// for example most Java modules.
-	CommonArch = Arch{ArchType: Common}
-
 	osArchTypeMap = map[OsType][]ArchType{
 		Linux:       []ArchType{X86, X86_64},
 		LinuxBionic: []ArchType{Arm64, X86_64},
@@ -665,7 +661,7 @@
 	if _, found := commonTargetMap[name]; found {
 		panic(fmt.Errorf("Found Os type duplicate during OsType registration: %q", name))
 	} else {
-		commonTargetMap[name] = Target{Os: os, Arch: CommonArch}
+		commonTargetMap[name] = Target{Os: os, Arch: Arch{ArchType: Common}}
 	}
 
 	return os
@@ -823,6 +819,9 @@
 // Identifies the dependency from CommonOS variant to the os specific variants.
 var commonOsToOsSpecificVariantTag = archDepTag{name: "common os to os specific"}
 
+// Identifies the dependency from arch variant to the common variant for a "common_first" multilib.
+var firstArchToCommonArchDepTag = archDepTag{name: "first arch to common arch"}
+
 // Get the OsType specific variants for the current CommonOS variant.
 //
 // The returned list will only contain enabled OsType specific variants of the
@@ -961,6 +960,12 @@
 		addTargetProperties(m, targets[i], multiTargets, i == 0)
 		m.base().setArchProperties(mctx)
 	}
+
+	if multilib == "common_first" && len(modules) >= 2 {
+		for i := range modules[1:] {
+			mctx.AddInterVariantDependency(firstArchToCommonArchDepTag, modules[i+1], modules[0])
+		}
+	}
 }
 
 func addTargetProperties(m Module, target Target, multiTargets []Target, primaryTarget bool) {
diff --git a/android/deptag.go b/android/deptag.go
deleted file mode 100644
index be5c35c..0000000
--- a/android/deptag.go
+++ /dev/null
@@ -1,45 +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 "github.com/google/blueprint"
-
-// Dependency tags can implement this interface and return true from InstallDepNeeded to annotate
-// that the installed files of the parent should depend on the installed files of the child.
-type InstallNeededDependencyTag interface {
-	// If InstallDepNeeded returns true then the installed files of the parent will depend on the
-	// installed files of the child.
-	InstallDepNeeded() bool
-}
-
-// Dependency tags can embed this struct to annotate that the installed files of the parent should
-// depend on the installed files of the child.
-type InstallAlwaysNeededDependencyTag struct{}
-
-func (i InstallAlwaysNeededDependencyTag) InstallDepNeeded() bool {
-	return true
-}
-
-var _ InstallNeededDependencyTag = InstallAlwaysNeededDependencyTag{}
-
-// IsInstallDepNeeded returns true if the dependency tag implements the InstallNeededDependencyTag
-// interface and the InstallDepNeeded returns true, meaning that the installed files of the parent
-// should depend on the installed files of the child.
-func IsInstallDepNeeded(tag blueprint.DependencyTag) bool {
-	if i, ok := tag.(InstallNeededDependencyTag); ok {
-		return i.InstallDepNeeded()
-	}
-	return false
-}
diff --git a/android/deptag_test.go b/android/deptag_test.go
deleted file mode 100644
index bdd449e..0000000
--- a/android/deptag_test.go
+++ /dev/null
@@ -1,135 +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 (
-	"testing"
-
-	"github.com/google/blueprint"
-)
-
-type testInstallDependencyTagModule struct {
-	ModuleBase
-	Properties struct {
-		Install_deps []string
-		Deps         []string
-	}
-}
-
-func (t *testInstallDependencyTagModule) GenerateAndroidBuildActions(ctx ModuleContext) {
-	outputFile := PathForModuleOut(ctx, "out")
-	ctx.Build(pctx, BuildParams{
-		Rule:   Touch,
-		Output: outputFile,
-	})
-	ctx.InstallFile(PathForModuleInstall(ctx), ctx.ModuleName(), outputFile)
-}
-
-var testInstallDependencyTagAlwaysDepTag = struct {
-	blueprint.DependencyTag
-	InstallAlwaysNeededDependencyTag
-}{}
-
-var testInstallDependencyTagNeverDepTag = struct {
-	blueprint.DependencyTag
-}{}
-
-func (t *testInstallDependencyTagModule) DepsMutator(ctx BottomUpMutatorContext) {
-	ctx.AddVariationDependencies(nil, testInstallDependencyTagAlwaysDepTag, t.Properties.Install_deps...)
-	ctx.AddVariationDependencies(nil, testInstallDependencyTagNeverDepTag, t.Properties.Deps...)
-}
-
-func testInstallDependencyTagModuleFactory() Module {
-	module := &testInstallDependencyTagModule{}
-	InitAndroidArchModule(module, HostAndDeviceDefault, MultilibCommon)
-	module.AddProperties(&module.Properties)
-	return module
-}
-
-func TestInstallDependencyTag(t *testing.T) {
-	bp := `
-		test_module {
-			name: "foo",
-			deps: ["dep"],
-			install_deps: ["install_dep"],
-		}
-
-		test_module {
-			name: "install_dep",
-			install_deps: ["transitive"],
-		}
-
-		test_module {
-			name: "transitive",
-		}
-
-		test_module {
-			name: "dep",
-		}
-	`
-
-	config := TestArchConfig(buildDir, nil, bp, nil)
-	ctx := NewTestArchContext(config)
-
-	ctx.RegisterModuleType("test_module", testInstallDependencyTagModuleFactory)
-
-	ctx.Register()
-	_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
-	FailIfErrored(t, errs)
-	_, errs = ctx.PrepareBuildActions(config)
-	FailIfErrored(t, errs)
-
-	hostFoo := ctx.ModuleForTests("foo", config.BuildOSCommonTarget.String()).Description("install")
-	hostInstallDep := ctx.ModuleForTests("install_dep", config.BuildOSCommonTarget.String()).Description("install")
-	hostTransitive := ctx.ModuleForTests("transitive", config.BuildOSCommonTarget.String()).Description("install")
-	hostDep := ctx.ModuleForTests("dep", config.BuildOSCommonTarget.String()).Description("install")
-
-	if g, w := hostFoo.Implicits.Strings(), hostInstallDep.Output.String(); !InList(w, g) {
-		t.Errorf("expected host dependency %q, got %q", w, g)
-	}
-
-	if g, w := hostFoo.Implicits.Strings(), hostTransitive.Output.String(); !InList(w, g) {
-		t.Errorf("expected host dependency %q, got %q", w, g)
-	}
-
-	if g, w := hostInstallDep.Implicits.Strings(), hostTransitive.Output.String(); !InList(w, g) {
-		t.Errorf("expected host dependency %q, got %q", w, g)
-	}
-
-	if g, w := hostFoo.Implicits.Strings(), hostDep.Output.String(); InList(w, g) {
-		t.Errorf("expected no host dependency %q, got %q", w, g)
-	}
-
-	deviceFoo := ctx.ModuleForTests("foo", "android_common").Description("install")
-	deviceInstallDep := ctx.ModuleForTests("install_dep", "android_common").Description("install")
-	deviceTransitive := ctx.ModuleForTests("transitive", "android_common").Description("install")
-	deviceDep := ctx.ModuleForTests("dep", "android_common").Description("install")
-
-	if g, w := deviceFoo.OrderOnly.Strings(), deviceInstallDep.Output.String(); !InList(w, g) {
-		t.Errorf("expected device dependency %q, got %q", w, g)
-	}
-
-	if g, w := deviceFoo.OrderOnly.Strings(), deviceTransitive.Output.String(); !InList(w, g) {
-		t.Errorf("expected device dependency %q, got %q", w, g)
-	}
-
-	if g, w := deviceInstallDep.OrderOnly.Strings(), deviceTransitive.Output.String(); !InList(w, g) {
-		t.Errorf("expected device dependency %q, got %q", w, g)
-	}
-
-	if g, w := deviceFoo.OrderOnly.Strings(), deviceDep.Output.String(); InList(w, g) {
-		t.Errorf("expected no device dependency %q, got %q", w, g)
-	}
-}
diff --git a/android/module.go b/android/module.go
index ef1b0bd..d677406 100644
--- a/android/module.go
+++ b/android/module.go
@@ -1242,18 +1242,14 @@
 	return m.commonProperties.NamespaceExportedToMake
 }
 
-// computeInstallDeps finds the installed paths of all dependencies that have a dependency
-// tag that is annotated as needing installation via the IsInstallDepNeeded method.
 func (m *ModuleBase) computeInstallDeps(ctx blueprint.ModuleContext) InstallPaths {
+
 	var result InstallPaths
-	ctx.WalkDeps(func(child, parent blueprint.Module) bool {
-		if a, ok := child.(Module); ok {
-			if IsInstallDepNeeded(ctx.OtherModuleDependencyTag(child)) {
-				result = append(result, a.FilesToInstall()...)
-				return true
-			}
+	// TODO(ccross): we need to use WalkDeps and have some way to know which dependencies require installation
+	ctx.VisitDepsDepthFirst(func(m blueprint.Module) {
+		if a, ok := m.(Module); ok {
+			result = append(result, a.FilesToInstall()...)
 		}
-		return false
 	})
 
 	return result