/*
 * Copyright 1993, 1995 Christopher Seiwald.
 *
 * This file is part of Jam - see jam.c for Copyright information.
 */

/*  This file is ALSO:
 *  Copyright 2001-2004 David Abrahams.
 *  Distributed under the Boost Software License, Version 1.0.
 *  (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 */

/*
 * jam.h - includes and globals for jam
 *
 * 04/08/94 (seiwald) - Coherent/386 support added.
 * 04/21/94 (seiwald) - DGUX is __DGUX__, not just __DGUX.
 * 05/04/94 (seiwald) - new globs.jobs (-j jobs)
 * 11/01/94 (wingerd) - let us define path of Jambase at compile time.
 * 12/30/94 (wingerd) - changed command buffer size for NT (MS-DOS shell).
 * 02/22/95 (seiwald) - Jambase now in /usr/local/lib.
 * 04/30/95 (seiwald) - FreeBSD added.  Live Free or Die.
 * 05/10/95 (seiwald) - SPLITPATH character set up here.
 * 08/20/95 (seiwald) - added LINUX.
 * 08/21/95 (seiwald) - added NCR.
 * 10/23/95 (seiwald) - added SCO.
 * 01/03/96 (seiwald) - SINIX (nixdorf) added.
 * 03/13/96 (seiwald) - Jambase now compiled in; remove JAMBASE variable.
 * 04/29/96 (seiwald) - AIX now has 31 and 42 OSVERs.
 * 11/21/96 (peterk)  - added BeOS with MW CW mwcc
 * 12/21/96 (seiwald) - OSPLAT now defined for NT.
 * 07/19/99 (sickel)  - Mac OS X Server and Client support added
 * 02/18/00 (belmonte)- Support for Cygwin.
 * 09/12/00 (seiwald) - OSSYMS split to OSMAJOR/OSMINOR/OSPLAT
 * 12/29/00 (seiwald) - OSVER dropped.
 */

#ifndef JAM_H_VP_2003_08_01
#define JAM_H_VP_2003_08_01

#ifdef HAVE_PYTHON
#include <Python.h>
#endif

/* Assume popen support is available unless known otherwise. */
#define HAVE_POPEN 1

/*
 * VMS, OPENVMS
 */

#ifdef VMS

#include <types.h>
#include <file.h>
#include <stat.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <unixlib.h>

#define OSMINOR "OS=VMS"
#define OSMAJOR "VMS=true"
#define OS_VMS
#define MAXLINE 1024 /* longest 'together' actions */
#define SPLITPATH ','
#define EXITOK 1
#define EXITBAD 0
#define DOWNSHIFT_PATHS

/* This may be inaccurate. */
#ifndef __DECC
#define OSPLAT "OSPLAT=VAX"
#endif

#endif

/*
 * Windows NT
 */

#ifdef NT

#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <malloc.h>
#ifndef __MWERKS__
    #include <memory.h>
#endif
#include <signal.h>
#include <string.h>
#include <time.h>

#define OSMAJOR "NT=true"
#define OSMINOR "OS=NT"
#define OS_NT
#define SPLITPATH ';'
/* Windows NT 3.51 only allows 996 chars per line, but we deal with the problem
 * in "execnt.c".
 */
#define MAXLINE (maxline())    /* longest 'together' actions */
#define USE_EXECNT
#define USE_PATHUNIX
#define PATH_DELIM '\\'
#define DOWNSHIFT_PATHS

/* AS400 cross-compile from NT. */

#ifdef AS400
    #undef OSMINOR
    #undef OSMAJOR
    #define OSMAJOR "AS400=true"
    #define OSMINOR "OS=AS400"
    #define OS_AS400
#endif

/* Metrowerks Standard Library on Windows. */

#ifdef __MSL__
    #undef HAVE_POPEN
#endif

# endif

/*
 * Windows MingW32
 */

#ifdef MINGW

#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <malloc.h>
#include <memory.h>
#include <signal.h>
#include <string.h>
#include <time.h>

#define OSMAJOR "MINGW=true"
#define OSMINOR "OS=MINGW"
#define OS_NT
#define SPLITPATH ';'
#define MAXLINE 996    /* longest 'together' actions */
#define USE_EXECUNIX
#define USE_PATHUNIX
#define PATH_DELIM '\\'
#define DOWNSHIFT_PATHS

#endif

/*
 * OS2
 */

#ifdef __OS2__

#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <malloc.h>
#include <signal.h>
#include <string.h>
#include <time.h>

#define OSMAJOR "OS2=true"
#define OSMINOR "OS=OS2"
#define OS_OS2
#define SPLITPATH ';'
#define MAXLINE 996    /* longest 'together' actions */
#define USE_EXECUNIX
#define USE_PATHUNIX
#define PATH_DELIM '\\'
#define DOWNSHIFT_PATHS

#ifdef __EMX__
    #define USE_FILEUNIX
#endif

#endif

/*
 * Macintosh MPW
 */

#ifdef macintosh

#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define OSMAJOR "MAC=true"
#define OSMINOR "OS=MAC"
#define OS_MAC
#define SPLITPATH ','

#endif

/*
 * God fearing UNIX.
 */

#ifndef OSMINOR

#define OSMAJOR "UNIX=true"
#define USE_EXECUNIX
#define USE_FILEUNIX
#define USE_PATHUNIX
#define PATH_DELIM '/'

#ifdef _AIX
    #define unix
    #define MAXLINE 23552  /* 24k - 1k, longest 'together' actions */
    #define OSMINOR "OS=AIX"
    #define OS_AIX
    #define NO_VFORK
#endif
#ifdef AMIGA
    #define OSMINOR "OS=AMIGA"
    #define OS_AMIGA
#endif
#ifdef __BEOS__
    #define unix
    #define OSMINOR "OS=BEOS"
    #define OS_BEOS
    #define NO_VFORK
#endif
#ifdef __bsdi__
    #define OSMINOR "OS=BSDI"
    #define OS_BSDI
#endif
#if defined (COHERENT) && defined (_I386)
    #define OSMINOR "OS=COHERENT"
    #define OS_COHERENT
    #define NO_VFORK
#endif
#if defined(__cygwin__) || defined(__CYGWIN__)
    #define OSMINOR "OS=CYGWIN"
    #define OS_CYGWIN
#endif
#if defined(__FreeBSD__) && !defined(__DragonFly__)
    #define OSMINOR "OS=FREEBSD"
    #define OS_FREEBSD
#endif
#ifdef __DragonFly__
    #define OSMINOR "OS=DRAGONFLYBSD"
    #define OS_DRAGONFLYBSD
#endif
#ifdef __DGUX__
    #define OSMINOR "OS=DGUX"
    #define OS_DGUX
#endif
#ifdef __hpux
    #define OSMINOR "OS=HPUX"
    #define OS_HPUX
#endif
#ifdef __OPENNT
    #define unix
    #define OSMINOR "OS=INTERIX"
    #define OS_INTERIX
    #define NO_VFORK
#endif
#ifdef __sgi
    #define OSMINOR "OS=IRIX"
    #define OS_IRIX
    #define NO_VFORK
#endif
#ifdef __ISC
    #define OSMINOR "OS=ISC"
    #define OS_ISC
    #define NO_VFORK
#endif
#ifdef linux
    #define OSMINOR "OS=LINUX"
    #define OS_LINUX
#endif
#ifdef __Lynx__
    #define OSMINOR "OS=LYNX"
    #define OS_LYNX
    #define NO_VFORK
    #define unix
#endif
#ifdef __MACHTEN__
    #define OSMINOR "OS=MACHTEN"
    #define OS_MACHTEN
#endif
#ifdef mpeix
    #define unix
    #define OSMINOR "OS=MPEIX"
    #define OS_MPEIX
    #define NO_VFORK
#endif
#ifdef __MVS__
    #define unix
    #define OSMINOR "OS=MVS"
    #define OS_MVS
#endif
#ifdef _ATT4
    #define OSMINOR "OS=NCR"
    #define OS_NCR
#endif
#ifdef __NetBSD__
    #define unix
    #define OSMINOR "OS=NETBSD"
    #define OS_NETBSD
    #define NO_VFORK
#endif
#ifdef __QNX__
    #define unix
    #ifdef __QNXNTO__
        #define OSMINOR "OS=QNXNTO"
        #define OS_QNXNTO
    #else
        #define OSMINOR "OS=QNX"
        #define OS_QNX
        #define NO_VFORK
        #define MAXLINE 996
    #endif
#endif
#ifdef NeXT
    #ifdef __APPLE__
        #define OSMINOR "OS=RHAPSODY"
        #define OS_RHAPSODY
    #else
        #define OSMINOR "OS=NEXT"
        #define OS_NEXT
    #endif
#endif
#ifdef __APPLE__
    #define unix
    #define OSMINOR "OS=MACOSX"
    #define OS_MACOSX
#endif
#ifdef __osf__
    #ifndef unix
        #define unix
    #endif
    #define OSMINOR "OS=OSF"
    #define OS_OSF
#endif
#ifdef _SEQUENT_
    #define OSMINOR "OS=PTX"
    #define OS_PTX
#endif
#ifdef M_XENIX
    #define OSMINOR "OS=SCO"
    #define OS_SCO
    #define NO_VFORK
#endif
#ifdef sinix
    #define unix
    #define OSMINOR "OS=SINIX"
    #define OS_SINIX
#endif
#ifdef sun
    #if defined(__svr4__) || defined(__SVR4)
        #define OSMINOR "OS=SOLARIS"
        #define OS_SOLARIS
    #else
        #define OSMINOR "OS=SUNOS"
        #define OS_SUNOS
    #endif
#endif
#ifdef ultrix
    #define OSMINOR "OS=ULTRIX"
    #define OS_ULTRIX
#endif
#ifdef _UNICOS
    #define OSMINOR "OS=UNICOS"
    #define OS_UNICOS
#endif
#if defined(__USLC__) && !defined(M_XENIX)
    #define OSMINOR "OS=UNIXWARE"
    #define OS_UNIXWARE
#endif
#ifdef __OpenBSD__
    #define OSMINOR "OS=OPENBSD"
    #define OS_OPENBSD
    #define unix
#endif
#if defined (__FreeBSD_kernel__) && !defined(__FreeBSD__)
    #define OSMINOR "OS=KFREEBSD"
    #define OS_KFREEBSD
#endif
#ifndef OSMINOR
    #define OSMINOR "OS=UNKNOWN"
#endif

/* All the UNIX includes */

#include <sys/types.h>
#include <sys/stat.h>

#ifndef OS_MPEIX
    #include <sys/file.h>
#endif

#include <fcntl.h>
#include <stdio.h>
#include <ctype.h>
#include <signal.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#ifndef OS_QNX
    #include <memory.h>
#endif

#ifndef OS_ULTRIX
    #include <stdlib.h>
#endif

#if !defined( OS_BSDI         ) && \
    !defined( OS_FREEBSD      ) && \
    !defined( OS_DRAGONFLYBSD ) && \
    !defined( OS_NEXT         ) && \
    !defined( OS_MACHTEN      ) && \
    !defined( OS_MACOSX       ) && \
    !defined( OS_RHAPSODY     ) && \
    !defined( OS_MVS          ) && \
    !defined( OS_OPENBSD      )
    #include <malloc.h>
#endif

#endif

/*
 * OSPLAT definitions - suppressed when it is a one-of-a-kind.
 */

#if defined( _M_PPC      ) || \
    defined( PPC         ) || \
    defined( ppc         ) || \
    defined( __powerpc__ ) || \
    defined( __ppc__     )
    #define OSPLAT "OSPLAT=PPC"
#endif

#if defined( _ALPHA_   ) || \
    defined( __alpha__ )
    #define OSPLAT "OSPLAT=AXP"
#endif

#if defined( _i386_   ) || \
    defined( __i386__ ) || \
    defined( __i386   ) || \
    defined( _M_IX86  )
    #define OSPLAT "OSPLAT=X86"
#endif

#if defined( __ia64__ ) || \
    defined( __IA64__ ) || \
    defined( __ia64   )
    #define OSPLAT "OSPLAT=IA64"
#endif

#if defined( __x86_64__ ) || \
    defined( __amd64__  ) || \
    defined( _M_AMD64   )
    #define OSPLAT "OSPLAT=X86_64"
#endif


#if defined( __sparc__ ) || \
    defined( __sparc   )
    #define OSPLAT "OSPLAT=SPARC"
#endif

#ifdef __mips__
    #define OSPLAT "OSPLAT=MIPS"
#endif

#ifdef __arm__
    #define OSPLAT "OSPLAT=ARM"
#endif

#ifdef __s390__
    #define OSPLAT "OSPLAT=390"
#endif

#ifdef __hppa
    #define OSPLAT "OSPLAT=PARISC"
#endif

#ifndef OSPLAT
    #define OSPLAT ""
#endif

/*
 * Jam implementation misc.
 */

#ifndef MAXLINE
    #define MAXLINE 102400 /* longest 'together' actions' */
#endif

#ifndef EXITOK
    #define EXITOK 0
    #define EXITBAD 1
#endif

#ifndef SPLITPATH
    #define SPLITPATH ':'
#endif

/* You probably do not need to muck with these. */

#define MAXSYM   1024  /* longest symbol in the environment */
#define MAXJPATH 1024  /* longest filename */

#define MAXJOBS  64    /* silently enforced -j limit */
#define MAXARGC  32    /* words in $(JAMSHELL) */

/* Jam private definitions below. */

#define DEBUG_MAX  14


struct globs
{
    int    noexec;
    int    jobs;
    int    quitquick;
    int    newestfirst;         /* build newest sources first */
    int    pipe_action;
    char   debug[ DEBUG_MAX ];
    FILE * cmdout;              /* print cmds, not run them */
    long   timeout;             /* number of seconds to limit actions to,
                                 * default 0 for no limit.
                                 */
    int    dart;                /* output build and test results formatted for Dart */
};

extern struct globs globs;

#define DEBUG_MAKE     ( globs.debug[ 1 ] )   /* show actions when executed */
#define DEBUG_MAKEQ    ( globs.debug[ 2 ] )   /* show even quiet actions */
#define DEBUG_EXEC     ( globs.debug[ 2 ] )   /* show text of actons */
#define DEBUG_MAKEPROG ( globs.debug[ 3 ] )   /* show progress of make0 */
#define DEBUG_BIND     ( globs.debug[ 3 ] )   /* show when files bound */

#define DEBUG_EXECCMD  ( globs.debug[ 4 ] )   /* show execcmds()'s work */

#define DEBUG_COMPILE  ( globs.debug[ 5 ] )   /* show rule invocations */

#define DEBUG_HEADER   ( globs.debug[ 6 ] )   /* show result of header scan */
#define DEBUG_BINDSCAN ( globs.debug[ 6 ] )   /* show result of dir scan */
#define DEBUG_SEARCH   ( globs.debug[ 6 ] )   /* show attempts at binding */

#define DEBUG_VARSET   ( globs.debug[ 7 ] )   /* show variable settings */
#define DEBUG_VARGET   ( globs.debug[ 8 ] )   /* show variable fetches */
#define DEBUG_VAREXP   ( globs.debug[ 8 ] )   /* show variable expansions */
#define DEBUG_IF       ( globs.debug[ 8 ] )   /* show 'if' calculations */
#define DEBUG_LISTS    ( globs.debug[ 9 ] )   /* show list manipulation */
#define DEBUG_SCAN     ( globs.debug[ 9 ] )   /* show scanner tokens */
#define DEBUG_MEM      ( globs.debug[ 9 ] )   /* show memory use */

#define DEBUG_PROFILE  ( globs.debug[ 10 ] )  /* dump rule execution times */
#define DEBUG_PARSE    ( globs.debug[ 11 ] )  /* debug parsing */
#define DEBUG_GRAPH    ( globs.debug[ 12 ] )  /* debug dependencies */
#define DEBUG_FATE     ( globs.debug[ 13 ] )  /* show changes to fate in make0() */

/* Everyone gets the memory definitions. */
#include "mem.h"

/* They also get the profile functions. */
#include "debug.h"

#endif