gcc/gnattools/Makefile.in
Maciej W. Rozycki d364c4ced8 ada: Make the names of uninstalled cross-gnattools consistent across builds
We suffer from an inconsistency in the names of uninstalled gnattools
executables in cross-compiler configurations.  The cause is a recipe we
have:

ada.all.cross:
	for tool in $(ADA_TOOLS) ; do \
	  if [ -f $$tool$(exeext) ] ; \
	  then \
	    $(MV) $$tool$(exeext) $$tool-cross$(exeext); \
	  fi; \
	done

the intent of which is to give the names of gnattools executables the
'-cross' suffix, consistently with the compiler drivers: 'gcc-cross',
'g++-cross', etc.

A problem with the recipe is that this 'make' target is called too early
in the build process, before gnattools have been made.  Consequently no
renames happen and owing to that they are conditional on the presence of
the individual executables the recipe succeeds doing nothing.

However if a target is requested later on such as 'make pdf' that does
not cause gnattools executables to be rebuilt, then 'ada.all.cross' does
succeed in renaming the executables already present in the build tree.
Then if the 'gnat' testsuite is run later on which expects non-suffixed
'gnatmake' executable, it does not find the 'gnatmake-cross' executable
in the build tree and may either catastrophically fail or incorrectly
use a system-installed copy of 'gnatmake'.

Of course if a target is requested such as `make all' that does cause
gnattools executables to be rebuilt, then both suffixed and non-suffixed
uninstalled executables result.

Fix the problem by moving the renaming of gnattools to a separate 'make'
recipe, pasted into a new 'gnattools-cross-mv' target and the existing
legacy 'cross-gnattools' target.  Then invoke the new target explicitly
from the 'gnattools-cross' recipe in gnattools/.

Update the test harness accordingly, so that suffixed gnattools are used
in cross-compilation testsuite runs.

	gcc/ada/
	* gcc-interface/Make-lang.in (ada.all.cross): Move recipe to...
	(GNATTOOLS_CROSS_MV): ... this new variable.
	(cross-gnattools): Paste it here.
	(gnattools-cross-mv): New target.

	gnattools/
	* Makefile.in (gnattools-cross): Also build 'gnattools-cross-mv'
	in GCC_DIR.

	gcc/testsuite/
	* lib/gnat.exp (local_find_gnatmake, find_gnatclean): Use
	'-cross' suffix where testing a cross-compiler.
2024-07-07 15:04:51 +01:00

303 lines
8.3 KiB
Makefile

# Makefile for gnattools
# 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: gnattools
# Standard autoconf-set variables.
SHELL = @SHELL@
srcdir = @srcdir@
libdir = @libdir@
build = @build@
target = @target@
host = @host@
prefix = @prefix@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
# Nonstandard autoconf-set variables.
LN_S=@LN_S@
target_noncanonical=@target_noncanonical@
host_noncanonical=@host_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
GCC_WARN_CFLAGS = -W -Wall
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
# Full path to top source directory
ftop_srcdir := $(shell cd $(srcdir)/..;${PWD_COMMAND})
# 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 = -iquote . -iquote .. -iquote ../.. \
-iquote $(fsrcdir)/ada -iquote $(fsrcdir)/config \
-iquote $(fsrcdir) -I$(ftop_srcdir)/include
ADA_INCLUDES_FOR_SUBDIR = -I. -I$(fsrcdir)/ada
CXX_LFLAGS = \
-B../../../$(target_noncanonical)/libstdc++-v3/src/.libs \
-B../../../$(target_noncanonical)/libstdc++-v3/libsupc++/.libs \
-L../../../$(target_noncanonical)/libstdc++-v3/src/.libs \
-L../../../$(target_noncanonical)/libstdc++-v3/libsupc++/.libs
# Variables for gnattools, native
TOOLS_FLAGS_TO_PASS_NATIVE= \
"CC=../../xgcc -B../../" \
"CXX=../../xg++ -B../../ $(CXX_LFLAGS)" \
"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)" \
"GNATMAKE=../../gnatmake" \
"GNATLINK=../../gnatlink" \
"GNATBIND=../../gnatbind" \
"TOOLSCASE=native"
# Variables for regnattools
TOOLS_FLAGS_TO_PASS_RE= \
"CC=../../xgcc -B../../" \
"CXX=../../xg++ -B../../ $(CXX_LFLAGS)" \
"CFLAGS=$(CFLAGS)" \
"LDFLAGS=$(LDFLAGS)" \
"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"
# Variables for gnattools, cross
ifeq ($(build), $(host))
GNATMAKE_FOR_HOST=gnatmake
GNATLINK_FOR_HOST=gnatlink
GNATBIND_FOR_HOST=gnatbind
GNATLS_FOR_HOST=gnatls
else
GNATMAKE_FOR_HOST=$(host_noncanonical)-gnatmake
GNATLINK_FOR_HOST=$(host_noncanonical)-gnatlink
GNATBIND_FOR_HOST=$(host_noncanonical)-gnatbind
GNATLS_FOR_HOST=$(host_noncanonical)-gnatls
endif
# Put the host RTS dir first in the PATH to hide the default runtime
# files that are among the sources
RTS_DIR:=$(strip $(subst \,/,$(shell $(GNATLS_FOR_HOST) -v | grep adalib )))
TOOLS_FLAGS_TO_PASS_CROSS= \
"CC=$(CC)" \
"CXX=$(CXX)" \
"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_FOR_HOST)" \
"GNATLINK=$(GNATLINK_FOR_HOST)" \
"GNATBIND=$(GNATBIND_FOR_HOST)" \
"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. We first need to copy the generated files,
# then the target-dependent sources using the same mechanism as for gnatlib.
GENERATED_FILES_FOR_TOOLS = \
einfo-entities.ads einfo-entities.adb sdefault.adb seinfo.ads \
sinfo-nodes.ads sinfo-nodes.adb snames.ads snames.adb
$(GCC_DIR)/stamp-tools:
-rm -rf $(GCC_DIR)/ada/tools
-mkdir -p $(GCC_DIR)/ada/tools
-(cd $(GCC_DIR)/ada/tools; $(foreach FILE,$(GENERATED_FILES_FOR_TOOLS), \
$(LN_S) ../$(FILE) $(FILE);))
-$(foreach PAIR,$(TOOLS_TARGET_PAIRS), \
rm -f $(GCC_DIR)/ada/tools/$(word 1,$(subst <, ,$(PAIR)));\
$(LN_S) $(fsrcdir)/ada/$(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_NATIVE) \
../../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_RE) INCLUDES="" \
gnatmake-re gnatlink-re
# gnattools2
$(MAKE) -C $(GCC_DIR)/ada/tools -f ../Makefile \
$(TOOLS_FLAGS_TO_PASS_NATIVE) common-tools
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
$(MAKE) -C $(GCC_DIR) gnattools-cross-mv
# 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:
.PHONY: check installcheck info dvi pdf html
# Build TAGS (none here).
TAGS:
# Installation rules.
install:
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:
clean:
distclean:
$(RM) Makefile config.status config.log config.cache
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)/configure: @MAINT@ $(configure_deps)
cd $(srcdir) && $(AUTOCONF)
# Don't export variables to the environment, in order to not confuse
# configure.
.NOEXPORT: