Explicitly generate _vendor library.

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.

Note: vendor_available is still outputted even though
it is for the time being a no-op

Bug: 35813011
Bug: 62616897
Test: system hidl lib definitions are unchanged
Test: vendor hidl lib definitions include vendor definition
Merged-In: I9fcc4b4b6f2093fadec7a832413ae168d1ebcfb9
Change-Id: I9fcc4b4b6f2093fadec7a832413ae168d1ebcfb9
diff --git a/main.cpp b/main.cpp
index 0a31727..58720dc 100644
--- a/main.cpp
+++ b/main.cpp
@@ -686,6 +686,60 @@
     out << "}\n\n";
 }
 
+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) {
+        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) {
+        out << "\"" << makeLibraryName(importedPackage) << "\",\n";
+    }
+    out.unindent();
+    out << "],\n";
+    out.unindent();
+
+    out << "}\n";
+}
+
 static status_t generateAndroidBpForPackage(
         const FQName &packageFQName,
         const char *hidl_gen,
@@ -807,56 +861,40 @@
                 }
             });
 
-    // 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) {
-        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) {
-        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 e436233..752a5ff 100644
--- a/test/vendor/1.0/Android.bp
+++ b/test/vendor/1.0/Android.bp
@@ -45,6 +45,33 @@
     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",
+        "android.hidl.base@1.0",
+    ],
+    export_shared_lib_headers: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "libutils",
+        "android.hardware.tests.baz@1.0",
+        "android.hidl.base@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",