From: Andi Kleen <a...@linux.intel.com>

To use gcc-{ar,ranlib} for boot strap we need to add a -B option
to the tool. Since ar has weird and unusual argument conventions
implement the code by hand instead of using any libraries.

v2: Fix typo

gcc/:

2014-08-04  Andi Kleen  <a...@linux.intel.com>

        * gcc-ar.c (main): Support -B option.
---
 gcc/gcc-ar.c | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/gcc/gcc-ar.c b/gcc/gcc-ar.c
index aebaa92..70bf222 100644
--- a/gcc/gcc-ar.c
+++ b/gcc/gcc-ar.c
@@ -132,9 +132,50 @@ main (int ac, char **av)
   const char **nargv;
   bool is_ar = !strcmp (PERSONALITY, "ar");
   int exit_code = FATAL_EXIT_CODE;
+  int i;
 
   setup_prefixes (av[0]);
 
+  /* Not using getopt for now.  */
+  for (i = 0; i < ac; i++)
+      if (!strncmp (av[i], "-B", 2))
+       {
+         const char *arg = av[i] + 2;
+         const char *end;
+
+         memmove (av + i, av + i + 1, sizeof (char *) * ((ac + 1) - i));
+         ac--;
+         if (*arg == 0)
+           {
+             arg = av[i + 1];
+             if (!arg)
+               {
+                 fprintf (stderr, "Usage: gcc-ar [-B prefix] ar arguments 
...\n");
+                 exit (EXIT_FAILURE);
+               }
+             memmove (av + i, av + i + 1, sizeof (char *) * ((ac + 1) - i));
+             ac--;
+             i++;
+           }
+
+         for (end = arg; *end; end++)
+           ;
+         end--;
+         if (end > arg && *end != '/')
+           {
+             char *newarg = (char *)xmalloc (strlen(arg) + 2);
+
+             strcpy (newarg, arg);
+             strcat (newarg, "/");
+             arg = newarg;
+           }
+
+         add_prefix (&path, arg);
+         add_prefix (&target_path, arg);
+         break;
+       }
+
+
   /* Find the GCC LTO plugin */
   plugin = find_a_file (&target_path, LTOPLUGINSONAME, R_OK);
   if (!plugin)
-- 
2.0.1

Reply via email to