Merge "Explicitly generate _vendor library."
diff --git a/main.cpp b/main.cpp
index 69da62d..7c529a9 100644
--- a/main.cpp
+++ b/main.cpp
@@ -643,6 +643,11 @@
     return true;
 }
 
+bool isHidlTransportPackage(const FQName &package) {
+    return package == gIBasePackageFqName ||
+           package == gIManagerPackageFqName;
+}
+
 static void generateAndroidBpGenSection(
         Formatter &out,
         const FQName &packageFQName,
@@ -685,9 +690,66 @@
     out << "}\n\n";
 }
 
-bool isHidlTransportPackage(const FQName &package) {
-    return package == gIBasePackageFqName ||
-           package == gIManagerPackageFqName;
+static void generateAndroidBpLibSection(
+        Formatter &out,
+        bool generateVendor,
+        const std::string &libraryName,
+        const std::string &genSourceName,
+        const std::string &genHeaderName,
+        const std::set<FQName> &importedPackagesHierarchy) {
+
+    // C++ library definition
+    out << "cc_library_shared {\n";
+    out.indent();
+    out << "name: \"" << libraryName << (generateVendor ? "_vendor" : "") << "\",\n"
+        << "defaults: [\"hidl-module-defaults\"],\n"
+        << "generated_sources: [\"" << genSourceName << "\"],\n"
+        << "generated_headers: [\"" << genHeaderName << "\"],\n"
+        << "export_generated_headers: [\"" << genHeaderName << "\"],\n";
+
+    if (generateVendor) {
+        out << "vendor: true,\n";
+    } else {
+        out << "vendor_available: true,\n";
+    }
+    out << "shared_libs: [\n";
+
+    out.indent();
+    out << "\"libhidlbase\",\n"
+        << "\"libhidltransport\",\n"
+        << "\"libhwbinder\",\n"
+        << "\"liblog\",\n"
+        << "\"libutils\",\n"
+        << "\"libcutils\",\n";
+    for (const auto &importedPackage : importedPackagesHierarchy) {
+        if (isHidlTransportPackage(importedPackage)) {
+            continue;
+        }
+
+        out << "\"" << makeLibraryName(importedPackage) << "\",\n";
+    }
+    out.unindent();
+
+    out << "],\n";
+
+    out << "export_shared_lib_headers: [\n";
+    out.indent();
+    out << "\"libhidlbase\",\n"
+        << "\"libhidltransport\",\n"
+        << "\"libhwbinder\",\n"
+        << "\"libutils\",\n";
+    for (const auto &importedPackage : importedPackagesHierarchy) {
+        if (isHidlTransportPackage(importedPackage)) {
+            continue;
+        }
+
+        out << "\"" << makeLibraryName(importedPackage) << "\",\n";
+    }
+    out.unindent();
+    out << "],\n";
+    out.unindent();
+
+    out << "}\n";
 }
 
 static status_t generateAndroidBpForPackage(
@@ -813,64 +875,40 @@
     if (isHidlTransportPackage(packageFQName)) {
         out << "// " << packageFQName.string() << " is exported from libhidltransport\n";
     } else {
-        // C++ library definition
-        out << "cc_library_shared {\n";
-        out.indent();
-        out << "name: \"" << libraryName << "\",\n"
-            << "defaults: [\"hidl-module-defaults\"],\n"
-            << "generated_sources: [\"" << genSourceName << "\"],\n"
-            << "generated_headers: [\"" << genHeaderName << "\"],\n"
-            << "export_generated_headers: [\"" << genHeaderName << "\"],\n";
+        generateAndroidBpLibSection(
+            out,
+            false /* generateVendor */,
+            libraryName,
+            genSourceName,
+            genHeaderName,
+            importedPackagesHierarchy);
 
-        // TODO(b/35813011): make always vendor_available
-        // Explicitly mark libraries vendor until BOARD_VNDK_VERSION can
-        // be enabled.
-        if (packageFQName.inPackage("android.hidl") ||
+        // TODO(b/35813011): make all libraries vendor_available
+        // Explicitly create '_vendor' copies of libraries so that
+        // vendor code can link against the extensions. When this is
+        // used, framework code should link against vendor.awesome.foo@1.0
+        // and code on the vendor image should link against
+        // vendor.awesome.foo@1.0_vendor. For libraries with the below extensions,
+        // they will be available even on the generic system image.
+        // Because of this, they should always be referenced without the
+        // '_vendor' name suffix.
+        if (!(packageFQName.inPackage("android.hidl") ||
                 packageFQName.inPackage("android.system") ||
                 packageFQName.inPackage("android.frameworks") ||
-                packageFQName.inPackage("android.hardware")) {
-            out << "vendor_available: true,\n";
-        } else {
-            out << "vendor: true,\n";
+                packageFQName.inPackage("android.hardware"))) {
+
+            // Note, not using cc_defaults here since it's already not used and
+            // because generating this libraries will be removed when the VNDK
+            // is enabled (done by the build system itself).
+            out.endl();
+            generateAndroidBpLibSection(
+                out,
+                true /* generateVendor */,
+                libraryName,
+                genSourceName,
+                genHeaderName,
+                importedPackagesHierarchy);
         }
-        out << "shared_libs: [\n";
-
-        out.indent();
-        out << "\"libhidlbase\",\n"
-            << "\"libhidltransport\",\n"
-            << "\"libhwbinder\",\n"
-            << "\"liblog\",\n"
-            << "\"libutils\",\n"
-            << "\"libcutils\",\n";
-        for (const auto &importedPackage : importedPackagesHierarchy) {
-            if (isHidlTransportPackage(importedPackage)) {
-                continue;
-            }
-
-            out << "\"" << makeLibraryName(importedPackage) << "\",\n";
-        }
-        out.unindent();
-
-        out << "],\n";
-
-        out << "export_shared_lib_headers: [\n";
-        out.indent();
-        out << "\"libhidlbase\",\n"
-            << "\"libhidltransport\",\n"
-            << "\"libhwbinder\",\n"
-            << "\"libutils\",\n";
-        for (const auto &importedPackage : importedPackagesHierarchy) {
-            if (isHidlTransportPackage(importedPackage)) {
-                continue;
-            }
-
-            out << "\"" << makeLibraryName(importedPackage) << "\",\n";
-        }
-        out.unindent();
-        out << "],\n";
-        out.unindent();
-
-        out << "}\n";
     }
 
     return OK;
diff --git a/test/vendor/1.0/Android.bp b/test/vendor/1.0/Android.bp
index ada44f7..d76a955 100644
--- a/test/vendor/1.0/Android.bp
+++ b/test/vendor/1.0/Android.bp
@@ -45,6 +45,31 @@
     generated_sources: ["tests.vendor@1.0_genc++"],
     generated_headers: ["tests.vendor@1.0_genc++_headers"],
     export_generated_headers: ["tests.vendor@1.0_genc++_headers"],
+    vendor_available: true,
+    shared_libs: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "liblog",
+        "libutils",
+        "libcutils",
+        "android.hardware.tests.baz@1.0",
+    ],
+    export_shared_lib_headers: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "libutils",
+        "android.hardware.tests.baz@1.0",
+    ],
+}
+
+cc_library_shared {
+    name: "tests.vendor@1.0_vendor",
+    defaults: ["hidl-module-defaults"],
+    generated_sources: ["tests.vendor@1.0_genc++"],
+    generated_headers: ["tests.vendor@1.0_genc++_headers"],
+    export_generated_headers: ["tests.vendor@1.0_genc++_headers"],
     vendor: true,
     shared_libs: [
         "libhidlbase",