Support generation of make rule for vts profiler.

Merged-In: I1640b685d1bb099dd518d6ea02ccd51eadb7b4ba
Bug:31930023
Test: make hidl-gen
Change-Id: I1640b685d1bb099dd518d6ea02ccd51eadb7b4ba
(cherry picked from commit a38e785f5ed0cb050ca04efcdcbb8ee183f14147)
diff --git a/main.cpp b/main.cpp
index fba0f5b..6367e39 100644
--- a/main.cpp
+++ b/main.cpp
@@ -625,8 +625,8 @@
         const FQName &packageFQName,
         const char *hidl_gen,
         const char *vtsc,
-        const char *vtsc_mode,
-        const char *vtsc_type,
+        const std::string &vtsc_mode,
+        const std::string &vtsc_type,
         Coordinator *coordinator,
         const std::string &genName,
         const char *language,
@@ -678,17 +678,15 @@
     out << "}\n\n";
 }
 
-static status_t generateAndroidBpForVtsDriverPackage(
+static status_t generateAndroidBpForVtsPackage(
         Formatter& out,
         const std::set<FQName>& importedPackages,
         std::vector<FQName>& packageInterfaces,
         const FQName &packageFQName,
+        const std::string &libraryName,
+        const std::string &vtsCompileMode,
         const char *hidl_gen,
         Coordinator *coordinator) {
-    const std::string targetLibraryName = makeLibraryName(packageFQName);
-    const std::string libraryName = targetLibraryName.substr(
-        0, targetLibraryName.find_last_of("@")) + ".vts.driver" +
-        targetLibraryName.substr(targetLibraryName.find_last_of("@"));
     const std::string genSourceName = libraryName + "_genc++";
     const std::string genHeaderName = libraryName + "_genc++_headers";
     const std::string pathPrefix =
@@ -704,7 +702,7 @@
             packageFQName,
             hidl_gen,
             vtsc,
-            "DRIVER",
+            vtsCompileMode,
             "SOURCE",
             coordinator,
             genSourceName,
@@ -724,7 +722,7 @@
             packageFQName,
             hidl_gen,
             vtsc,
-            "DRIVER",
+            vtsCompileMode,
             "HEADER",
             coordinator,
             genHeaderName,
@@ -748,44 +746,120 @@
         << "shared_libs: [\n";
 
     out.indent();
-    out << "\"libhidlbase\",\n"
-        << "\"libhidltransport\",\n"
-        << "\"libhwbinder\",\n"
-        << "\"liblog\",\n"
-        << "\"libutils\",\n"
-        << "\"libcutils\",\n"
-        << "\"libvts_common\",\n"
-        << "\"libvts_datatype\",\n"
-        << "\"libvts_measurement\",\n"
-        << "\"libvts_multidevice_proto\",\n"
-        << "\"libcamera_metadata\",\n"
-        << "\"libprotobuf-cpp-full\",\n";
+    if (vtsCompileMode =="DRIVER") {
+        out << "\"libhidlbase\",\n"
+            << "\"libhidltransport\",\n"
+            << "\"libhwbinder\",\n"
+            << "\"liblog\",\n"
+            << "\"libutils\",\n"
+            << "\"libcutils\",\n"
+            << "\"libvts_common\",\n"
+            << "\"libvts_datatype\",\n"
+            << "\"libvts_measurement\",\n"
+            << "\"libvts_multidevice_proto\",\n"
+            << "\"libcamera_metadata\",\n"
+            << "\"libprotobuf-cpp-full\",\n";
+    } else if (vtsCompileMode == "PROFILER") {
+        out << "\"libbase\",\n"
+            << "\"libhidlbase\",\n"
+            << "\"libhidltransport\",\n"
+            << "\"libvts_profiling\",\n"
+            << "\"libvts_multidevice_proto\",\n"
+            << "\"libprotobuf-cpp-full\",\n";
+    } else {
+        fprintf(stderr,
+                "ERROR: Unknow vts compile mode: %s. Aborting.\n",
+                vtsCompileMode.c_str());
+        return UNKNOWN_ERROR;
+    }
     for (const auto &importedPackage : importedPackages) {
         out << "\"" << makeLibraryName(importedPackage) << "\",\n";
     }
-    out << "\"" << targetLibraryName << "\",\n";
+    out << "\"" << makeLibraryName(packageFQName) << "\",\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 : importedPackages) {
-        out << "\"" << makeLibraryName(importedPackage) << "\",\n";
+    if (vtsCompileMode == "DRIVER") {
+        out << "export_shared_lib_headers: [\n";
+        out.indent();
+        out << "\"libhidlbase\",\n"
+            << "\"libhidltransport\",\n"
+            << "\"libhwbinder\",\n"
+            << "\"libutils\",\n";
+        for (const auto &importedPackage : importedPackages) {
+            out << "\"" << makeLibraryName(importedPackage) << "\",\n";
+        }
+        out.unindent();
+        out << "],\n";
     }
     out.unindent();
-    out << "],\n";
-    out.unindent();
-
     out << "}\n";
 
     return OK;
 }
 
+static status_t generateAndroidBpForVtsDriverPackage(
+        Formatter& out,
+        const std::set<FQName>& importedPackages,
+        std::vector<FQName>& packageInterfaces,
+        const FQName &packageFQName,
+        const char *hidl_gen,
+        Coordinator *coordinator) {
+    const std::string targetLibraryName = makeLibraryName(packageFQName);
+    const std::string libraryName = targetLibraryName.substr(
+        0, targetLibraryName.find_last_of("@")) + ".vts.driver" +
+        targetLibraryName.substr(targetLibraryName.find_last_of("@"));
+    return generateAndroidBpForVtsPackage(out, importedPackages,
+                                          packageInterfaces,
+                                          packageFQName,
+                                          libraryName,
+                                          "DRIVER", hidl_gen,
+                                          coordinator);
+}
+
+static status_t generateAndroidBpForVtsProfilerPackage(
+        Formatter& out,
+        const std::set<FQName>& importedPackages,
+        std::vector<FQName>& packageInterfaces,
+        const FQName &packageFQName,
+        const char *hidl_gen,
+        Coordinator *coordinator) {
+    std::vector<std::vector<FQName>> interfacesForProfiler;
+    bool hasTypesInterface = false;
+    FQName typesInterface;
+    // Split interfaces except for the types interface.
+    for (const auto &fqName : packageInterfaces) {
+        if (fqName.name() == "types") {
+            hasTypesInterface = true;
+            typesInterface = fqName;
+        } else {
+            std::vector<FQName> interfaces;
+            interfaces.push_back(fqName);
+            interfacesForProfiler.push_back(interfaces);
+        }
+    }
+    // Generate profiler library for each interface.
+    for (auto interfaces : interfacesForProfiler) {
+        if (hasTypesInterface) {
+            interfaces.push_back(typesInterface);
+        }
+        const std::string targetLibraryName = makeLibraryName(packageFQName);
+        const std::string libraryName = targetLibraryName + "-"
+            + interfaces[0].name() + "-vts.profiler";
+        status_t status = generateAndroidBpForVtsPackage(out, importedPackages,
+                                                         interfaces,
+                                                         packageFQName,
+                                                         libraryName,
+                                                         "PROFILER", hidl_gen,
+                                                         coordinator);
+        if (status != OK) {
+            return status;
+        }
+    }
+    return OK;
+}
+
 static status_t generateAndroidBpForPackage(
         const FQName &packageFQName,
         const char *hidl_gen,
@@ -938,15 +1012,33 @@
         && packageFQName.string() != "android.hardware.power@1.0"
         && packageFQName.string() != "android.hardware.tv.cec@1.0"
         && packageFQName.string() != "android.hardware.memtrack@1.0"
-        && packageFQName.string() != "android.hardware.sensor@1.0") {
+        && packageFQName.string() != "android.hardware.sensors@1.0") {
         fprintf(stderr,
                 "WARNING: %s does not yet have auto-generated VTS driver & profiler.\n",
                 packageFQName.string().c_str());
         return OK;
     }
-    return generateAndroidBpForVtsDriverPackage(
-        out, importedPackages, packageInterfaces, packageFQName,
-        hidl_gen, coordinator);
+    // Generate Driver package.
+    status_t status = generateAndroidBpForVtsDriverPackage(out,
+                                                           importedPackages,
+                                                           packageInterfaces,
+                                                           packageFQName,
+                                                           hidl_gen,
+                                                           coordinator);
+    if (status != OK) {
+        return status;
+    }
+    // Generate Profiler packages.
+    status = generateAndroidBpForVtsProfilerPackage(out,
+                                                    importedPackages,
+                                                    packageInterfaces,
+                                                    packageFQName,
+                                                    hidl_gen,
+                                                    coordinator);
+    if (status != OK) {
+        return status;
+    }
+    return OK;
 }
 
 static status_t generateAndroidBpImplForPackage(