Export static libraries.

Export static libraries through LOCAL_STATIC_LIBRARIES and
LOCAL_WHOLE_STATIC_LIBRARIES. This enables dependency-based NOTICE file
generation. Also, add a notice property in the libwinpthread module.

Bug: 36073965
Test: cc_test.go
Change-Id: Ic63ca523b40acac82bbe876f7aa40ecd495907c5
diff --git a/cc/cc_test.go b/cc/cc_test.go
index fba38a2..8e257d3 100644
--- a/cc/cc_test.go
+++ b/cc/cc_test.go
@@ -55,13 +55,17 @@
 	ctx := android.NewTestArchContext()
 	ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(LibraryFactory))
 	ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(LibrarySharedFactory))
+	ctx.RegisterModuleType("cc_library_static", android.ModuleFactoryAdaptor(LibraryStaticFactory))
 	ctx.RegisterModuleType("cc_library_headers", android.ModuleFactoryAdaptor(LibraryHeaderFactory))
+	ctx.RegisterModuleType("cc_library_host_static", android.ModuleFactoryAdaptor(LibraryHostStaticFactory))
 	ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(ToolchainLibraryFactory))
 	ctx.RegisterModuleType("llndk_library", android.ModuleFactoryAdaptor(llndkLibraryFactory))
 	ctx.RegisterModuleType("llndk_headers", android.ModuleFactoryAdaptor(llndkHeadersFactory))
 	ctx.RegisterModuleType("vendor_public_library", android.ModuleFactoryAdaptor(vendorPublicLibraryFactory))
 	ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(ObjectFactory))
 	ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory))
+	ctx.RegisterModuleType("cc_binary", android.ModuleFactoryAdaptor(binaryFactory))
+	ctx.RegisterModuleType("cc_binary_host", android.ModuleFactoryAdaptor(binaryHostFactory))
 	ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
 		ctx.BottomUp("image", imageMutator).Parallel()
 		ctx.BottomUp("link", LinkageMutator).Parallel()
@@ -122,6 +126,19 @@
 			src: "",
 		}
 
+		toolchain_library {
+			name: "libwinpthread",
+			vendor_available: true,
+			recovery_available: true,
+			host_supported: true,
+			src: "",
+			target: {
+				windows: {
+					enabled: true,
+				},
+			},
+		}
+
 		cc_library {
 			name: "libc",
 			no_libgcc: true,
@@ -155,14 +172,20 @@
 			name: "libdl",
 			symbol_file: "",
 		}
-		cc_library {
+		cc_library_static {
 			name: "libc++_static",
 			no_libgcc: true,
 			nocrt: true,
 			system_shared_libs: [],
 			stl: "none",
+			host_supported: true,
 			vendor_available: true,
 			recovery_available: true,
+			target: {
+				windows: {
+					enabled: true,
+				},
+			},
 		}
 		cc_library {
 			name: "libc++",
@@ -194,6 +217,14 @@
 		}
 
 		cc_object {
+			name: "crtbegin_dynamic",
+		}
+
+		cc_object {
+			name: "crtend_android",
+		}
+
+		cc_object {
 			name: "crtend_so",
 			recovery_available: true,
 			vendor_available: true,
@@ -1549,6 +1580,65 @@
 	checkRuntimeLibs(t, []string{"libvendor_available1", "libvendor1"}, module)
 }
 
+func checkStaticLibs(t *testing.T, expected []string, module *Module) {
+	actual := module.Properties.AndroidMkStaticLibs
+	if !reflect.DeepEqual(actual, expected) {
+		t.Errorf("incorrect static_libs"+
+			"\nactual:   %v"+
+			"\nexpected: %v",
+			actual,
+			expected,
+		)
+	}
+}
+
+const staticLibAndroidBp = `
+	cc_library {
+		name: "lib1",
+	}
+	cc_binary {
+		name: "bin1",
+		static_libs: ["lib1"],
+	}
+	cc_library_host_static {
+		name: "lib2",
+		target: {
+			windows: {
+				enabled: true,
+			},
+		}
+	}
+	cc_binary_host {
+		name: "bin2",
+		static_libs: ["lib2"],
+		stl: "libc++_static",
+		target: {
+			windows: {
+				enabled: true,
+			},
+		},
+	}
+`
+
+func TestStaticLibs(t *testing.T) {
+	ctx := testCc(t, staticLibAndroidBp)
+
+	// Check a device binary.
+	variant := "android_arm64_armv8-a_core"
+	module := ctx.ModuleForTests("bin1", variant).Module().(*Module)
+	checkStaticLibs(t, []string{"lib1", "libclang_rt.builtins-aarch64-android", "libatomic", "libgcc"}, module)
+
+	// Check a host binary.
+	variant = "linux_glibc_x86_64"
+	module = ctx.ModuleForTests("bin2", variant).Module().(*Module)
+	checkStaticLibs(t, []string{"lib2", "libc++_static"}, module)
+
+	// Check a host binary on Windows.
+	variant = "windows_x86"
+	module = ctx.ModuleForTests("bin2", variant).Module().(*Module)
+	checkStaticLibs(t, []string{"lib2", "libc++_static", "libwinpthread"}, module)
+}
+
 var compilerFlagsTestCases = []struct {
 	in  string
 	out bool