### which is the named used for ./configure, and also the prefix for the
### various files and directories used in a three stage.
+### The variable target may be set for the target of a cross-compilation.
+
+### The variable build may be to build a tree on a machine other than the host.
+
ifndef host
error:
@echo You must set the variable \"host\" to use this Makefile ; exit 1
CVS_MODULE := latest
### Historically, this was identical to CVS_TAG. This is changing.
-RELEASE_TAG := latest-930319
+RELEASE_TAG := latest-930426
### Historically, binaries were installed here. This is changing.
release_root := $(ROOTING)/$(RELEASE_TAG)
SHELL := /bin/sh
+ifdef build
+
+# We are building on a machine other than the host. We rely upon
+# previously built cross-compilers from the build machine to the host
+# (used to build the executables) and from the build machine to the
+# target (used to build the libraries).
+
+AR := $(host)-ar
+AR_FOR_TARGET := $(target)-ar
+AS := $(host)-as
+AS_FOR_TARGET := $(target)-as
+CC := $(host)-gcc
+CC_FOR_BUILD := gcc
+CC_FOR_TARGET := $(target)-gcc
+CXX := $(host)-c++
+CXX_FOR_TARGET := $(target)-c++
+GCC := $(host)-gcc -O
+GXX := $(host)-g++
+GXX_FOR_TARGET := $(target)-g++
+HOST_PREFIX := $(build)-
+HOST_PREFIX_1 := $(build)-
+MAKEINFO := makeinfo
+MUNCH_NM := $(host)-nm
+NM := $(host)-nm
+NM_FOR_TARGET := $(target)-nm
+RANLIB := $(host)-ranlib
+RANLIB_FOR_TARGET := $(target)-ranlib
+
+FLAGS_TO_PASS := \
+ "AR=$(AR)" \
+ "AR_FOR_TARGET=$(AR_FOR_TARGET)" \
+ "AS=$(AS)" \
+ "AS_FOR_TARGET=$(AS_FOR_TARGET)" \
+ "CC=$(CC)" \
+ "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+ "CC_FOR_TARGET=$(CC_FOR_TARGET)" \
+ "CXX=$(CXX)" \
+ "CXX_FOR_TARGET=$(CXX_FOR_TARGET)" \
+ "CFLAGS=$(CFLAGS)" \
+ "GCC=$(GCC)" \
+ "HOST_PREFIX=$(HOST_PREFIX)" \
+ "HOST_PREFIX_1=$(HOST_PREFIX_1)" \
+ "MAKEINFO=$(MAKEINFO)" \
+ "MF=$(MF)" \
+ "MUNCH_NM=$(MUNCH_NM)" \
+ "NM=$(NM)" \
+ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \
+ "RANLIB=$(RANLIB)" \
+ "RANLIB_FOR_TARGET=$(RANLIB_FOR_TARGET)" \
+ "RELEASE_TAG=$(RELEASE_TAG)" \
+ "TIME=$(TIME)" \
+ "build=$(build)" \
+ "host=$(host)"
+
+# We must pass the build cross host tools in the environment of
+# configure, so that autoconf scripts will run the right programs.
+configenv := AR="$(AR)" CC="$(CC)" RANLIB="$(RANLIB)"
+
+else
+
+# This is a normal build on the host machine.
+
FLAGS_TO_PASS := \
"GCC=$(GCC)" \
"CFLAGS=$(CFLAGS)" \
FLAGS_TO_PASS := "CC=$(CC)" $(FLAGS_TO_PASS)
endif
+configenv :=
+
+endif
+
+# These are the prefixes used for Cygnus builds.
prefixes = --prefix=$(release_root) --exec-prefix=$(release_root)/H-$(host)
-relbindir = $(release_root)/H-$(host)/bin
-ifeq ($(host),mips-dec-ultrix)
-configargs = -with-gnu-as
-else
-configargs =
-endif
+relbindir = $(release_root)/H-$(host)/bin
### general config stuff
WORKING_DIR := $(host)-objdir
STAGE2DIR := $(WORKING_DIR).2
STAGE3DIR := $(WORKING_DIR).3
INPLACEDIR := $(host)-in-place
-HOLESDIR := $(host)-holes
+
+# Arrange to find the needed programs. If we are building on a
+# machine other than the host, we must find the cross-compilers.
+
+ifdef build
+
+holesys := $(build)
+HOLESSTAMP := $(holesys)-stamp-holes $(build)-x-$(host)-stamp-holes $(build)-x-$(target)-stamp-holes
+HOLESDIR := $(holesys)-holes
+BUILD_HOST_HOLES_DIR := $(build)-x-$(host)-holes
+BUILD_TARGET_HOLES_DIR := $(build)-x-$(target)-holes
+
+SET_NATIVE_HOLES := SHELL=sh ; PATH=`pwd`/$(HOLESDIR):`pwd`/$(BUILD_HOST_HOLES_DIR):`pwd`/$(BUILD_TARGET_HOLES_DIR) ; export PATH ; export SHELL ;
+SET_CYGNUS_PATH := SHELL=sh ; PATH=`pwd`/$(HOLESDIR):`pwd`/$(BUILD_HOST_HOLES_DIR):`pwd`/$(BUILD_TARGET_HOLES_DIR) ; export PATH ; export SHELL ;
+SET_LATEST_PATH := SHELL=sh ; PATH=/usr/latest/bin:`pwd`/$(HOLESDIR):`pwd`/$(BUILD_HOST_HOLES_DIR):`pwd`/$(BUILD_TARGET_HOLES_DIR) ; export PATH ; export SHELL ;
+
+else
+
+holesys := $(host)
+HOLESSTAMP := $(holesys)-stamp-holes
+HOLESDIR := $(holesys)-holes
SET_NATIVE_HOLES := SHELL=sh ; PATH=`pwd`/$(HOLESDIR) ; export PATH ; export SHELL ;
SET_CYGNUS_PATH := SHELL=sh ; PATH=$(relbindir):`pwd`/$(HOLESDIR) ; export PATH ; export SHELL ;
SET_LATEST_PATH := SHELL=sh ; PATH=/usr/latest/bin:`pwd`/$(HOLESDIR) ; export PATH ; export SHELL ;
-
+endif
.PHONY: all
ifdef target
## This is a cross compilation
##
arch = $(host)-x-$(target)
-config = $(host) -target=$(target)
+config = -host=$(host) -target=$(target)
FLAGS_TO_PASS := $(FLAGS_TO_PASS) "target=$(target)"
+ifdef build
+all: do-cygnus do-latest
+build-all: build-cygnus build-latest
+else
all: do-native do-latest
build-all: build-native build-latest
+endif
+
+ifeq ($(target),mips-idt-ecoff)
+configargs = -with-gnu-as
+else
+configargs =
+endif
else
##
## This is a native compilation
##
arch = $(host)
-config = $(host)
+config = -host=$(host)
+ifdef build
+all: do-cygnus do-latest
+else
all: $(host)-stamp-3stage-done
+endif
#all: in-place do1 do2 do3 comparison
+
+ifeq ($(subst mips-sgi-irix4,mips-dec-ultrix,$(host)),mips-dec-ultrix)
+configargs = -with-gnu-as
+else
+configargs =
+endif
+
endif
NATIVEDIR := $(arch)-native-objdir
#everything: in-place do1 do2 do3 comparison do-cygnus
.PHONY: do-native
-do-native: $(host)-stamp-holes $(arch)-stamp-native
+do-native: $(HOLESSTAMP) $(arch)-stamp-native
do-native-config: $(arch)-stamp-native-configured
-build-native: $(host)-stamp-holes $(arch)-stamp-native-checked
-config-native: $(host)-stamp-holes $(arch)-stamp-native-configured
+build-native: $(HOLESSTAMP) $(arch)-stamp-native-checked
+config-native: $(HOLESSTAMP) $(arch)-stamp-native-configured
-$(arch)-stamp-native: $(host)-stamp-holes
+$(arch)-stamp-native: $(HOLESSTAMP)
$(SET_NATIVE_HOLES) $(TIME) $(GNU_MAKE) -f test-build.mk $(arch)-stamp-native-installed $(FLAGS_TO_PASS)
if [ -f CLEAN_ALL ] ; then rm -rf $(NATIVEDIR) ; else true ; fi
touch $(arch)-stamp-native
-$(arch)-stamp-native-installed: $(host)-stamp-holes $(arch)-stamp-native-checked
+$(arch)-stamp-native-installed: $(HOLESSTAMP) $(arch)-stamp-native-checked
$(SET_NATIVE_HOLES) cd $(NATIVEDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) install
$(SET_NATIVE_HOLES) cd $(NATIVEDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) install-info
touch $@
# cd $(NATIVEDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) check
touch $@
-$(arch)-stamp-native-built: $(host)-stamp-holes $(arch)-stamp-native-configured
+$(arch)-stamp-native-built: $(HOLESSTAMP) $(arch)-stamp-native-configured
$(SET_NATIVE_HOLES) cd $(NATIVEDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) all
$(SET_NATIVE_HOLES) cd $(NATIVEDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) info
touch $@
-$(arch)-stamp-native-configured: $(host)-stamp-holes
+$(arch)-stamp-native-configured: $(HOLESSTAMP)
[ -d $(NATIVEDIR) ] || mkdir $(NATIVEDIR)
- $(SET_NATIVE_HOLES) cd $(NATIVEDIR) ; $(TIME) ../$(TREE)/configure $(config) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
+ $(SET_NATIVE_HOLES) cd $(NATIVEDIR) ; $(configenv) $(TIME) ../$(TREE)/configure $(config) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
touch $@
.PHONY: do-cygnus
-do-cygnus: $(host)-stamp-holes $(arch)-stamp-cygnus
-build-cygnus: $(host)-stamp-holes $(arch)-stamp-cygnus-checked
-config-cygnus: $(host)-stamp-holes $(arch)-stamp-cygnus-configured
+do-cygnus: $(HOLESSTAMP) $(arch)-stamp-cygnus
+build-cygnus: $(HOLESSTAMP) $(arch)-stamp-cygnus-checked
+config-cygnus: $(HOLESSTAMP) $(arch)-stamp-cygnus-configured
$(arch)-stamp-cygnus:
+ifndef build
[ -f $(relbindir)/gcc ] || (echo "must have gcc available"; exit 1)
+endif
$(SET_CYGNUS_PATH) $(TIME) $(GNU_MAKE) -f test-build.mk $(arch)-stamp-cygnus-installed $(FLAGS_TO_PASS)
if [ -f CLEAN_ALL ] ; then rm -rf $(CYGNUSDIR) ; else true ; fi
touch $(arch)-stamp-cygnus
-$(arch)-stamp-cygnus-installed: $(host)-stamp-holes $(arch)-stamp-cygnus-checked
+$(arch)-stamp-cygnus-installed: $(HOLESSTAMP) $(arch)-stamp-cygnus-checked
$(SET_CYGNUS_PATH) cd $(CYGNUSDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) $(GNUC) install
$(SET_CYGNUS_PATH) cd $(CYGNUSDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) $(GNUC) install-info
touch $@
-$(arch)-stamp-cygnus-checked: $(host)-stamp-holes $(arch)-stamp-cygnus-built
+$(arch)-stamp-cygnus-checked: $(HOLESSTAMP) $(arch)-stamp-cygnus-built
# cd $(CYGNUSDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) $(GNUC) check
touch $@
-$(arch)-stamp-cygnus-built: $(host)-stamp-holes $(arch)-stamp-cygnus-configured
+$(arch)-stamp-cygnus-built: $(HOLESSTAMP) $(arch)-stamp-cygnus-configured
$(SET_CYGNUS_PATH) cd $(CYGNUSDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) $(GNUC) all
$(SET_CYGNUS_PATH) cd $(CYGNUSDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) $(GNUC) info
touch $@
-$(arch)-stamp-cygnus-configured: $(host)-stamp-holes
+$(arch)-stamp-cygnus-configured: $(HOLESSTAMP)
[ -d $(CYGNUSDIR) ] || mkdir $(CYGNUSDIR)
- $(SET_CYGNUS_PATH) cd $(CYGNUSDIR) ; $(GNUC) $(TIME) ../$(TREE)/configure $(config) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
+ $(SET_CYGNUS_PATH) cd $(CYGNUSDIR) ; $(GNUC) $(configenv) $(TIME) ../$(TREE)/configure $(config) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
touch $@
.PHONY: do-latest
-do-latest: $(host)-stamp-holes $(arch)-stamp-latest
-build-latest: $(host)-stamp-holes $(arch)-stamp-latest-checked
+do-latest: $(HOLESSTAMP) $(arch)-stamp-latest
+build-latest: $(HOLESSTAMP) $(arch)-stamp-latest-checked
$(arch)-stamp-latest:
$(SET_LATEST_PATH) $(TIME) $(GNU_MAKE) -f test-build.mk $(arch)-stamp-latest-installed $(FLAGS_TO_PASS)
touch $(arch)-stamp-latest
-
+$(arch)-stamp-latest-installed: $(HOLESSTAMP) $(arch)-stamp-latest-checked
$(SET_LATEST_PATH) cd $(LATESTDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) $(GNUC) install
$(SET_LATEST_PATH) cd $(LATESTDIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) $(GNUC) install-info
touch $@
$(arch)-stamp-latest-configured:
[ -d $(LATESTDIR) ] || mkdir $(LATESTDIR)
- $(SET_LATEST_PATH) cd $(LATESTDIR) ; $(GNUC) $(TIME) ../$(TREE)/configure $(config) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
+ $(SET_LATEST_PATH) cd $(LATESTDIR) ; $(GNUC) $(configenv) $(TIME) ../$(TREE)/configure $(config) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
touch $@
touch $@
$(host)-stamp-in-place-configured: $(host)-stamp-in-place-cp
- cd $(INPLACEDIR) ; $(TIME) ./configure $(host) -v $(prefixes) $(configargs)
+ cd $(INPLACEDIR) ; $(configenv) $(TIME) ./configure $(config) -v $(prefixes) $(configargs)
touch $@
$(host)-stamp-in-place-cp:
.PHONY: do1
-do1: $(host)-stamp-holes $(host)-stamp-stage1
-do1-config: $(host)-stamp-holes $(host)-stamp-stage1-configured
-do1-build: $(host)-stamp-holes $(host)-stamp-stage1-checked
+do1: $(HOLESSTAMP) $(host)-stamp-stage1
+do1-config: $(HOLESSTAMP) $(host)-stamp-stage1-configured
+do1-build: $(HOLESSTAMP) $(host)-stamp-stage1-checked
$(host)-stamp-stage1:
if [ -d $(STAGE1DIR) ] ; then \
$(SET_NATIVE_HOLES) cd $(WORKING_DIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) "CFLAGS=$(CFLAGS)" install host=$(host)
$(SET_NATIVE_HOLES) cd $(WORKING_DIR) ; $(TIME) $(MAKE) $(FLAGS_TO_PASS) "CFLAGS=$(CFLAGS)" install-info host=$(host)
ifeq ($(host),rs6000-ibm-aix)
- rm $(relbindir)/make
+ -rm $(relbindir)/make
endif
touch $@
$(host)-stamp-stage1-configured:
[ -d $(WORKING_DIR) ] || mkdir $(WORKING_DIR)
$(SET_NATIVE_HOLES) cd $(WORKING_DIR) ; \
- $(TIME) ../$(TREE)/configure $(host) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
+ $(configenv) $(TIME) ../$(TREE)/configure $(config) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
touch $@
.PHONY: do2
$(host)-stamp-stage2-configured:
[ -d $(WORKING_DIR) ] || mkdir $(WORKING_DIR)
$(SET_CYGNUS_PATH) cd $(WORKING_DIR) ; \
- $(GNUC) $(TIME) ../$(TREE)/configure $(host) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
+ $(configenv) $(GNUC) $(TIME) ../$(TREE)/configure $(config) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
touch $@
.PHONY: do3
$(host)-stamp-stage3-configured:
[ -d $(WORKING_DIR) ] || mkdir $(WORKING_DIR)
$(SET_CYGNUS_PATH) cd $(WORKING_DIR) ; \
- $(GNUC) $(TIME) ../$(TREE)/configure $(host) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
+ $(configenv) $(GNUC) $(TIME) ../$(TREE)/configure $(config) -v --srcdir=../$(TREE) $(prefixes) $(configargs)
touch $@
# These things are needed by a three-stage, but are not included locally.
touch \
tr \
true \
+ uname \
uudecode \
wc \
whoami
### so far only sun make supports VPATH
-ifeq ($(subst sun3,sun4,$(host)),sun4)
+ifeq ($(subst sun3,sun4,$(holesys)),sun4)
MAKE_HOLE :=
else
MAKE_HOLE := make
endif
### solaris 2 -- don't use /usr/ucb/cc
-ifeq (sparc-sun-solaris2,$(host))
+ifeq (sparc-sun-solaris2,$(holesys))
SET_NATIVE_HOLES := SHELL=sh ; PATH=/opt/SUNWspro/bin:`pwd`/$(HOLESDIR) ; export PATH ; export SHELL ;
HOLE_DIRS := /usr/ccs/bin
CC_HOLE :=
/usr/vintage/bin \
/usr/unsupported/bin
-$(HOLESDIR): $(host)-stamp-holes
+$(HOLESDIR): $(holesys)-stamp-holes
-$(host)-stamp-holes:
+$(holesys)-stamp-holes:
-rm -rf $(HOLESDIR)
-mkdir $(HOLESDIR)
@for i in $(HOLES) ; do \
endif
touch $@
+# Get the cross-tools for build cross host when not building on the host.
+
+BUILD_HOST_HOLES := \
+ byacc \
+ gcc \
+ makeinfo \
+ $(AR) \
+ $(AS) \
+ $(CC) \
+ $(CXX) \
+ $(GXX) \
+ $(NM) \
+ $(RANLIB)
+
+BUILD_HOLES_DIRS := $(PARTIAL_HOLE_DIRS)
+
+$(BUILD_HOST_HOLES_DIR): $(build)-x-$(host)-stamp-holes
+
+$(build)-x-$(host)-stamp-holes:
+ -rm -rf $(BUILD_HOST_HOLES_DIR)
+ -mkdir $(BUILD_HOST_HOLES_DIR)
+ @for i in $(BUILD_HOST_HOLES) ; do \
+ found= ; \
+ for j in $(BUILD_HOLES_DIRS) ; do \
+ if [ -x $$j/$$i ] ; then \
+ ln -s $$j/$$i $(BUILD_HOST_HOLES_DIR) || cp $$j/$$i $(BUILD_HOST_HOLES_DIR) ; \
+ echo $$i from $$j ; \
+ found=t ; \
+ break ; \
+ fi ; \
+ done ; \
+ case "$$found" in \
+ t) ;; \
+ *) echo $$i is NOT found ;; \
+ esac ; \
+ done
+ touch $@
+
+# Get the cross tools for build cross target when not building on the host.
+
+BUILD_TARGET_HOLES := \
+ byacc \
+ gcc \
+ makeinfo \
+ $(AR_FOR_TARGET) \
+ $(AS_FOR_TARGET) \
+ $(CC_FOR_TARGET) \
+ $(CXX_FOR_TARGET) \
+ $(GXX_FOR_TARGET) \
+ $(NM_FOR_TARGET) \
+ $(RANLIB_FOR_TARGET)
+
+$(BUILD_TARGET_HOLES_DIR): $(build)-x-$(target)-stamp-holes
+
+$(build)-x-$(target)-stamp-holes:
+ -rm -rf $(BUILD_TARGET_HOLES_DIR)
+ -mkdir $(BUILD_TARGET_HOLES_DIR)
+ @for i in $(BUILD_TARGET_HOLES) ; do \
+ found= ; \
+ for j in $(BUILD_HOLES_DIRS) ; do \
+ if [ -x $$j/$$i ] ; then \
+ ln -s $$j/$$i $(BUILD_TARGET_HOLES_DIR) || cp $$j/$$i $(BUILD_TARGET_HOLES_DIR) ; \
+ echo $$i from $$j ; \
+ found=t ; \
+ break ; \
+ fi ; \
+ done ; \
+ case "$$found" in \
+ t) ;; \
+ *) echo $$i is NOT found ;; \
+ esac ; \
+ done
+ touch $@
+
.PHONY: comparison
comparison: $(host)-stamp-3stage-compared