# Makefile for libada.
#   Copyright 2003, 2004, 2009 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 3 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; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# Default target; must be first.
all: gnatlib
	$(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do # $(MAKE)

.PHONY: all install

## Multilib support variables.
MULTISRCTOP =
MULTIBUILDTOP =
MULTIDIRS =
MULTISUBDIR =
MULTIDO = true
MULTICLEAN = true

# Standard autoconf-set variables.
SHELL = @SHELL@
srcdir = @srcdir@
libdir = @libdir@
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=

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

TARGET_LIBGCC2_CFLAGS=
GNATLIBCFLAGS= -g -O2

# Get target-specific overrides for TARGET_LIBGCC2_CFLAGS.
host_subdir = @host_subdir@
GCC_DIR=$(MULTIBUILDTOP)../../$(host_subdir)/gcc
include $(GCC_DIR)/libgcc.mvars

target_noncanonical:=@target_noncanonical@
version := $(shell cat $(srcdir)/../gcc/BASE-VER)
libsubdir := $(libdir)/gcc/$(target_noncanonical)/$(version)$(MULTISUBDIR)
ADA_RTS_DIR=$(GCC_DIR)/ada/rts$(subst /,_,$(MULTISUBDIR))

# exeext should not be used because it's the *host* exeext.  We're building
# a *target* library, aren't we?!?  Likewise for CC.  Still, provide bogus
# definitions just in case something slips through the safety net provided
# by recursive make invocations in gcc/ada/Makefile.in
LIBADA_FLAGS_TO_PASS = \
        "MAKEOVERRIDES=" \
        "LDFLAGS=$(LDFLAGS)" \
        "LN_S=$(LN_S)" \
        "SHELL=$(SHELL)" \
        "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS)" \
        "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS)" \
        "TARGET_LIBGCC2_CFLAGS=$(TARGET_LIBGCC2_CFLAGS)" \
        "THREAD_KIND=$(THREAD_KIND)" \
        "TRACE=$(TRACE)" \
        "MULTISUBDIR=$(MULTISUBDIR)" \
        "libsubdir=$(libsubdir)" \
        "objext=$(objext)" \
        "prefix=$(prefix)" \
        "exeext=.exeext.should.not.be.used " \
	'CC=the.host.compiler.should.not.be.needed' \
	"GCC_FOR_TARGET=$(CC)" \
        "CFLAGS=$(CFLAGS) $(WARN_CFLAGS)"

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

gnatlib-plain: oscons $(GCC_DIR)/ada/Makefile
	test -f stamp-libada || \
	$(MAKE) -C $(GCC_DIR)/ada $(LIBADA_FLAGS_TO_PASS) gnatlib \
	&& touch stamp-libada
	-rm -rf adainclude
	-rm -rf adalib
	$(LN_S) $(ADA_RTS_DIR) adainclude
	$(LN_S) $(ADA_RTS_DIR) adalib

gnatlib-sjlj gnatlib-zcx gnatlib-shared: oscons $(GCC_DIR)/ada/Makefile
	test -f stamp-libada || \
	$(MAKE) -C $(GCC_DIR)/ada $(LIBADA_FLAGS_TO_PASS) $@ \
	&& touch stamp-libada
	-rm -rf adainclude
	-rm -rf adalib
	$(LN_S) $(ADA_RTS_DIR) adainclude
	$(LN_S) $(ADA_RTS_DIR) adalib

oscons:
	$(MAKE) -C $(GCC_DIR) $(LIBADA_FLAGS_TO_PASS) ada/s-oscons.ads

install-gnatlib: $(GCC_DIR)/ada/Makefile
	$(MAKE) -C $(GCC_DIR)/ada $(LIBADA_FLAGS_TO_PASS) install-gnatlib

# 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-gnatlib
	$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do # $(MAKE)

install-info:

install-pdf:

install-html:

# Cleaning rules.
mostlyclean:
	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean # $(MAKE)

clean:
	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=clean multi-clean # $(MAKE)

distclean:
	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean # $(MAKE)
	$(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 \
	$(srcdir)/../config/acx.m4 $(srcdir)/../config/override.m4
	cd $(srcdir) && autoconf

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