OSDN Git Service

* gcc.c (static_spec_functions): Add if-exists-else spec
authorthorpej <thorpej@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Nov 2002 00:31:31 +0000 (00:31 +0000)
committerthorpej <thorpej@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Nov 2002 00:31:31 +0000 (00:31 +0000)
function.
(if_exists_else_spec_function): New function.
* doc/invoke.texi: Document the if-exists-else spec function.

* config/netbsd-elf.h (NETBSD_STARTFILE_SPEC): For -static, use
"%:if-exists-else(crtbeginT%O%s crtbegin%O%s)".

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59480 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/config/netbsd-elf.h
gcc/doc/invoke.texi
gcc/gcc.c

index 4846ba6..cb38b93 100644 (file)
@@ -53,7 +53,9 @@ Boston, MA 02111-1307, USA.  */
        %{p:gcrt0%O%s}          \
        %{!p:crt0%O%s}}}                \
    %:if-exists(crti%O%s)       \
-   %{!shared:crtbegin%O%s} %{shared:crtbeginS%O%s}"
+   %{static:%:if-exists-else(crtbeginT%O%s crtbegin%O%s)} \
+   %{!static: \
+     %{!shared:crtbegin%O%s} %{shared:crtbeginS%O%s}}"
 
 #undef STARTFILE_SPEC
 #define STARTFILE_SPEC NETBSD_STARTFILE_SPEC
index 36ca755..79579b9 100644 (file)
@@ -4986,7 +4986,20 @@ pathname.  Here is a small example of its usage:
 *startfile:
 crt0%O%s %:if-exists(crti%O%s) crtbegin%O%s
 @end smallexample
-@end table
+
+@item @code{if-exists-else}
+The @code{if-exists-else} spec function is similar to the @code{if-exists}
+spec function, except that it takes two arguments.  The first argument is
+an absolute pathname to a file.  If the file exists, @code{if-exists-else}
+returns the pathname.  If it does not exist, it returns the second argument.
+This way, @code{if-exists-else} can be used to select one file or another,
+based on the existence of the first.  Here is a small example of its usage:
+
+@smallexample 
+*startfile:
+crt0%O%s %:if-exists(crti%O%s) %:if-exists-else(crtbeginT%O%s crtbegin%O%s)
+@end smallexample
+@end table 
 
 @item %@{@code{S}@}
 Substitutes the @code{-S} switch, if that switch was given to GCC@.
index a193437..d7ec126 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -328,6 +328,7 @@ static const char *convert_filename PARAMS ((const char *, int, int));
 #endif
 
 static const char *if_exists_spec_function PARAMS ((int, const char **));
+static const char *if_exists_else_spec_function PARAMS ((int, const char **));
 \f
 /* The Specs Language
 
@@ -1451,6 +1452,7 @@ static struct spec_list *specs = (struct spec_list *) 0;
 static const struct spec_function static_spec_functions[] =
 {
   { "if-exists",               if_exists_spec_function },
+  { "if-exists-else",          if_exists_else_spec_function },
   { 0, 0 }
 };
 
@@ -7264,3 +7266,23 @@ if_exists_spec_function (argc, argv)
 
   return NULL;
 }
+
+/* if-exists-else built-in spec function.
+
+   This is like if-exists, but takes an additional argument which
+   is returned if the first argument does not exist.  */
+
+static const char *
+if_exists_else_spec_function (argc, argv)
+     int argc;
+     const char **argv;
+{
+  /* Must have exactly two arguments.  */
+  if (argc != 2)
+    return NULL;
+
+  if (IS_ABSOLUTE_PATHNAME (argv[0]) && ! access (argv[0], R_OK))
+    return argv[0];
+
+  return argv[1];
+}