OSDN Git Service

Make linkerconfig support host
authorJooyung Han <jooyung@google.com>
Thu, 26 Sep 2019 14:23:50 +0000 (23:23 +0900)
committerJooyung Han <jooyung@google.com>
Thu, 26 Sep 2019 23:06:07 +0000 (08:06 +0900)
By supplying two additional args for host running
--root <root dir>
--vndk <vndk version>
one can run linkerconfig and see the resulting ld.config.txt

Some input files are found under <root>/system/etc with <vndk version>.
For example, out/target/vsoc_x86/system/etc/llndk.libraries.29.txt

Bug: 141660636
Test: m linkerconfig
Test: linkerconfig --root $OUT --vndk 29
Change-Id: I4aeab731a17764d7aa7e508842eae620f55f781e

Android.bp
generator/include/linkerconfig/variableloader.h
generator/variableloader.cc
main.cc

index bcd5d47..3e62e89 100644 (file)
@@ -25,6 +25,7 @@ cc_defaults {
         "libbase",
         "liblog",
     ],
+    host_supported: true,
 }
 
 cc_defaults {
index 9807b29..b15c5a0 100644 (file)
 
 #pragma once
 
+#include <string>
+
 namespace android {
 namespace linkerconfig {
 namespace generator {
 
-void LoadVariables();
+void LoadVariables(const std::string& root);
 
 }  // namespace generator
 }  // namespace linkerconfig
index a2b6e0f..4e649d0 100644 (file)
@@ -61,21 +61,22 @@ void LoadVariableFromPartitionPath(std::string variable_name, std::string path)
   }
 }
 
-void LoadPartitionPathVariables() {
-  LoadVariableFromPartitionPath("PRODUCT", "/product");
-  LoadVariableFromPartitionPath("SYSTEM_EXT", "/system_ext");
+void LoadPartitionPathVariables(const std::string& root) {
+  // TODO(b/141714913): generalize path handling
+  LoadVariableFromPartitionPath("PRODUCT", root + "/product");
+  LoadVariableFromPartitionPath("SYSTEM_EXT", root + "/system_ext");
 }
 
-void LoadLibraryListVariables() {
-  auto private_library_path =
-      "/system/etc/vndkprivate.libraries." + GetVendorVndkVersion() + ".txt";
+void LoadLibraryListVariables(const std::string& root) {
+  auto private_library_path = root + "/system/etc/vndkprivate.libraries." +
+                              GetVendorVndkVersion() + ".txt";
   auto llndk_library_path =
-      "/system/etc/llndk.libraries." + GetVendorVndkVersion() + ".txt";
+      root + "/system/etc/llndk.libraries." + GetVendorVndkVersion() + ".txt";
   auto vndksp_library_path =
-      "/system/etc/vndksp.libraries." + GetVendorVndkVersion() + ".txt";
-  auto vndkcore_library_path =
-      "/system/etc/vndkcore.libraries." + GetVendorVndkVersion() + ".txt";
-  auto sanitizer_library_path = "/system/etc/sanitizer.libraries.txt";
+      root + "/system/etc/vndksp.libraries." + GetVendorVndkVersion() + ".txt";
+  auto vndkcore_library_path = root + "/system/etc/vndkcore.libraries." +
+                               GetVendorVndkVersion() + ".txt";
+  auto sanitizer_library_path = root + "/system/etc/sanitizer.libraries.txt";
 
   Variables::AddValue(
       "LLNDK_LIBRARIES",
@@ -101,11 +102,13 @@ void LoadLibraryListVariables() {
 namespace android {
 namespace linkerconfig {
 namespace generator {
-void LoadVariables() {
+
+void LoadVariables(const std::string& root) {
   LoadVndkVersionVariable();
-  LoadPartitionPathVariables();
-  LoadLibraryListVariables();
+  LoadPartitionPathVariables(root);
+  LoadLibraryListVariables(root);
 }
+
 }  // namespace generator
 }  // namespace linkerconfig
-}  // namespace android
\ No newline at end of file
+}  // namespace android
diff --git a/main.cc b/main.cc
index 5362175..a7dc090 100644 (file)
--- a/main.cc
+++ b/main.cc
 #include "linkerconfig/baseconfig.h"
 #include "linkerconfig/log.h"
 #include "linkerconfig/variableloader.h"
+#include "linkerconfig/variables.h"
 
 namespace {
 const static struct option program_options[] = {
     {"target", required_argument, 0, 't'},
+#ifndef __ANROID__
+    {"root", required_argument, 0, 'r'},
+    {"vndk", required_argument, 0, 'v'},
+#endif
     {"help", no_argument, 0, 'h'},
     {0, 0, 0, 0}};
 
 struct ProgramArgs {
   std::string target_file;
+  std::string root;
+  std::string vndk_version;
 };
 
 [[noreturn]] void PrintUsage(int status = EXIT_SUCCESS) {
-  std::cerr << "Usage : linkerconfig [--target <target_file>] [--help]"
+  std::cerr << "Usage : linkerconfig [--target <target_file>]"
+#ifndef __ANDROID__
+               " --root <root dir>"
+               " --vndk <vndk version>"
+#endif
+               " [--help]"
             << std::endl;
   exit(status);
 }
 
 bool ParseArgs(int argc, char* argv[], ProgramArgs* args) {
   int parse_result;
-  while ((parse_result =
-              getopt_long(argc, argv, "th:", program_options, NULL)) != -1) {
+  while ((parse_result = getopt_long(
+              argc, argv, "t:r:v:h", program_options, NULL)) != -1) {
     switch (parse_result) {
       case 't':
         args->target_file = optarg;
         break;
+      case 'r':
+        args->root = optarg;
+        break;
+      case 'v':
+        args->vndk_version = optarg;
+        break;
       case 'h':
         PrintUsage();
       default:
@@ -73,6 +91,7 @@ android::linkerconfig::modules::Configuration GetConfiguration() {
   return android::linkerconfig::contents::CreateBaseConfiguration();
 }
 
+#ifdef __ANDROID__
 struct CombinedLogger {
   android::base::LogdLogger logd;
 
@@ -83,11 +102,17 @@ struct CombinedLogger {
     KernelLogger(id, severity, tag, file, line, message);
   }
 };
+#endif
 
 }  // namespace
 
 int main(int argc, char* argv[]) {
-  android::base::InitLogging(argv, CombinedLogger());
+  android::base::InitLogging(argv
+#ifdef __ANDROID__
+                             ,
+                             CombinedLogger()
+#endif
+  );
 
   ProgramArgs args;
 
@@ -107,7 +132,15 @@ int main(int argc, char* argv[]) {
     out = &file_out;
   }
 
-  android::linkerconfig::generator::LoadVariables();
+#ifndef __ANDROID__
+  if (args.root == "" || args.vndk_version == "") {
+    PrintUsage();
+  }
+  android::linkerconfig::modules::Variables::AddValue("ro.vndk.version",
+                                                      args.vndk_version);
+#endif
+
+  android::linkerconfig::generator::LoadVariables(args.root);
   auto config = GetConfiguration();
   android::linkerconfig::modules::ConfigWriter config_writer;