Add support for building on Darwin hosts

Add toolchain and build rules for building on Darwin.

Change-Id: I78e21f4051b2941182121b28c9ddfa24396ada41
diff --git a/cc/cc.go b/cc/cc.go
index 3ab8a47..8032fe3 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -21,6 +21,7 @@
 import (
 	"fmt"
 	"path/filepath"
+	"runtime"
 	"strings"
 
 	"github.com/google/blueprint"
@@ -456,16 +457,6 @@
 		flags.CFlags = append(flags.CFlags, target, gccPrefix)
 		flags.AsFlags = append(flags.AsFlags, target, gccPrefix)
 		flags.LdFlags = append(flags.LdFlags, target, gccPrefix)
-
-		if ctx.Host() {
-			gccToolchain := "--gcc-toolchain=" + toolchain.GccRoot()
-			sysroot := "--sysroot=" + filepath.Join(toolchain.GccRoot(), "sysroot")
-
-			// TODO: also need more -B, -L flags to make host builds hermetic
-			flags.CFlags = append(flags.CFlags, gccToolchain, sysroot)
-			flags.AsFlags = append(flags.AsFlags, gccToolchain, sysroot)
-			flags.LdFlags = append(flags.LdFlags, gccToolchain, sysroot)
-		}
 	}
 
 	if !c.Properties.No_default_compiler_flags {
@@ -744,10 +735,17 @@
 	}
 }
 
-var (
-	hostDynamicGccLibs = []string{"-lgcc_s", "-lgcc", "-lc", "-lgcc_s", "-lgcc"}
-	hostStaticGccLibs  = []string{"-Wl,--start-group", "-lgcc", "-lgcc_eh", "-lc", "-Wl,--end-group"}
-)
+var hostDynamicGccLibs, hostStaticGccLibs []string
+
+func init() {
+	if runtime.GOOS == "darwin" {
+		hostDynamicGccLibs = []string{"-lc", "-lSystem"}
+		hostStaticGccLibs = []string{"NO_STATIC_HOST_BINARIES_ON_DARWIN"}
+	} else {
+		hostDynamicGccLibs = []string{"-lgcc_s", "-lgcc", "-lc", "-lgcc_s", "-lgcc"}
+		hostStaticGccLibs = []string{"-Wl,--start-group", "-lgcc", "-lgcc_eh", "-lc", "-Wl,--end-group"}
+	}
+}
 
 func (c *CCLinked) flags(ctx common.AndroidModuleContext, flags CCFlags) CCFlags {
 	stl := c.stl(ctx)
@@ -1058,11 +1056,20 @@
 			flags.LdFlags = append(flags.LdFlags, "-nostdlib")
 		}
 
-		flags.LdFlags = append(flags.LdFlags,
-			"-Wl,--gc-sections",
-			sharedFlag,
-			"-Wl,-soname,"+libName+sharedLibraryExtension,
-		)
+		if ctx.Darwin() {
+			flags.LdFlags = append(flags.LdFlags,
+				"-dynamiclib",
+				"-single_module",
+				//"-read_only_relocs suppress",
+				"-install_name @rpath/"+libName+sharedLibraryExtension,
+			)
+		} else {
+			flags.LdFlags = append(flags.LdFlags,
+				"-Wl,--gc-sections",
+				sharedFlag,
+				"-Wl,-soname,"+libName+sharedLibraryExtension,
+			)
+		}
 	}
 
 	return flags
@@ -1080,7 +1087,11 @@
 
 	outputFile := filepath.Join(common.ModuleOutDir(ctx), ctx.ModuleName()+staticLibraryExtension)
 
-	TransformObjToStaticLib(ctx, objFiles, ccFlagsToBuilderFlags(flags), outputFile)
+	if ctx.Darwin() {
+		TransformDarwinObjToStaticLib(ctx, objFiles, ccFlagsToBuilderFlags(flags), outputFile)
+	} else {
+		TransformObjToStaticLib(ctx, objFiles, ccFlagsToBuilderFlags(flags), outputFile)
+	}
 
 	c.objFiles = objFiles
 	c.out = outputFile
@@ -1302,6 +1313,9 @@
 }
 
 func (c *CCBinary) ModifyProperties(ctx common.AndroidBaseContext) {
+	if ctx.Darwin() {
+		c.BinaryProperties.Static_executable = false
+	}
 	if c.BinaryProperties.Static_executable {
 		c.dynamicProperties.VariantIsStaticBinary = true
 	}
@@ -1342,6 +1356,8 @@
 				"-Wl,-z,nocopyreloc",
 			)
 		}
+	} else if ctx.Darwin() {
+		flags.LdFlags = append(flags.LdFlags, "-Wl,-headerpad_max_install_names")
 	}
 
 	return flags