Make linkerconfig support host am: a3d5d09fda
am: 0bfd139c94

Change-Id: I22127c801d4391640fc7117969fbdee578a5eaef
diff --git a/Android.bp b/Android.bp
index bcd5d47..3e62e89 100644
--- a/Android.bp
+++ b/Android.bp
@@ -25,6 +25,7 @@
         "libbase",
         "liblog",
     ],
+    host_supported: true,
 }
 
 cc_defaults {
diff --git a/generator/include/linkerconfig/variableloader.h b/generator/include/linkerconfig/variableloader.h
index 9807b29..b15c5a0 100644
--- a/generator/include/linkerconfig/variableloader.h
+++ b/generator/include/linkerconfig/variableloader.h
@@ -16,11 +16,13 @@
 
 #pragma once
 
+#include <string>
+
 namespace android {
 namespace linkerconfig {
 namespace generator {
 
-void LoadVariables();
+void LoadVariables(const std::string& root);
 
 }  // namespace generator
 }  // namespace linkerconfig
diff --git a/generator/variableloader.cc b/generator/variableloader.cc
index a2b6e0f..4e649d0 100644
--- a/generator/variableloader.cc
+++ b/generator/variableloader.cc
@@ -61,21 +61,22 @@
   }
 }
 
-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 @@
 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
--- a/main.cc
+++ b/main.cc
@@ -23,31 +23,49 @@
 #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 @@
   return android::linkerconfig::contents::CreateBaseConfiguration();
 }
 
+#ifdef __ANDROID__
 struct CombinedLogger {
   android::base::LogdLogger logd;
 
@@ -83,11 +102,17 @@
     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 @@
     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;