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

ifeq (cp -p,$(LN_S))
LN_S_RECURSIVE = cp -pR
else
LN_S_RECURSIVE = $(LN_S)
endif

# 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
GNATLIBCFLAGS_FOR_C = $(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS) -fexceptions \
	-DIN_RTS @have_getipinfo@

# 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))
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)" \
        "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 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_RECURSIVE) $(ADA_RTS_DIR) adainclude
	$(LN_S_RECURSIVE) $(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_RECURSIVE) $(ADA_RTS_DIR) adainclude
	$(LN_S_RECURSIVE) $(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:
