#!/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:
#
# 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 go tool compile arguments to use when
# building the packages and commands.
#
# GO_LDFLAGS: Additional go tool link 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
}

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

vflag=()
if(~ $1 -v) {
	vflag=(-v)
	shift
}

fn bootstrapenv {
	GOROOT=$GOROOT_BOOTSTRAP GO111MODULE=off GOENV=off GOOS=() GOARCH=() GOEXPERIMENT=() GOFLAGS=() $*
}

bootgo = 1.20.6
GOROOT = `{cd .. && pwd}
goroot_bootstrap_set = 'true'
if(! ~ $#GOROOT_BOOTSTRAP 1){
	goroot_bootstrap_set = 'false'
	GOROOT_BOOTSTRAP = $home/go1.4
	for(d in sdk/go$bootgo go$bootgo)
		if(test -d $home/$d)
			GOROOT_BOOTSTRAP = $home/$d
}
for(p in $path){
	if(! test -x $GOROOT_BOOTSTRAP/bin/go){
		GOROOT_BOOTSTRAP = ()
		if(go_exe = `{path=$p whatis go}){
			goroot = `{bootstrapenv $go_exe env GOROOT}
			if(! ~ $goroot $GOROOT){
				if(~ $goroot_bootstrap_set 'true'){
					echo 'WARNING: '$GOROOT_BOOTSTRAP'/bin/go does not exist, found '$go_exe' from env' >[1=2]
					echo 'WARNING: set '$goroot' as GOROOT_BOOTSTRAP' >[1=2]
				}
				GOROOT_BOOTSTRAP = $goroot
			}
		}
	}
}
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 '$bootgo'.' >[1=2]
	exit bootstrap
}
if(~ $GOROOT_BOOTSTRAP $GOROOT){
	echo 'ERROR: $GOROOT_BOOTSTRAP must not be set to $GOROOT' >[1=2]
	echo 'Set $GOROOT_BOOTSTRAP to a working Go tree >= Go '$bootgo'.' >[1=2]
	exit bootstrap
}

# Get the exact bootstrap toolchain version to help with debugging.
# We clear GOOS and GOARCH to avoid an ominous but harmless warning if
# the bootstrap doesn't support them.
GOROOT_BOOTSTRAP_VERSION=`{bootstrapenv $GOROOT_BOOTSTRAP/bin/go version | sed 's/go version //'}
echo 'Building Go cmd/dist using '$GOROOT_BOOTSTRAP'. ('$"GOROOT_BOOTSTRAP_VERSION')'
if(~ $#vflag 1)
	echo cmd/dist
bootstrapenv $GOROOT_BOOTSTRAP/bin/go build -o cmd/dist/dist ./cmd/dist

eval `{./cmd/dist/dist env -9}
if(~ $#vflag 1)
	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
}

# Run dist bootstrap to complete make.bash.
# Bootstrap installs a proper cmd/dist, built with the new toolchain.
# Throw ours, built with the bootstrap toolchain, away after bootstrap.
./cmd/dist/dist bootstrap -a $vflag $*
rm -f ./cmd/dist/dist

# DO NOT ADD ANY NEW CODE HERE.
# The bootstrap+rm above are the final step of make.rc.
# If something must be added, add it to cmd/dist's cmdbootstrap,
# to avoid needing three copies in three different shell languages
# (make.bash, make.bat, make.rc).
