# Makefile for libada.
#   Copyright 2003, 2004, 2009, 2010, 2011 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

## 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@
AWK=@AWK@

# Variables for the user (or the top level) to override.
objext=.o
THREAD_KIND=native
TRACE=no
LDFLAGS=

# The tedious process of getting CFLAGS right.
CFLAGS=-g
PICFLAG = @PICFLAG@
GNATLIBFLAGS= -W -Wall -gnatpg -nostdinc
GNATLIBCFLAGS= -g -O2
GNATLIBCFLAGS_FOR_C = -W -Wall $(GNATLIBCFLAGS) \
	-fexceptions -DIN_RTS @have_getipinfo@

host_subdir = @host_subdir@
GCC_DIR=$(MULTIBUILDTOP)../../$(host_subdir)/gcc

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))
ADA_RTS_SUBDIR=./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)" \
        "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS)" \
        "PICFLAG_FOR_TARGET=$(PICFLAG)" \
        "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)"

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

gnatlib-plain: osconstool $(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: osconstool $(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

osconstool:
	$(MAKE) -C $(GCC_DIR)/ada $(LIBADA_FLAGS_TO_PASS) ./bldtools/oscons/xoscons

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:

.PHONY: check installcheck info dvi pdf html

# Installation rules.
install: install-gnatlib
	$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do # $(MAKE)

install-strip: install

install-info:

install-pdf:

install-html:

.PHONY: install install-strip 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:

.PHONY: mostlyclean clean distclean 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

AUTOCONF = autoconf
configure_deps = \
	$(srcdir)/configure.ac \
	$(srcdir)/../config/acx.m4 \
	$(srcdir)/../config/override.m4 \
	$(srcdir)/../config/multi.m4

$(srcdir)/configure: @MAINT@ $(configure_deps)
	cd $(srcdir) && $(AUTOCONF)

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