#  $Id: makefile_public 12921 2009-04-08 10:28:06Z Bill Ellis $
#-------------------------------------------------------------------------------
#  (C) Praxis High Integrity Systems Limited
#-------------------------------------------------------------------------------
# 
#  The SPARK toolset is free software; you can redistribute it and/or modify it
#  under terms of the GNU General Public License as published by the Free
#  Software Foundation; either version 3, or (at your option) any later
#  version. The SPARK toolset 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 distributed with the SPARK toolset; see file
#  COPYING3. If not, go to http://www.gnu.org/licenses for a complete copy of
#  the license.
# 
#===============================================================================


################################################################################
# PURPOSE
#-------------------------------------------------------------------------------
# Makefile for the Examiner
# For Win, Solaris, Mac OS X (aka Darwin) or Linux.
################################################################################


################################################################################
# BUILD CONFIGURATION
################################################################################

# Name of the output program.
OUTPUTNAME:=spark

# EXAMINERSIZE
# ------------
# Large (Build to handle large programs)
# Mega  (Build to handle mega programs)
EXAMINERSIZE:=Large


################################################################################
# DETERMINE HOST INFORMATION
################################################################################

# Determine which platform this makefile is being run on.
TARGET:=$(shell uname -s)
architecture:=$(shell uname -m)
gcctarget:= $(shell gcc -dumpmachine)

# Canonicalize the target string.
ifeq ($(findstring CYGWIN_NT,${TARGET}),CYGWIN_NT)
    TARGET:=Windows
endif


################################################################################
# PLATFORM INDEPENDENT CONFIGURATION
################################################################################

commonopts:= -g -gnatwaY -gnat95 -gnaty3abefhiklnprt -I../common/versioning
gnatmakeopts:= ${commonopts} -O1
gccopts:=
bindopts:= -E

# Packages generated automatically by the parser.
parserpackages:= spproductions.ads spsymbols.ads spparseractions.ads \
                 spparsergoto.ads spparseractions.adb spparsergoto.adb \
                 spexpectedsymbols.ads spexpectedsymbols.adb \
                 sprelations.ads sprelations.adb


################################################################################
# PLATFORM SPECIFIC CONFIGURATION
################################################################################

# Windows.
ifeq (${TARGET},Windows)
    EXEEXTN:=.exe
    PrepTarget:=Intel_WinNT
    Address_Size:=32
    link_args:= -Xlinker --stack=0x10000000,0x100000
endif

# Solaris.
ifeq (${TARGET},SunOS)
    EXEEXTN:=
    PrepTarget:=SPARC_Solaris
    Address_Size:=32
    link_args:=
endif

# Linux.
ifeq (${TARGET},Linux)
    EXEEXTN:=
    PrepTarget:=Intel_Linux
    link_args:=
    ifeq ($(filter-out x86_64, ${architecture}),)
        Address_Size:=64
    else
        Address_Size:=32
    endif
endif

# Darwin (Mac OS X).
ifeq (${TARGET},Darwin)
    EXEEXTN:=
    PrepTarget:=Darwin

    # Add -a to force local recompilation of g-trasym.adb
    gnatmakeopts:= -a ${gnatmakeopts}

    link_args:=

    ifeq ($(findstring x86_64,${gcctarget}),x86_64)
        Address_Size:=64
    else
        $(error Can not build ${OUTPUTNAME} on 32-bit Darwin.)
    endif
endif


################################################################################
# TARGETS
################################################################################

all: ${OUTPUTNAME}${EXEEXTN}

examine: parser prep
	spark @spark.smf

examineplain: parser prep
	spark -plain @spark.smf

${OUTPUTNAME}${EXEEXTN}: parser prep *.ad?
	gnatmake ${gnatmakeopts} spark -o ${OUTPUTNAME}${EXEEXTN} -cargs ${gccopts} -bargs ${bindopts} -largs ${link_args}

parser: ${parserpackages}

${parserpackages}: SPARK.PAR
	gnatchop -w SPARK.PAR

SPARK.PAR: SPARK.LLA
	# -p = Operate as parser
	# -s = Perform self-pack
	# -m = Accept multi comp
	# -v = Verbose
	# -du = Activate debug feature: dump memory
	../sparklalr/sparklalr spark -p -s -m -v -du

prep: examinerconstants.ads filesystem.adb

%.ads: %.aps
	gnatprep -c -DExaminerSize=${EXAMINERSIZE} -DTarget=${PrepTarget} -DAddress_Size=${Address_Size} $? $@

%.adb: %.apb
	gnatprep -c -DExaminerSize=${EXAMINERSIZE} -DTarget=${PrepTarget} -DAddress_Size=${Address_Size} $? $@

clean:
	rm -f *.o *.ali
	rm -f examinerconstants.ads filesystem.adb \
	spsymbols.ads sprelations.ads sprelations.adb spproductions.ads spparsergoto.ads \
	spparsergoto.adb spparseractions.ads spparseractions.adb spexpectedsymbols.ads \
	spexpectedsymbols.adb
	rm -f SPARK.DGN SPARK.EKO SPARK.DSC SPARK.SYM SPARK.PAR SPARK.ACT

reallyclean: clean
	rm -f ${OUTPUTNAME}${EXEEXTN}
	rm -f *.lsb *.lss spark.rep
	rm -f b~*.ad?


################################################################################
# END-OF-FILE
