/* Definitions for Intel 386 running SCO Unix System V 3.2 Version 4.
   Written by Chip Salzenberg.
   Copyright (C) 1992, 1994 Free Software Foundation, Inc.

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, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */


/* Mostly it's like earlier SCO UNIX.  */

#include "i386/sco.h"

/* Use crt1.o as a startup file and crtn.o as a closing file.  */

#undef STARTFILE_SPEC
#define STARTFILE_SPEC \
 "%{scoxpg3:%{p:mcrt1X.o%s}%{!p:crt1X.o%s}} \
  %{!scoxpg3:\
   %{posix:%{p:mcrt1P.o%s}%{!p:crt1P.o%s}} \
   %{!posix:\
    %{ansi:%{p:mcrt1A.o%s}%{!p:crt1A.o%s}} \
    %{!ansi:%{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}}}} \
  crtbegin.o%s"

#undef ENDFILE_SPEC
#define ENDFILE_SPEC \
 "crtend.o%s \
  %{scoxpg3:crtnX.o%s} \
  %{!scoxpg3:\
   %{posix:crtnP.o%s} \
   %{!posix:\
    %{ansi:crtnA.o%s} \
    %{!ansi:crtn.o%s}}}"

/* Library spec.  */

#undef LIB_SPEC
#define LIB_SPEC \
 "%{p:-L/usr/lib/libp}%{pg:-L/usr/lib/libp} \
 %{scoxpg3:-lcX -lcP -lcA} \
 %{!scoxpg3:\
  %{posix:-lcP -lcA} \
  %{!posix:\
   %{ansi:-lcA} \
   %{!ansi:%{scointl:-lintl} -lc}}}"

/* Macros, macros everywhere:
   Specify predefined symbols in preprocessor.  */

#undef CPP_PREDEFINES
#define CPP_PREDEFINES \
 "-Asystem(svr3)"

#undef CPP_SPEC
#define CPP_SPEC "%(cpp_cpu) \
  -D_i386 -D_M_I386 -D_M_I86 -D_M_I86SM -D_M_SDATA -D_M_STEXT \
  -D_unix -D_M_UNIX -D_M_XENIX \
  -D_M_SYS5 -D_M_SYSV -D_M_SYS3 -D_M_SYSIII \
  -D_M_COFF -D_M_BITFIELDS -D_M_WORDSWAP \
  %{scoxpg3:-D_XOPEN_SOURCE -D_STRICT_NAMES} \
  %{!scoxpg3:%{posix:-D_POSIX_SOURCE -D_STRICT_NAMES}} \
  %{!scoxpg3:%{!posix:\
    %{ansi:-D_STRICT_NAMES}%{!ansi:\
    -Di386 -DM_I386 -DM_I86 -DM_I86SM -DM_SDATA -DM_STEXT \
    -Dunix -DM_UNIX -DM_XENIX \
    -DM_SYS5 -DM_SYSV -DM_SYS3 -DM_SYSIII \
    -DM_COFF -DM_BITFIELDS -DM_WORDSWAP \
    %{scointl:-D_M_INTERNAT -DM_INTERNAT} \
    %{traditional:-D_KR -D_SVID -D_NO_PROTOTYPE}}}}"

/* The system headers are C++-aware.  */
#define NO_IMPLICIT_EXTERN_C
