# Makefile for libada.
#   Copyright (C) 2003-2021 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: libada
	$(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.
toolexecdir = @toolexecdir@
toolexeclibdir = @toolexeclibdir@
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
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) $(CFLAGS_FOR_TARGET) \
	-fexceptions -DIN_RTS @have_getipinfo@ @have_capability@

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

target_noncanonical:=@target_noncanonical@
version := $(shell @get_gcc_base_ver@ $(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)" \
        "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS)" \
        "PICFLAG_FOR_TARGET=$(PICFLAG)" \
        "THREAD_KIND=$(THREAD_KIND)" \
        "TRACE=$(TRACE)" \
        "MULTISUBDIR=$(MULTISUBDIR)" \
        "libsubdir=$(libsubdir)" \
        "toolexeclibdir=$(toolexeclibdir)" \
        "objext=$(objext)" \
        "prefix=$(prefix)" \
        "exeext=.exeext.should.not.be.used " \
	'CC=the.host.compiler.should.not.be.needed' \
	"GCC_FOR_TARGET=$(CC)" \
        "CFLAGS=$(CFLAGS)"

.PHONY: libada gnatlib gnatlib-shared gnatlib-sjlj gnatlib-zcx osconstool

# Rules to build and install libada.
libada: @default_gnatlib_target@

gnatlib gnatlib-shared gnatlib-sjlj gnatlib-zcx: 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-libada: $(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-libada
	$(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/multi.m4 \
	$(srcdir)/../config/override.m4 \
	$(srcdir)/../config/picflag.m4 \
	$(srcdir)/../config/toolexeclibdir.m4 \
	$(srcdir)/../config/unwind_ipinfo.m4

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

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