hidl-gen: correct package paths in makefiles.

Previously, only IBase and the current package was added to package
paths whereas we want all paths which are required/inherited from.

Also uploadated tests.vendor to inherit something and be java
compatible.

Also fixed package root paths so that they are compared against the
beginning of a package instead of being anywhere in the package.

Bug: 34316257
Test: tests/vendor/1.0 update-base/makefiles, mma, hardware/interfaces
update-makefiles and mma

Change-Id: I9ef32b3867646690363fc9f85fe691ae74796d45
diff --git a/main.cpp b/main.cpp
index 2091571..06d7053 100644
--- a/main.cpp
+++ b/main.cpp
@@ -131,11 +131,34 @@
     return packageFQName.string();
 }
 
+static void generatePackagePathsSection(
+        Formatter &out,
+        Coordinator *coordinator,
+        const FQName &packageFQName,
+        const std::set<FQName> &importedPackages,
+        bool forMakefiles = false) {
+    std::set<std::string> options{};
+    for (const auto &interface : importedPackages) {
+        options.insert(coordinator->getPackageRootOption(interface));
+    }
+    options.insert(coordinator->getPackageRootOption(packageFQName));
+    options.insert(coordinator->getPackageRootOption(gIBasePackageFqName));
+    for (const auto &option : options) {
+        out << "-r"
+            << option
+            << " ";
+        if (forMakefiles) {
+            out << "\\\n";
+        }
+    }
+}
+
 static void generateMakefileSectionForType(
         Formatter &out,
         Coordinator *coordinator,
         const FQName &packageFQName,
         const FQName &fqName,
+        const std::set<FQName> &importedPackages,
         const char *typeName) {
     out << "\n"
         << "\n#"
@@ -190,11 +213,9 @@
     out.indent();
     out.indent();
     out << "\n$(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \\"
-        << "\n-Ljava \\"
-        << "\n-r"
-        << coordinator->getPackageRootOption(packageFQName) << " \\"
-        << "\n-r"
-        << coordinator->getPackageRootOption(gIBasePackageFqName) << " \\\n";
+        << "\n-Ljava \\\n";
+
+    generatePackagePathsSection(out, coordinator, packageFQName, importedPackages, true /* forJava */);
 
     out << packageFQName.string()
         << "::"
@@ -219,6 +240,7 @@
         Coordinator *coordinator,
         const FQName &packageFQName,
         const std::vector<FQName> &packageInterfaces,
+        const std::set<FQName> &importedPackages,
         AST *typesAST) {
     for (const auto &fqName : packageInterfaces) {
         if (fqName.name() == "types") {
@@ -244,6 +266,7 @@
                         coordinator,
                         packageFQName,
                         fqName,
+                        importedPackages,
                         type->localName().c_str());
             }
 
@@ -255,6 +278,7 @@
                 coordinator,
                 packageFQName,
                 fqName,
+                importedPackages,
                 nullptr /* typeName */);
     }
 }
@@ -350,7 +374,8 @@
         Formatter &out,
         Coordinator *coordinator,
         const FQName &packageFQName,
-        const std::vector<FQName> &packageInterfaces) {
+        const std::vector<FQName> &packageInterfaces,
+        const std::set<FQName> &importedPackages) {
     out << "\n#"
         << "\nGEN := $(intermediates)/"
         << coordinator->convertPackageRootToPath(packageFQName)
@@ -367,11 +392,9 @@
     out.indent();
     out.indent();
     out << "\n$(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \\"
-        << "\n-Ljava-constants \\"
-        << "\n-r"
-        << coordinator->getPackageRootOption(packageFQName) << " \\"
-        << "\n-r"
-        << coordinator->getPackageRootOption(gIBasePackageFqName) << " \\\n";
+        << "\n-Ljava-constants \\\n";
+
+    generatePackagePathsSection(out, coordinator, packageFQName, importedPackages, true /* forJava */);
 
     out << packageFQName.string();
     out << "\n";
@@ -518,6 +541,7 @@
                 coordinator,
                 packageFQName,
                 packageInterfaces,
+                importedPackages,
                 typesAST);
 
         out << "\ninclude $(BUILD_"
@@ -541,7 +565,7 @@
             << "$(HOST_EXECUTABLE_SUFFIX)";
 
         generateMakefileSectionForJavaConstants(
-                out, coordinator, packageFQName, packageInterfaces);
+                out, coordinator, packageFQName, packageInterfaces, importedPackages);
 
         out << "\n# Avoid dependency cycle of framework.jar -> this-library "
             << "-> framework.jar\n"
@@ -585,6 +609,7 @@
         const std::string &genName,
         const char *language,
         const std::vector<FQName> &packageInterfaces,
+        const std::set<FQName> &importedPackages,
         const std::function<void(Formatter&, const FQName)> outputFn) {
 
     out << "genrule {\n";
@@ -593,12 +618,11 @@
         << "tools: [\"" << hidl_gen << "\"],\n";
 
     out << "cmd: \"$(location " << hidl_gen << ") -o $(genDir)"
-        << " -L" << language
-        << " -r"
-        << coordinator->getPackageRootOption(packageFQName)
-        << " -r"
-        << coordinator->getPackageRootOption(gIBasePackageFqName)
-        << " " << packageFQName.string() << "\",\n";
+        << " -L" << language << " ";
+
+    generatePackagePathsSection(out, coordinator, packageFQName, importedPackages);
+
+    out << packageFQName.string() << "\",\n";
 
     out << "srcs: [\n";
     out.indent();
@@ -631,6 +655,7 @@
         const std::string &genName,
         const char *language,
         const std::vector<FQName> &packageInterfaces,
+        const std::set<FQName> &importedPackages,
         const std::function<void(Formatter&, const FQName)> outputFn) {
     out << "genrule {\n";
     out.indent();
@@ -647,12 +672,11 @@
     }
 
     out << "cmd: \"$(location " << hidl_gen << ") -o $(genDir)"
-        << " -L" << language
-        << " -r"
-        << coordinator->getPackageRootOption(packageFQName)
-        << " -r"
-        << coordinator->getPackageRootOption(gIBasePackageFqName)
-        << " " << packageFQName.string()
+        << " -L" << language << " ";
+
+    generatePackagePathsSection(out, coordinator, packageFQName, importedPackages);
+
+    out << packageFQName.string()
         << " && $(location vtsc) -m" << vtsc_mode << " -t"  << vtsc_type
         << " -b$(genDir) " << package_dir_path
         << " $(genDir)/" << package_dir_path
@@ -708,6 +732,7 @@
             genSourceName,
             "vts",
             packageInterfaces,
+            importedPackages,
             [&pathPrefix](Formatter &out, const FQName &fqName) {
                 if (fqName.name() == "types") {
                     out << "\"" << pathPrefix << "types.vts.cpp\",\n";
@@ -728,6 +753,7 @@
             genHeaderName,
             "vts",
             packageInterfaces,
+            importedPackages,
             [&pathPrefix](Formatter &out, const FQName &fqName) {
                 if (fqName.name() == "types") {
                     out << "\"" << pathPrefix << "types.vts.h\",\n";
@@ -933,6 +959,7 @@
             genSourceName,
             "c++",
             packageInterfaces,
+            importedPackages,
             [&pathPrefix](Formatter &out, const FQName &fqName) {
                 if (fqName.name() == "types") {
                     out << "\"" << pathPrefix << "types.cpp\",\n";
@@ -950,6 +977,7 @@
             genHeaderName,
             "c++",
             packageInterfaces,
+            importedPackages,
             [&pathPrefix](Formatter &out, const FQName &fqName) {
                 out << "\"" << pathPrefix << fqName.name() << ".h\",\n";
                 if (fqName.name() != "types") {