From 8de0b0d7fd53b7a4e25fbcd9b7e529c20fc3ef63 Mon Sep 17 00:00:00 2001
From: ak <ak@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Mon, 1 Sep 2014 16:41:17 +0000
Subject: Add -B support to gcc-ar/ranlib/nm

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.

gcc/:

2014-09-01  Andi Kleen  <ak@linux.intel.com>

	* file-find.c (add_prefix_begin): Add.
	(do_add_prefix): Rename from add_prefix with first argument.
	(add_prefix): Add new wrapper.
	* file-find.h (add_prefix_begin): Add.
	* gcc-ar.c (main): Support -B option.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@214800 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/gcc-ar.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

(limited to 'gcc/gcc-ar.c')

diff --git a/gcc/gcc-ar.c b/gcc/gcc-ar.c
index aebaa92bf1d..fdff89c643f 100644
--- a/gcc/gcc-ar.c
+++ b/gcc/gcc-ar.c
@@ -132,9 +132,52 @@ 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;
+	  size_t len;
+
+	  memmove (av + i, av + i + 1, sizeof (char *) * ((ac + 1) - i));
+	  ac--;
+	  if (*arg == 0)
+	    {
+	      arg = av[i];
+	      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++;
+	    }
+	  /* else it's a joined argument  */
+
+	  len = strlen (arg);
+	  if (len > 0)
+		  len--;
+	  end = arg + len;
+
+	  /* Always add a dir separator for the prefix list.  */
+	  if (end > arg && !IS_DIR_SEPARATOR (*end))
+	    {
+	      static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
+	      arg = concat (arg, dir_separator_str, NULL);
+	    }
+
+	  add_prefix_begin (&path, arg);
+	  add_prefix_begin (&target_path, arg);
+	  break;
+	}
+
+
   /* Find the GCC LTO plugin */
   plugin = find_a_file (&target_path, LTOPLUGINSONAME, R_OK);
   if (!plugin)
-- 
cgit v1.2.1