Home | History | Annotate | Download | only in src
      1 #!/usr/bin/env bash
      2 # Copyright 2009 The Go Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style
      4 # license that can be found in the LICENSE file.
      5 
      6 # See golang.org/s/go15bootstrap for an overview of the build process.
      7 
      8 # Environment variables that control make.bash:
      9 #
     10 # GOROOT_FINAL: The expected final Go root, baked into binaries.
     11 # The default is the location of the Go tree during the build.
     12 #
     13 # GOHOSTARCH: The architecture for host tools (compilers and
     14 # binaries).  Binaries of this type must be executable on the current
     15 # system, so the only common reason to set this is to set
     16 # GOHOSTARCH=386 on an amd64 machine.
     17 #
     18 # GOARCH: The target architecture for installed packages and tools.
     19 #
     20 # GOOS: The target operating system for installed packages and tools.
     21 #
     22 # GO_GCFLAGS: Additional go tool compile arguments to use when
     23 # building the packages and commands.
     24 #
     25 # GO_LDFLAGS: Additional go tool link arguments to use when
     26 # building the commands.
     27 #
     28 # CGO_ENABLED: Controls cgo usage during the build. Set it to 1
     29 # to include all cgo related files, .c and .go file with "cgo"
     30 # build directive, in the build. Set it to 0 to ignore them.
     31 #
     32 # GO_EXTLINK_ENABLED: Set to 1 to invoke the host linker when building
     33 # packages that use cgo.  Set to 0 to do all linking internally.  This
     34 # controls the default behavior of the linker's -linkmode option.  The
     35 # default value depends on the system.
     36 #
     37 # CC: Command line to run to compile C code for GOHOSTARCH.
     38 # Default is "gcc". Also supported: "clang".
     39 #
     40 # CC_FOR_TARGET: Command line to run to compile C code for GOARCH.
     41 # This is used by cgo.  Default is CC.
     42 #
     43 # CXX_FOR_TARGET: Command line to run to compile C++ code for GOARCH.
     44 # This is used by cgo. Default is CXX, or, if that is not set, 
     45 # "g++" or "clang++".
     46 #
     47 # FC: Command line to run to compile Fortran code for GOARCH.
     48 # This is used by cgo. Default is "gfortran".
     49 #
     50 # PKG_CONFIG: Path to pkg-config tool. Default is "pkg-config".
     51 #
     52 # GO_DISTFLAGS: extra flags to provide to "dist bootstrap".
     53 # (Or just pass them to the make.bash command line.)
     54 #
     55 # GOBUILDTIMELOGFILE: If set, make.bash and all.bash write
     56 # timing information to this file. Useful for profiling where the
     57 # time goes when these scripts run.
     58 #
     59 # GOROOT_BOOTSTRAP: A working Go tree >= Go 1.4 for bootstrap.
     60 # If $GOROOT_BOOTSTRAP/bin/go is missing, $(go env GOROOT) is
     61 # tried for all "go" in $PATH. $HOME/go1.4 by default.
     62 
     63 set -e
     64 
     65 unset GOBIN # Issue 14340
     66 
     67 if [ ! -f run.bash ]; then
     68 	echo 'make.bash must be run from $GOROOT/src' 1>&2
     69 	exit 1
     70 fi
     71 
     72 if [ "$GOBUILDTIMELOGFILE" != "" ]; then
     73 	echo $(LC_TIME=C date) start make.bash >"$GOBUILDTIMELOGFILE"
     74 fi
     75 
     76 # Test for Windows.
     77 case "$(uname)" in
     78 *MINGW* | *WIN32* | *CYGWIN*)
     79 	echo 'ERROR: Do not use make.bash to build on Windows.'
     80 	echo 'Use make.bat instead.'
     81 	echo
     82 	exit 1
     83 	;;
     84 esac
     85 
     86 # Test for bad ld.
     87 if ld --version 2>&1 | grep 'gold.* 2\.20' >/dev/null; then
     88 	echo 'ERROR: Your system has gold 2.20 installed.'
     89 	echo 'This version is shipped by Ubuntu even though'
     90 	echo 'it is known not to work on Ubuntu.'
     91 	echo 'Binaries built with this linker are likely to fail in mysterious ways.'
     92 	echo
     93 	echo 'Run sudo apt-get remove binutils-gold.'
     94 	echo
     95 	exit 1
     96 fi
     97 
     98 # Test for bad SELinux.
     99 # On Fedora 16 the selinux filesystem is mounted at /sys/fs/selinux,
    100 # so loop through the possible selinux mount points.
    101 for se_mount in /selinux /sys/fs/selinux
    102 do
    103 	if [ -d $se_mount -a -f $se_mount/booleans/allow_execstack -a -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then
    104 		if ! cat $se_mount/booleans/allow_execstack | grep -c '^1 1$' >> /dev/null ; then
    105 			echo "WARNING: the default SELinux policy on, at least, Fedora 12 breaks "
    106 			echo "Go. You can enable the features that Go needs via the following "
    107 			echo "command (as root):"
    108 			echo "  # setsebool -P allow_execstack 1"
    109 			echo
    110 			echo "Note that this affects your system globally! "
    111 			echo
    112 			echo "The build will continue in five seconds in case we "
    113 			echo "misdiagnosed the issue..."
    114 
    115 			sleep 5
    116 		fi
    117 	fi
    118 done
    119 
    120 # Test for debian/kFreeBSD.
    121 # cmd/dist will detect kFreeBSD as freebsd/$GOARCH, but we need to
    122 # disable cgo manually.
    123 if [ "$(uname -s)" = "GNU/kFreeBSD" ]; then
    124 	export CGO_ENABLED=0
    125 fi
    126 
    127 # Clean old generated file that will cause problems in the build.
    128 rm -f ./runtime/runtime_defs.go
    129 
    130 # Finally!  Run the build.
    131 
    132 verbose=false
    133 vflag=""
    134 if [ "$1" = "-v" ]; then
    135 	verbose=true
    136 	vflag=-v
    137 	shift
    138 fi
    139 
    140 export GOROOT_BOOTSTRAP=${GOROOT_BOOTSTRAP:-$HOME/go1.4}
    141 export GOROOT="$(cd .. && pwd)"
    142 IFS=$'\n'; for go_exe in $(type -ap go); do
    143 	if [ ! -x "$GOROOT_BOOTSTRAP/bin/go" ]; then
    144 		goroot=$(GOROOT='' "$go_exe" env GOROOT)
    145 		if [ "$goroot" != "$GOROOT" ]; then
    146 			GOROOT_BOOTSTRAP=$goroot
    147 		fi
    148 	fi
    149 done; unset IFS
    150 echo "Building Go cmd/dist using $GOROOT_BOOTSTRAP."
    151 if $verbose; then
    152 	echo cmd/dist
    153 fi
    154 if [ ! -x "$GOROOT_BOOTSTRAP/bin/go" ]; then
    155 	echo "ERROR: Cannot find $GOROOT_BOOTSTRAP/bin/go." >&2
    156 	echo "Set \$GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4." >&2
    157 	exit 1
    158 fi
    159 if [ "$GOROOT_BOOTSTRAP" = "$GOROOT" ]; then
    160 	echo "ERROR: \$GOROOT_BOOTSTRAP must not be set to \$GOROOT" >&2
    161 	echo "Set \$GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4." >&2
    162 	exit 1
    163 fi
    164 rm -f cmd/dist/dist
    165 GOROOT="$GOROOT_BOOTSTRAP" GOOS="" GOARCH="" "$GOROOT_BOOTSTRAP/bin/go" build -o cmd/dist/dist ./cmd/dist
    166 
    167 # -e doesn't propagate out of eval, so check success by hand.
    168 eval $(./cmd/dist/dist env -p || echo FAIL=true)
    169 if [ "$FAIL" = true ]; then
    170 	exit 1
    171 fi
    172 
    173 if $verbose; then
    174 	echo
    175 fi
    176 
    177 if [ "$1" = "--dist-tool" ]; then
    178 	# Stop after building dist tool.
    179 	mkdir -p "$GOTOOLDIR"
    180 	if [ "$2" != "" ]; then
    181 		cp cmd/dist/dist "$2"
    182 	fi
    183 	mv cmd/dist/dist "$GOTOOLDIR"/dist
    184 	exit 0
    185 fi
    186 
    187 buildall="-a"
    188 if [ "$1" = "--no-clean" ]; then
    189 	buildall=""
    190 	shift
    191 fi
    192 
    193 # Run dist bootstrap to complete make.bash.
    194 # Bootstrap installs a proper cmd/dist, built with the new toolchain.
    195 # Throw ours, built with Go 1.4, away after bootstrap.
    196 ./cmd/dist/dist bootstrap $buildall $vflag $GO_DISTFLAGS "$@"
    197 rm -f ./cmd/dist/dist
    198 
    199 # DO NOT ADD ANY NEW CODE HERE.
    200 # The bootstrap+rm above are the final step of make.bash.
    201 # If something must be added, add it to cmd/dist's cmdbootstrap,
    202 # to avoid needing three copies in three different shell languages
    203 # (make.bash, make.bat, make.rc).
    204