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") {