public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Keith Packard <keithp@keithp.com>
To: gcc-patches@gcc.gnu.org
Subject: [PATCH] driver: Extend 'getenv' function to allow default value
Date: Fri, 26 Aug 2022 22:14:22 -0700	[thread overview]
Message-ID: <20220827051422.1023580-1-keithp@keithp.com> (raw)
Message-ID: <20220827051422.yPS3fr4cNOisSbRAMVhPd4k9hTSHBuzq5u9qXZAdb8I@z> (raw)

Right now, a missing environment variable provided to the 'getenv'
function in a .specs file causes a fatal error. That makes writing a
spec file that uses the GCC_EXEC_PREFIX value difficult as that
variable is only set when the driver has been relocated, but not when
run from the defined location. This makes building a relocatable
toolchain difficult to extend to other ancilary pieces which use specs
files to locate header and library files adjacent to the toolchain.

This patch adds an optional third argument to the getenv function that
can be used to fall back to the standard installation path when the
driver hasn't set GCC_EXEC_PREFIX in the environment.

For example, if an alternate C library is installed in
${prefix}/extra, then this change allows the specs file to locate that
relative to the gcc directory, if gcc is located in the original
installation directory (which would leave GCC_EXEC_PREFIX unset), or
if the gcc tree has been moved to a different location (where gcc
would set GCC_EXEC_PREFIX itself):

*cpp:
-isystem %:getenv(GCC_EXEC_PREFIX ../../extra/include ${prefix}/extra/include)

I considered changing the behavior of either the %R sequence so that
it had a defined behavior when there was no sysroot defined, or making
the driver always set the GCC_EXEC_PREFIX environment variable and
decided that the approach of adding functionality to getenv where it
was previously invalid would cause the least potential for affecting
existing usage.

Signed-off-by: Keith Packard <keithp@keithp.com>
---
 gcc/doc/invoke.texi | 18 +++++++++++-------
 gcc/gcc.cc          | 10 +++++++++-
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 6131bfa7acf..669c28a609a 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -34223,17 +34223,21 @@ The following built-in spec functions are provided:
 
 @table @code
 @item @code{getenv}
-The @code{getenv} spec function takes two arguments: an environment
-variable name and a string.  If the environment variable is not
-defined, a fatal error is issued.  Otherwise, the return value is the
-value of the environment variable concatenated with the string.  For
-example, if @env{TOPDIR} is defined as @file{/path/to/top}, then:
+
+The @code{getenv} spec function takes two or three arguments: an
+environment variable name, a string and an optional default value.  If
+the environment variable is not defined and a default value is
+provided, that is used as the return value; otherwise a fatal error is
+issued.  Otherwise, the return value is the value of the environment
+variable concatenated with the string.  For example, if @env{TOPDIR}
+is defined as @file{/path/to/top}, then:
 
 @smallexample
-%:getenv(TOPDIR /include)
+%:getenv(TOPDIR /include /path/to/default/include)
 @end smallexample
 
-expands to @file{/path/to/top/include}.
+expands to @file{/path/to/top/include}. If @env{TOPDIR} is not
+defined, then this expands to @file{/path/to/default/include}.
 
 @item @code{if-exists}
 The @code{if-exists} spec function takes one argument, an absolute
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index b6d562a92f0..16295702db7 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -10169,12 +10169,20 @@ getenv_spec_function (int argc, const char **argv)
   char *ptr;
   size_t len;
 
-  if (argc != 2)
+  if (argc != 2 && argc != 3)
     return NULL;
 
   varname = argv[0];
   value = env.get (varname);
 
+  if (!value && argc == 3)
+    {
+      value = argv[2];
+      result = XNEWVAR(char, strlen(value) + 1);
+      strcpy(result, value);
+      return result;
+    }
+
   /* If the variable isn't defined and this is allowed, craft our expected
      return value.  Assume variable names used in specs strings don't contain
      any active spec character so don't need escaping.  */
-- 
2.36.1


             reply	other threads:[~2022-08-27  5:14 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-27  5:14 Keith Packard [this message]
2022-08-27  5:14 ` Keith Packard
2022-09-23 18:40 ` Making gcc toolchain installs relocatable Keith Packard
2022-11-20 18:34   ` Jeff Law

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220827051422.1023580-1-keithp@keithp.com \
    --to=keithp@keithp.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).