diff options
author | Devin Moore <devinmoore@google.com> | 2020-09-21 11:45:16 -0700 |
---|---|---|
committer | Devin Moore <devinmoore@google.com> | 2020-10-13 16:54:56 -0700 |
commit | 68f6dce712a3de9d9babbafbce25e4cb33a34ec0 (patch) | |
tree | 055cd031a6c24beba600956e2ea7daeb56423a82 /hidl2aidl/main.cpp | |
parent | 8cfd59bd29f7c9f45af13d8fae767b81a01abdae (diff) | |
download | hidl-68f6dce712a3de9d9babbafbce25e4cb33a34ec0.tar.gz |
hidl2aidl: emit ndk source files to translate types
While converting an interface from HIDL to AIDL, we will now generate
source/header files for translating between the types.
This initial CL adds support for the NDK backend, translating from the
HIDL types to AIDL types.
Only basic types are supported right now. Vectors/arrays are not
currently handled.
Test: atest hidl2aidl_translate_test && ./run_build_file_test.sh
Bug: 158489355
Change-Id: I6005fa0fbb0d831818e0c6aeb8c417e2c232b8a0
Diffstat (limited to 'hidl2aidl/main.cpp')
-rw-r--r-- | hidl2aidl/main.cpp | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/hidl2aidl/main.cpp b/hidl2aidl/main.cpp index 49ac2e6f..5fc2c87e 100644 --- a/hidl2aidl/main.cpp +++ b/hidl2aidl/main.cpp @@ -167,15 +167,13 @@ static void getSubTypes(const NamedType& namedType, std::set<const NamedType*>* } } -static void emitBuildFile(Formatter out, const FQName& fqName) { - std::string aidlPackage = AidlHelper::getAidlPackage(fqName); - +static void emitBuildFile(Formatter& out, const FQName& fqName, std::vector<FQName>& targets) { out << "// This is the expected build file, but it may not be right in all cases\n"; out << "\n"; out << "aidl_interface {\n"; - out << " name: \"" << aidlPackage << "\",\n"; + out << " name: \"" << AidlHelper::getAidlPackage(fqName) << "\",\n"; out << " vendor_available: true,\n"; - out << " srcs: [\"" << base::Join(base::Split(aidlPackage, "."), "/") << "/*.aidl\"],\n"; + out << " srcs: [\"" << AidlHelper::getAidlPackagePath(fqName) << "/*.aidl\"],\n"; out << " stability: \"vintf\",\n"; out << " backend: {\n"; out << " cpp: {\n"; @@ -192,6 +190,26 @@ static void emitBuildFile(Formatter out, const FQName& fqName) { out << " },\n"; out << " },\n"; out << " },\n"; + out << "}\n\n"; + + // TODO(b/158489355) Handle different languages. + out << "cc_library {\n"; + out << " name: \"" << AidlHelper::getAidlPackage(fqName) << "-translate-ndk\",\n"; + out << " vendor_available: true,\n"; + out << " srcs: [\"" << AidlHelper::getAidlPackagePath(fqName) << "/translate-ndk.cpp\"],\n"; + out << " shared_libs: [\n"; + out << " \"libbinder_ndk\",\n"; + out << " \"libhidlbase\",\n"; + out << " \"" << AidlHelper::getAidlPackage(fqName) << "-ndk_platform\",\n"; + std::set<std::string> uniquePackages; + for (const auto& target : targets) { + uniquePackages.insert(target.getPackageAndVersion().string()); + } + for (const auto& package : uniquePackages) { + out << " \"" << package << "\",\n"; + } + out << " ],\n"; + out << " export_include_dirs: [\"include\"],\n"; out << "}\n"; } @@ -311,13 +329,22 @@ int main(int argc, char** argv) { // Set up AIDL conversion log Formatter err = coordinator.getFormatter(fqName, Coordinator::Location::DIRECT, "conversion.log"); - std::string aidlPackage = AidlHelper::getAidlPackage(fqName); - err << "Notes relating to hidl2aidl conversion of " << fqName.string() << " to " << aidlPackage - << " (if any) follow:\n"; + err << "Notes relating to hidl2aidl conversion of " << fqName.string() << " to " + << AidlHelper::getAidlPackage(fqName) << " (if any) follow:\n"; AidlHelper::setNotes(&err); - emitBuildFile(coordinator.getFormatter(fqName, Coordinator::Location::DIRECT, "Android.bp"), - fqName); + Formatter translateSource = + coordinator.getFormatter(fqName, Coordinator::Location::DIRECT, + AidlHelper::getAidlPackagePath(fqName) + "/translate-ndk.cpp"); + AidlHelper::setTranslateSource(&translateSource); + + Formatter translateHeader = coordinator.getFormatter( + fqName, Coordinator::Location::DIRECT, + "include/" + AidlHelper::getAidlPackagePath(fqName) + "/translate-ndk.h"); + AidlHelper::setTranslateHeader(&translateHeader); + Formatter buildFile = + coordinator.getFormatter(fqName, Coordinator::Location::DIRECT, "Android.bp"); + emitBuildFile(buildFile, fqName, targets); // Gather all the types and interfaces std::set<const NamedType*> namedTypesInPackage; @@ -358,12 +385,14 @@ int main(int argc, char** argv) { if (namedType->isCompoundType()) { ProcessedCompoundType processed; AidlHelper::processCompoundType(static_cast<const CompoundType&>(*namedType), - &processed); + &processed, std::string()); processedTypesInPackage.insert( std::pair<const NamedType*, const ProcessedCompoundType>(namedType, processed)); } } + AidlHelper::emitH2aTranslation(namedTypesInPackage, processedTypesInPackage); + // Emit all types and interfaces // The interfaces and types are still be further manipulated inside // emitAidl. The interfaces are consolidating methods from their typechains |