#  $Id: makefile_public 15834 2010-01-29 09:44:42Z rod chapman $
#-------------------------------------------------------------------------------
#  (C) Altran Praxis 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)

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


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

commonopts:= -g -gnatwa -gnat05 -gnaty3abefhiklnprt -I../common/versioning
gnatmakeopts:= ${commonopts} -O1
gccopts:=
bindopts:= -E
# DEBUG: The Examiner raises a fatal error during self-analysis with
#        Source_Reference pragmas in place. Thus, the handy "-r" option
#        is removed until the error is fixed.
prepopts:= -c

# 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

# Files generated through prepping.
preptargets:= examinerconstants.ads filesystem.adb \
              indexmanager-cache.adb indexmanager-cache.shb \
              sli-xref.adb sli-xref.shb

################################################################################
# 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 10.5 or 10.6, 64-bit).
ifeq (${TARGET},Darwin)
    EXEEXTN:=
    link_args:=
    PrepTarget:=Darwin
    Address_Size:=64

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


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

all: ${OUTPUTNAME}${EXEEXTN}

examine: parser prep
	spark -nosli @spark.smf

examineplain: parser prep
	spark -nosli -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: ${preptargets}

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

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

indexmanager-cache.adb: indexmanager-cache.SHADOW.adb
	gnatprep ${prepopts} -DSPARK=False $< $@

indexmanager-cache.shb: indexmanager-cache.SHADOW.adb
	gnatprep ${prepopts} -DSPARK=True $< $@

sli-xref.adb: sli-xref.SHADOW.adb
	gnatprep ${prepopts} -DSPARK=False $< $@

sli-xref.shb: sli-xref.SHADOW.adb
	gnatprep ${prepopts} -DSPARK=True $< $@

clean:
	rm -f *.o *.ali
	rm -f ${preptargets} ${parserpackages} \
	rm -f SPARK.DGN SPARK.EKO SPARK.DSC SPARK.SYM SPARK.PAR SPARK.ACT

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

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