Add symlink installation support

Allow modules to specify a list of names to create alias symlinks, and
pass the list to make so it can create them.  Also pass
LOCAL_FORCE_STATIC_EXECUTABLE for static binaries so that make can avoid
a linker_asan -> linker -> linker_asan dependency loop.

Change-Id: I314d088095ac5f43641ed2cf8247c14c27e23b93
diff --git a/android/module.go b/android/module.go
index a00cb7d..ef20f8d 100644
--- a/android/module.go
+++ b/android/module.go
@@ -78,6 +78,7 @@
 
 	InstallFile(installPath OutputPath, srcPath Path, deps ...Path) OutputPath
 	InstallFileName(installPath OutputPath, name string, srcPath Path, deps ...Path) OutputPath
+	InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath
 	CheckbuildFile(srcPath Path)
 
 	AddMissingDependencies(deps []string)
@@ -563,6 +564,24 @@
 	return a.InstallFileName(installPath, filepath.Base(srcPath.String()), srcPath, deps...)
 }
 
+func (a *androidModuleContext) InstallSymlink(installPath OutputPath, name string, srcPath OutputPath) OutputPath {
+	fullInstallPath := installPath.Join(a, name)
+
+	a.ModuleBuild(pctx, ModuleBuildParams{
+		Rule:      Symlink,
+		Output:    fullInstallPath,
+		OrderOnly: Paths{srcPath},
+		Default:   !a.AConfig().EmbeddedInMake(),
+		Args: map[string]string{
+			"fromPath": srcPath.String(),
+		},
+	})
+
+	a.installFiles = append(a.installFiles, fullInstallPath)
+	a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
+	return fullInstallPath
+}
+
 func (a *androidModuleContext) CheckbuildFile(srcPath Path) {
 	a.checkbuildFiles = append(a.checkbuildFiles, srcPath)
 }
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 24d771a..7f18155 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -124,6 +124,9 @@
 	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) error {
 		fmt.Fprintln(w, "LOCAL_CXX_STL := none")
 		fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
+		if binary.static() {
+			fmt.Fprintln(w, "LOCAL_FORCE_STATIC_EXECUTABLE := true")
+		}
 		return nil
 	})
 }
@@ -173,6 +176,9 @@
 		stem := strings.TrimSuffix(file, filepath.Ext(file))
 		fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(OUT_DIR)/"+filepath.Clean(dir))
 		fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem)
+		if len(installer.Properties.Symlinks) > 0 {
+			fmt.Fprintln(w, "LOCAL_MODULE_SYMLINKS := "+strings.Join(installer.Properties.Symlinks, " "))
+		}
 		return nil
 	})
 }
diff --git a/cc/cc.go b/cc/cc.go
index 4ff6572..f8723bb 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -454,6 +454,9 @@
 type InstallerProperties struct {
 	// install to a subdirectory of the default install path for the module
 	Relative_install_path string
+
+	// install symlinks to the module
+	Symlinks []string `android:"arch_variant"`
 }
 
 type StripProperties struct {
@@ -1472,6 +1475,9 @@
 	}
 	dir := android.PathForModuleInstall(ctx, subDir, installer.Properties.Relative_install_path)
 	installer.path = ctx.InstallFile(dir, file)
+	for _, symlink := range installer.Properties.Symlinks {
+		ctx.InstallSymlink(dir, symlink, installer.path)
+	}
 }
 
 func (installer *baseInstaller) inData() bool {