# Makefile for libada.
#   Copyright 2003, 2004 Free Software Foundation, Inc.
#
# This file 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 of the License, or
# (at your option) any later version.
# 
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# Default target; must be first.
all: gnatlib

# Standard autoconf-set variables.
SHELL = @SHELL@
srcdir = @srcdir@
build = @build@
target = @target@
prefix = @prefix@

# Nonstandard autoconf-set variables.
enable_shared = @enable_shared@
LN_S=@LN_S@

# Variables for the user (or the top level) to override.
objext=.o
GNATLIBFLAGS= -W -Wall -gnatpg
THREAD_KIND=native
TRACE=no
LDFLAGS=
STAGE_PREFIX=

# The tedious process of getting CFLAGS right.
CFLAGS=-g
LOOSE_WARN = -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes
GCC_WARN_CFLAGS = $(LOOSE_WARN) $(NOCOMMON_FLAG)

ADA_CFLAGS=
T_ADA_CFLAGS=
# HPPA is literally the only target which sets X_ADA_CFLAGS
X_ADA_CFLAGS=@x_ada_cflags@
ALL_ADA_CFLAGS=$(X_ADA_CFLAGS) $(T_ADA_CFLAGS) $(ADA_CFLAGS)

# For finding the GCC build dir, which is used far too much
host_subdir = @host_subdir@
GCC_DIR=../../$(host_subdir)/gcc
# Include fragment generated by GCC configure.
include $(GCC_DIR)/libada-mk

TARGET_LIBGCC2_CFLAGS=
GNATLIBCFLAGS= -g -O2
# Get target-specific overrides for TARGET_LIBGCC2_CFLAGS
# and possibly GNATLIBCFLAGS.  Currently this uses files
# in gcc/config.  The 'subst' call is used to rerelativize them
# from their gcc locations.  This is hackery, but there isn't
# yet a better way to do this.
tmake_file=$(subst /config,/../gcc/config,$(gcc_tmake_file))
ifneq ($(tmake_file),)
include $(tmake_file)
endif

FLAGS_TO_PASS = \
        "MAKEOVERRIDES=" \
        "LDFLAGS=$(LDFLAGS)" \
        "LN_S=$(LN_S)" \
        "SHELL=$(SHELL)" \
        "exeext=$(exeext)" \
        "objext=$(objext)" \
        "prefix=$(prefix)" \
        "STAGE_PREFIX=$(STAGE_PREFIX)" \
	"CC=$(host_cc_for_libada)" \
	"GCC_FOR_TARGET=$(CC)" \
        "CFLAGS=$(CFLAGS) $(WARN_CFLAGS)"

# Rules to build gnatlib.
.PHONY: gnatlib gnatlib-plain gnatlib-sjlj gnatlib-zcx gnatlib-shared
gnatlib: @default_gnatlib_target@

gnatlib-plain: $(GCC_DIR)/ada/Makefile
	test -f stamp-libada || \
	$(MAKE) -C $(GCC_DIR)/ada $(FLAGS_TO_PASS) \
	  GNATLIBFLAGS="$(GNATLIBFLAGS)" \
	  GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \
	  TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" \
	  THREAD_KIND="$(THREAD_KIND)" \
	  TRACE="$(TRACE)" \
	  gnatlib \
	&& touch stamp-libada

gnatlib-sjlj gnatlib-zcx gnatlib-shared: $(GCC_DIR)/ada/Makefile
	test -f stamp-libada || \
	$(MAKE) -C $(GCC_DIR)/ada $(FLAGS_TO_PASS) \
	  GNATLIBFLAGS="$(GNATLIBFLAGS)" \
	  GNATLIBCFLAGS="$(GNATLIBCFLAGS)" \
	  TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" \
	  THREAD_KIND="$(THREAD_KIND)" \
	  TRACE="$(TRACE)" \
	  $@ \
	&& touch stamp-libada

# Check uninstalled version.
check:

# Check installed version.
installcheck:

# Build info (none here).
info:

# Build DVI (none here).
dvi:

# Build PDF (none here).
pdf:

# Build html (none here).
html:

# Build TAGS (none here).
TAGS:

# Installation rules.
install:

install-info:

install-html:

# Cleaning rules.
mostlyclean:

clean:

distclean:
	$(RM) Makefile config.status config.log

maintainer-clean:

# Rules for rebuilding this Makefile.
Makefile: $(srcdir)/Makefile.in config.status
	CONFIG_FILES=$@ ; \
	CONFIG_HEADERS= ; \
	$(SHELL) ./config.status

config.status: $(srcdir)/configure
	$(SHELL) ./config.status --recheck

$(srcdir)/configure: @MAINT@ $(srcdir)/configure.ac
	cd $(srcdir) && autoconf

# Don't export variables to the environment, in order to not confuse
# configure.
.NOEXPORT:
