Build linker configuration for recovery in build time am: 722dad6819 am: 4b76d66377

Change-Id: Ia74cfb235d6fca9be0fdd31863f40ca2d8c51ca5
diff --git a/Android.bp b/Android.bp
index 89b4d3b..fdf386f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -146,5 +146,19 @@
         "linkerconfig_modules",
         "linkerconfig_contents",
     ],
-    host_supported: true,
+}
+
+prebuilt_etc {
+    name: "ld.config.recovery.txt",
+    recovery: true,
+    filename: "ld.config.txt",
+    src: ":generate_recovery_linker_config",
+}
+
+genrule {
+    name: "generate_recovery_linker_config",
+    recovery: true,
+    out: ["ld.config.recovery.txt"],
+    tools: ["linkerconfig"],
+    cmd: "$(location linkerconfig) --recovery --target $(out)",
 }
diff --git a/main.cc b/main.cc
index 28aabfa..6c799c5 100644
--- a/main.cc
+++ b/main.cc
@@ -35,6 +35,7 @@
 #ifndef __ANDROID__
     {"root", required_argument, 0, 'r'},
     {"vndk", required_argument, 0, 'v'},
+    {"recovery", no_argument, 0, 'y'},
 #endif
     {"help", no_argument, 0, 'h'},
     {0, 0, 0, 0}};
@@ -43,6 +44,7 @@
   std::string target_file;
   std::string root;
   std::string vndk_version;
+  bool is_recovery;
 };
 
 [[noreturn]] void PrintUsage(int status = EXIT_SUCCESS) {
@@ -50,6 +52,7 @@
 #ifndef __ANDROID__
                " --root <root dir>"
                " --vndk <vndk version>"
+               " --recovery"
 #endif
                " [--recovery]"
                " [--help]"
@@ -60,7 +63,7 @@
 bool ParseArgs(int argc, char* argv[], ProgramArgs* args) {
   int parse_result;
   while ((parse_result = getopt_long(
-              argc, argv, "t:r:v:h", program_options, NULL)) != -1) {
+              argc, argv, "t:r:v:hy", program_options, NULL)) != -1) {
     switch (parse_result) {
       case 't':
         args->target_file = optarg;
@@ -71,6 +74,9 @@
       case 'v':
         args->vndk_version = optarg;
         break;
+      case 'y':
+        args->is_recovery = true;
+        break;
       case 'h':
         PrintUsage();
       default:
@@ -85,11 +91,22 @@
   return true;
 }
 
-android::linkerconfig::modules::Configuration GetConfiguration() {
-  if (android::linkerconfig::modules::IsRecoveryMode()) {
+android::linkerconfig::modules::Configuration GetConfiguration(ProgramArgs args) {
+  // Recovery mode does not require environmental variables.
+  if (args.is_recovery || android::linkerconfig::modules::IsRecoveryMode()) {
     return android::linkerconfig::contents::CreateRecoveryConfiguration();
   }
 
+#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);
+
   if (android::linkerconfig::modules::IsLegacyDevice()) {
     return android::linkerconfig::contents::CreateLegacyConfiguration();
   }
@@ -121,7 +138,7 @@
 #endif
   );
 
-  ProgramArgs args;
+  ProgramArgs args = {.is_recovery = false};
 
   if (!ParseArgs(argc, argv, &args)) {
     PrintUsage(EXIT_FAILURE);
@@ -139,16 +156,7 @@
     out = &file_out;
   }
 
-#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();
+  auto config = GetConfiguration(args);
   android::linkerconfig::modules::ConfigWriter config_writer;
 
   config.WriteConfig(config_writer);