# Makefile for libada.
#   Copyright (C) 2003-2022 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-dvi:

install-html:

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