summaryrefslogtreecommitdiff
path: root/function.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>1996-05-09 18:02:06 +0000
committerRoland McGrath <roland@redhat.com>1996-05-09 18:02:06 +0000
commite99a3aca7ec9796973a7e4d93676c5c13483a948 (patch)
tree7f890ef18c4ef6a0b5eac55013b70b7dea4a3a58 /function.c
parent73c52a3b125b08bb1f86230c4c1238e6f441c148 (diff)
downloadgunmake-e99a3aca7ec9796973a7e4d93676c5c13483a948.tar.gz
Thu May 9 13:54:49 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* GNUmakefile (globfiles): Add AmigaDOS support files. (distfiles): Add $(amigafiles). (amigafiles): New variable. Thu Nov 7 10:18:16 1995 Aaron Digulla <digulla@fh-konstanz.de> * Added Amiga support in commands.c, dir.c, function.c, job.c, main.c, make.h, read.c, remake.c * commands.c: Amiga has neither SIGHUP nor SIGQUIT * dir.c: Amiga has filenames with Upper- and Lowercase, but "FileName" is the same as "filename". Added strieq() which is use to compare filenames. This is like streq() on all other systems. Also there is no such thing as "." under AmigaDOS. * function.c: On Amiga, the environment is not passed as envp, there are no pipes and Amiga can't fork. Use my own function to create a new child. * job.c: default_shell is "" (The system automatically chooses a shell for me). Have to use the same workaround as MSDOS for running batch commands. Added HAVE_SYS_PARAM_H. NOFILE isn't known on Amiga. Cloned code to run children from MSDOS. Own version of sh_chars[] and sh_cmds[]. No dup2() or dup() on Amiga. * main.c: Force stack to 20000 bytes. Read environment from ENV: device. On Amiga, exec_command() does return, so I exit() afterwards. * make.h: Added strieq() to compare filenames. * read.c: Amiga needs special extension to have passwd. Only one include-dir. "Makefile" and "makefile" are the same. Added "SMakefile". Added special code to handle device names (xxx:) and "./" in rules. * remake.c: Only one lib-dir. Amiga link-libs are named "%s.lib" instead of "lib%s.a". * main.c, rule.c, variable.c: Avoid floats at all costs. * vpath.c: Get rid of as many alloca()s as possible.
Diffstat (limited to 'function.c')
-rw-r--r--function.c87
1 files changed, 83 insertions, 4 deletions
diff --git a/function.c b/function.c
index 1886f75..9794872 100644
--- a/function.c
+++ b/function.c
@@ -1,5 +1,5 @@
/* Variable function expansion for GNU Make.
-Copyright (C) 1988, 89, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
+Copyright (C) 1988, 89, 91, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify
@@ -356,6 +356,7 @@ expand_function (o, function, text, end)
if (argv == 0)
break;
+#ifndef _AMIGA
/* Using a target environment for `shell' loses in cases like:
export var = $(shell echo foobie)
because target_environment hits a loop trying to expand $(var)
@@ -368,6 +369,7 @@ expand_function (o, function, text, end)
/* Construct the environment. */
envp = target_environment ((struct file *) 0);
#endif
+#endif /* Not Amiga. */
/* For error messages. */
if (reading_filename != 0)
@@ -379,7 +381,7 @@ expand_function (o, function, text, end)
else
error_prefix = "";
-#ifndef __MSDOS__
+#if !defined(__MSDOS__) && !defined(_AMIGA)
if (pipe (pipedes) < 0)
{
perror_with_name (error_prefix, "pipe");
@@ -484,7 +486,8 @@ expand_function (o, function, text, end)
free (buffer);
}
-#else /* MSDOS. */
+#else /* MSDOS or Amiga */
+#ifndef _AMIGA
{
/* MS-DOS can't do fork, but it can do spawn. However, this
means that we don't have an opportunity to reopen stdout to
@@ -546,7 +549,83 @@ expand_function (o, function, text, end)
}
free (buffer);
}
-#endif /* Not MSDOS. */
+#else /* Amiga */
+ {
+ /* Amiga can't fork nor spawn, but I can start a program with
+ redirection of my choice. The rest is the same as above. */
+#include <dos/dos.h>
+#include <proto/dos.h>
+
+ BPTR child_stdout;
+ char tmp_output[FILENAME_MAX];
+ unsigned int maxlen = 200;
+ int cc;
+ char * buffer, * ptr;
+ char ** aptr;
+ int len = 0;
+
+ strcpy (tmp_output, "t:MakeshXXXXXXXX");
+ mktemp (tmp_output);
+ child_stdout = Open (tmp_output, MODE_NEWFILE);
+
+ for (aptr=argv; *aptr; aptr++)
+ {
+ len += strlen (*aptr) + 1;
+ }
+
+ buffer = xmalloc (len + 1);
+ ptr = buffer;
+
+ for (aptr=argv; *aptr; aptr++)
+ {
+ strcpy (ptr, *aptr);
+ len += strlen (ptr) + 1;
+ *ptr ++ = ' ';
+ *ptr = 0;
+ }
+
+ ptr[-1] = '\n';
+
+ Execute (buffer, NULL, child_stdout);
+ free (buffer);
+
+ Close (child_stdout);
+
+ child_stdout = Open (tmp_output, MODE_OLDFILE);
+
+ buffer = xmalloc (maxlen);
+ i = 0;
+ do
+ {
+ if (i == maxlen)
+ {
+ maxlen += 512;
+ buffer = (char *) xrealloc (buffer, maxlen + 1);
+ }
+
+ cc = read (child_stdout, &buffer[i], maxlen - i);
+ if (cc > 0)
+ i += cc;
+ } while (cc > 0);
+
+ Close (child_stdout);
+ DeleteFile (tmp_output);
+
+ if (i > 0)
+ {
+ if (buffer[i - 1] == '\n')
+ buffer[--i] = '\0';
+ else
+ buffer[i] = '\0';
+ p = buffer;
+ while ((p = index (p, '\n')) != 0)
+ *p++ = ' ';
+ o = variable_buffer_output (o, buffer, i);
+ }
+ free (buffer);
+ }
+#endif /* Not Amiga. */
+#endif /* MSDOS or Amiga. */
free (text);
break;