#!/bin/rc -e
# Copyright 2012 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

# See golang.org/s/go15bootstrap for an overview of the build process.

# Environment variables that control make.rc:
#
# GOROOT_FINAL: The expected final Go root, baked into binaries.
# The default is the location of the Go tree during the build.
#
# GOHOSTARCH: The architecture for host tools (compilers and
# binaries).  Binaries of this type must be executable on the current
# system, so the only common reason to set this is to set
# GOHOSTARCH=386 on an amd64 machine.
#
# GOARCH: The target architecture for installed packages and tools.
#
# GOOS: The target operating system for installed packages and tools.
#
# GO_GCFLAGS: Additional 5g/6g/8g arguments to use when
# building the packages and commands.
#
# GO_LDFLAGS: Additional 5l/6l/8l arguments to use when
# building the commands.
#
# CGO_ENABLED: Controls cgo usage during the build. Set it to 1
# to include all cgo related files, .c and .go file with "cgo"
# build directive, in the build. Set it to 0 to ignore them.

rfork e
if(! test -f run.rc){
	echo 'make.rc must be run from $GOROOT/src' >[1=2]
	exit wrongdir
}

# Generate libc_plan9.h.
../include/plan9/mklibc.rc > ../include/plan9/libc_plan9.h

# Clean old generated file that will cause problems in the build.
rm -f ./runtime/runtime_defs.go

# Determine the host compiler toolchain.
eval `{grep '^(CC|LD|O)=' /$objtype/mkfile}

echo '# Building Go bootstrap tool.'
echo cmd/dist
GOROOT = `{cd .. && pwd}
if(! ~ $#GOROOT_BOOTSTRAP 1)
	GOROOT_BOOTSTRAP = $home/go1.4
if(! test -x $GOROOT_BOOTSTRAP/bin/go){
	echo 'ERROR: Cannot find '$GOROOT_BOOTSTRAP'/bin/go.' >[1=2]
	echo 'Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.' >[1=2]
	exit bootstrap
}
rm -f cmd/dist/dist
GOROOT=$GOROOT_BOOTSTRAP GOOS='' GOARCH='' $GOROOT_BOOTSTRAP/bin/go build -o cmd/dist/dist ./cmd/dist

eval `{./cmd/dist/dist env -9}
echo

if(~ $1 --dist-tool){
	# Stop after building dist tool.
	mkdir -p $GOTOOLDIR
	if(! ~ $2 '')
		cp cmd/dist/dist $2
	mv cmd/dist/dist $GOTOOLDIR/dist
	exit
}

echo '# Building compilers and Go bootstrap tool for host,' $GOHOSTOS/$GOHOSTARCH^.
buildall = -a
if(~ $1 --no-clean)
	buildall = ()
./cmd/dist/dist bootstrap $buildall -v # builds go_bootstrap
# Delay move of dist tool to now, because bootstrap may clear tool directory.
mv cmd/dist/dist $GOTOOLDIR/dist
$GOTOOLDIR/go_bootstrap clean -i std
echo

# Run only one process at a time on 9vx.
if(~ $sysname vx32)
	pflag = (-p 1)

if(! ~ $GOHOSTARCH $GOARCH || ! ~ $GOHOSTOS $GOOS){
	echo '# Building packages and commands for host,' $GOHOSTOS/$GOHOSTARCH^.
	GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH \
		$GOTOOLDIR/go_bootstrap install -gcflags $"GO_GCFLAGS -ldflags $"GO_LDFLAGS -v $pflag std
	echo
}

echo '# Building packages and commands for' $GOOS/$GOARCH^.
$GOTOOLDIR/go_bootstrap install -gcflags $"GO_GCFLAGS -ldflags $"GO_LDFLAGS -v $pflag std
echo

rm -f $GOTOOLDIR/go_bootstrap

if(! ~ $1 --no-banner)
	$GOTOOLDIR/dist banner

status=''
