# Makefile for gnattools
#   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: gnattools

# Standard autoconf-set variables.
SHELL = @SHELL@
srcdir = @srcdir@
libdir = @libdir@
build = @build@
target = @target@
prefix = @prefix@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@

# Nonstandard autoconf-set variables.
LN_S=@LN_S@
target_noncanonical=@target_noncanonical@

# Variables for the user (or the top level) to override.
exeext = @EXEEXT@
objext=.o
TRACE=no
ADA_FOR_BUILD=
ADA_FOR_TARGET=
LDFLAGS=
PWD_COMMAND = $${PWDCMD-pwd}

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

ADA_CFLAGS=@ADA_CFLAGS@

# Variables for gnattools.
ADAFLAGS= -gnatpg -gnata

# For finding the GCC build dir, which is used far too much
GCC_DIR=../gcc

# Absolute srcdir for gcc (why do we want absolute?  I dunno)
fsrcdir := $(shell cd $(srcdir)/../gcc/; ${PWD_COMMAND})

# Useful "subroutines" for the excess includes
INCLUDES_FOR_SUBDIR = -I. -I.. -I../.. -I$(fsrcdir)/ada -I$(fsrcdir)/config \
	-I$(fsrcdir)/../include -I$(fsrcdir)
ADA_INCLUDES_FOR_SUBDIR = -I. -I$(fsrcdir)/ada

# Variables for gnattools1, native
TOOLS_FLAGS_TO_PASS_1= \
	"CC=../../xgcc -B../../" \
	"CFLAGS=$(CFLAGS) $(WARN_CFLAGS)" \
	"LDFLAGS=$(LDFLAGS)" \
	"ADAFLAGS=$(ADAFLAGS)" \
	"ADA_CFLAGS=$(ADA_CFLAGS)" \
	"INCLUDES=$(INCLUDES_FOR_SUBDIR)" \
	"ADA_INCLUDES=-I- -I../rts $(ADA_INCLUDES_FOR_SUBDIR)"\
	"exeext=$(exeext)" \
	"fsrcdir=$(fsrcdir)" \
	"srcdir=$(fsrcdir)" \
	"GNATBIND=../../gnatbind" \
	"TOOLSCASE=native"

# Variables for regnattools
TOOLS_FLAGS_TO_PASS_1re= \
	"CC=../../xgcc -B../../" \
	"CFLAGS=$(CFLAGS)" \
	"ADAFLAGS=$(ADAFLAGS)" \
	"ADA_CFLAGS=$(ADA_CFLAGS)" \
	"INCLUDES=$(INCLUDES_FOR_SUBDIR)" \
	"ADA_INCLUDES=-I../rts $(ADA_INCLUDES_FOR_SUBDIR)"\
	"exeext=$(exeext)" \
	"fsrcdir=$(fsrcdir)" \
	"srcdir=$(fsrcdir)" \
	"GNATMAKE=../../gnatmake" \
	"GNATLINK=../../gnatlink" \
	"GNATBIND=../../gnatbind" \
	"TOOLSCASE=cross" \
	"INCLUDES="

# Variables for gnattools2, native
TOOLS_FLAGS_TO_PASS_NATIVE= \
	"CC=../../xgcc -B../../" \
	"CFLAGS=$(CFLAGS)" \
	"ADAFLAGS=$(ADAFLAGS)" \
	"ADA_CFLAGS=$(ADA_CFLAGS)" \
	"INCLUDES=$(INCLUDES_FOR_SUBDIR)" \
	"ADA_INCLUDES=-I../rts $(ADA_INCLUDES_FOR_SUBDIR)" \
	"exeext=$(exeext)" \
	"fsrcdir=$(fsrcdir)" \
	"srcdir=$(fsrcdir)" \
	"GNATMAKE=../../gnatmake" \
	"GNATLINK=../../gnatlink" \
	"GNATBIND=../../gnatbind" \
	"TOOLSCASE=native"

# Variables for gnattools, cross
TOOLS_FLAGS_TO_PASS_CROSS= \
	"CC=$(CC)" \
	"CFLAGS=$(CFLAGS) $(WARN_CFLAGS)" \
	"LDFLAGS=$(LDFLAGS)" \
	"ADAFLAGS=$(ADAFLAGS)"	\
	"ADA_CFLAGS=$(ADA_CFLAGS)" \
	"INCLUDES=$(INCLUDES_FOR_SUBDIR)" \
	"ADA_INCLUDES=-I$(RTS_DIR)../adainclude -I$(RTS_DIR) $(ADA_INCLUDES_FOR_SUBDIR)" \
	"exeext=$(exeext)" \
	"fsrcdir=$(fsrcdir)" \
	"srcdir=$(fsrcdir)" \
	"GNATMAKE=gnatmake" \
	"GNATLINK=gnatlink" \
	"GNATBIND=gnatbind" \
	"TOOLSCASE=cross" \
	"LIBGNAT="

# File lists
# ----------

# File associations set by configure
EXTRA_GNATTOOLS = @EXTRA_GNATTOOLS@
TOOLS_TARGET_PAIRS = @TOOLS_TARGET_PAIRS@

# Makefile targets
# ----------------

.PHONY: gnattools gnattools-native gnattools-cross regnattools
gnattools: @default_gnattools_target@

# Sanity check
$(GCC_DIR)/stamp-gnatlib-rts:
	@if [ ! -f $(GCC_DIR)/stamp-gnatlib-rts ] ; \
        then \
          echo "Cannot build gnattools while gnatlib is out of date or unbuilt" ; \
          false; \
        else \
          true; \
        fi


# Build directory for the tools. Let's copy the target-dependent
# sources using the same mechanism as for gnatlib. The other sources are
# accessed using the vpath directive in ada/Makefile.in

$(GCC_DIR)/stamp-tools:
	-rm -rf $(GCC_DIR)/ada/tools
	-mkdir -p $(GCC_DIR)/ada/tools
	-(cd $(GCC_DIR)/ada/tools; $(LN_S) ../sdefault.adb .)
	-$(foreach PAIR,$(TOOLS_TARGET_PAIRS), \
	          rm -f $(GCC_DIR)/ada/tools/$(word 1,$(subst <, ,$(PAIR)));\
	          $(LN_S) $(fsrcdir)/$(word 2,$(subst <, ,$(PAIR))) \
	                $(GCC_DIR)/ada/tools/$(word 1,$(subst <, ,$(PAIR)));)
	touch $(GCC_DIR)/stamp-tools

# gnatmake/link tools cannot always be built with gnatmake/link for bootstrap 
# reasons: gnatmake should be built with a recent compiler, a recent compiler
# may not generate ALI files compatible with an old gnatmake so it is important
# to be able to build gnatmake without a version of gnatmake around. Once 
# everything has been compiled once, gnatmake can be recompiled with itself 
# (see target regnattools) 
gnattools-native: $(GCC_DIR)/stamp-tools $(GCC_DIR)/stamp-gnatlib-rts
	# gnattools1
	$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
	  $(TOOLS_FLAGS_TO_PASS_1) \
	  ../../gnatmake$(exeext) ../../gnatlink$(exeext)
	# gnattools2
	$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
	  $(TOOLS_FLAGS_TO_PASS_NATIVE) common-tools

# gnatmake/link can be built with recent gnatmake/link if they are available.
# This is especially convenient for building cross tools or for rebuilding
# the tools when the original bootstrap has already be done.
regnattools: $(GCC_DIR)/stamp-gnatlib-rts
	# gnattools1-re
	$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
	  $(TOOLS_FLAGS_TO_PASS_1re) \
	  gnatmake-re gnatlink-re
	# gnattools2
	$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
	  $(TOOLS_FLAGS_TO_PASS_NATIVE) common-tools

# For cross builds of gnattools,
# put the host RTS dir first in the PATH to hide the default runtime
# files that are among the sources
# FIXME: This should be done in configure.
RTS_DIR:=$(strip $(subst \,/,$(shell gnatls -v | grep adalib )))
gnattools-cross: $(GCC_DIR)/stamp-tools
	# gnattools1-re
	$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
	  $(TOOLS_FLAGS_TO_PASS_CROSS) INCLUDES="" \
	  gnatmake-re gnatlink-re
	# gnattools2
	$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
	  $(TOOLS_FLAGS_TO_PASS_CROSS) common-tools
	# Rename cross tools to where the GCC makefile wants them when
	# installing.  FIXME: installation should be done elsewhere.
	if [ -f $(GCC_DIR)/gnatbind$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatbind$(exeext) $(GCC_DIR)/gnatbind-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatchop$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatchop$(exeext) $(GCC_DIR)/gnatchop-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnat$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnat$(exeext) $(GCC_DIR)/gnat-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatkr$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatkr$(exeext) $(GCC_DIR)/gnatkr-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatlink$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatlink$(exeext) $(GCC_DIR)/gnatlink-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatls$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatls$(exeext) $(GCC_DIR)/gnatls-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatmake$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatmake$(exeext) $(GCC_DIR)/gnatmake-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatmem$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatmem$(exeext) $(GCC_DIR)/gnatmem-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatname$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatname$(exeext) $(GCC_DIR)/gnatname-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatprep$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatprep$(exeext) $(GCC_DIR)/gnatprep-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatxref$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatxref$(exeext) $(GCC_DIR)/gnatxref-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatfind$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatfind$(exeext) $(GCC_DIR)/gnatfind-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatclean$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatclean$(exeext) $(GCC_DIR)/gnatclean-cross$(exeext); \
	fi
	if [ -f $(GCC_DIR)/gnatsym$(exeext) ] ; then \
	  mv $(GCC_DIR)/gnatsym$(exeext) $(GCC_DIR)/gnatsym-cross$(exeext); \
	fi

# Other
# -----

# 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-info:

install-pdf:

install-html:

# Cleaning rules.
mostlyclean:

clean:

distclean:
	$(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:

