home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 7
/
FreshFishVol7.bin
/
bbs
/
gnu
/
gcc-2.3.3-src.lha
/
GNU
/
src
/
amiga
/
gcc-2.3.3
/
config
/
xm-amigados.h
< prev
next >
Wrap
C/C++ Source or Header
|
1994-02-06
|
7KB
|
216 lines
/* Configuration for GNU C-compiler for Commodore Amiga, running AmigaDOS.
Copyright (C) 1992 Free Software Foundation, Inc.
Contributed by Markus M. Wild (wild@amiga.physik.unizh.ch).
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* first include the generic header, then modify some parts.. */
#include "xm-m68k.h"
/* Amiga specific headers, such as from the Native Developer Update kits,
go in SYSTEM_INCLUDE_DIR. STANDARD_INCLUDE_DIR is the equivalent of
Unix "/usr/include". All other include paths are set in Makefile. */
#define SYSTEM_INCLUDE_DIR "/gnu/os-include"
#define STANDARD_INCLUDE_DIR "/gnu/include"
/* Fork one piped subcommand. SEARCH_FLAG is the system call to use
(either execv or execvp). ARGV is the arg vector to use.
NOT_LAST is nonzero if this is not the last subcommand
(i.e. its output should be piped to the next one.) */
#ifndef AMIGADOS_FORK_GCC
/* This version uses a more or less amigados-conformant way of running a
program (in the context of the parent). If you want to use -pipe however,
you'll have to use the vfork() version afterwards. */
#define PEXECUTE(SEARCH_FLAG,PROGRAM,ARGV,NOT_LAST) \
({char *_argline; \
int _arglinelength, _i; \
\
for (_i = 1, _arglinelength=0; ARGV[_i]; ++_i) \
_arglinelength += strlen(ARGV[_i]) + 1; \
\
_arglinelength += strlen(PROGRAM) + 1; \
\
if (!(_argline = (char *)alloca(_arglinelength))) \
pfatal_with_name ("alloca"); \
\
strcpy(_argline, PROGRAM); \
for (_i = 1; ARGV[_i]; ++_i) \
{ \
strcat(_argline, " "); \
strcat(_argline, ARGV[_i]); \
} \
\
ssystem(_argline); }) \
#define PEXECUTE_RESULT(STATUS, COMMAND) \
({ STATUS = COMMAND.pid; })
#else
/* the vfork() version. This one has the drawback, that gcc is not
interruptible when started from make, since ixemul.library doesn't yet
propagate ^C to subprocesses. */
#define PEXECUTE(SEARCH_FLAG,PROGRAM,ARGV,NOT_LAST) \
({int (*_func)() = (SEARCH_FLAG ? execv : execvp); \
int _pid; \
int _pdes[2]; \
int _input_desc = last_pipe_input; \
int _output_desc = STDOUT_FILE_NO; \
int _retries, _sleep_interval, _result; \
\
/* If this isn't the last process, make a pipe for its output, \
and record it as waiting to be the input to the next process. */ \
\
if (NOT_LAST) \
{ \
if (pipe (_pdes) < 0) \
pfatal_with_name ("pipe"); \
_output_desc = _pdes[WRITE_PORT]; \
last_pipe_input = _pdes[READ_PORT]; \
} \
else \
last_pipe_input = STDIN_FILE_NO; \
\
/* Fork a subprocess; wait and retry if it fails. */ \
_sleep_interval = 1; \
for (_retries = 0; _retries < 4; _retries++) \
{ \
_pid = vfork (); \
if (_pid >= 0) \
break; \
sleep (_sleep_interval); \
_sleep_interval *= 2; \
} \
\
switch (_pid) \
{ \
case -1: \
pfatal_with_name ("vfork"); \
/* NOTREACHED */ \
_result = 0; \
break; \
\
case 0: /* child */ \
/* Move the input and output pipes into place, if nec. */ \
if (_input_desc != STDIN_FILE_NO) \
{ \
close (STDIN_FILE_NO); \
dup (_input_desc); \
close (_input_desc); \
} \
if (_output_desc != STDOUT_FILE_NO) \
{ \
close (STDOUT_FILE_NO); \
dup (_output_desc); \
close (_output_desc); \
} \
\
/* Close the parent's descs that aren't wanted here. */ \
if (last_pipe_input != STDIN_FILE_NO) \
close (last_pipe_input); \
\
/* Exec the program. */ \
(*_func) (PROGRAM, ARGV); \
perror_exec (PROGRAM); \
exit (-1); \
/* NOTREACHED */ \
_result = 0; \
break; \
\
default: \
/* In the parent, after forking. \
Close the descriptors that we made for this child. */ \
if (_input_desc != STDIN_FILE_NO) \
close (_input_desc); \
if (_output_desc != STDOUT_FILE_NO) \
close (_output_desc); \
\
/* Return child's process number. */ \
_result = _pid; \
break; \
} \
_result; }) \
#define PEXECUTE_RESULT(STATUS, COMMAND) \
({ wait (& STATUS); })
#endif /* AMIGADOS_FORK_GCC */
/* the following macros are stolen more or less from xm-vms.h ... */
/* This macro is used to help compare filenames in cp-lex.c.
We also need to make sure that the names are all lower case, because
we must be able to compare filenames to determine if a file implements
a class. */
#define FILE_NAME_NONDIRECTORY(C) \
({ \
extern char *rindex(); \
char * pnt_ = (C), * pnt1_; \
pnt1_ = pnt_ - 1; \
while (*++pnt1_) \
if ((*pnt1_ >= 'A' && *pnt1_ <= 'Z')) *pnt1_ |= 0x20; \
pnt1_ = rindex (pnt_, '/'); \
pnt1_ = (pnt1_ == 0 ? rindex (pnt_, ':') : pnt1_); \
(pnt1_ == 0 ? pnt_ : pnt1_ + 1); \
})
/* Macro to generate the name of the cross reference file. The standard
one does not work, since it was written assuming that the conventions
of a unix style filesystem will work on the host system.
Contrary to VMS, I'm using the original unix filename, there's no reason
not to use this under AmigaDOS. */
#define XREF_FILE_NAME(BUFF, NAME) \
s = FILE_NAME_NONDIRECTORY (NAME); \
if (s == NAME) sprintf(BUFF, ".%s.gxref", NAME); \
else { \
unsigned char ch = *s; /* could be Latin1 char.. */ \
/* temporary: cut the filename from the directory */\
*s = 0; \
sprintf (BUFF, "%s.%c%s.gxref", NAME, ch, s+1); \
/* and restore the filename */ \
*s = ch; \
} \
/* Macro that is used in cp-xref.c to determine whether a file name is
absolute or not.
This checks for both, '/' as first character, since we're running under
ixemul.library which provides for this unix'ism, and for the usual
logical-terminator, ':', somewhere in the filename. */
#define FILE_NAME_ABSOLUTE_P(NAME) (NAME[0] == '/' || index(NAME, ':'))
/* the colon conflicts with the name space of logicals */
#define PATH_SEPARATOR ','
/* AmigaDOS handles rename(2) *much* better than any link(2)/unlink(2)
hacks. It's actually the inverse case as on Unix. rename(2) was always
there, link(2) is new with OS 2.0 */
#define HAVE_rename 1