Home | History | Annotate | Download | only in blueprint
      1 #!/bin/bash
      2 
      3 # This script serves two purposes.  First, it can bootstrap the standalone
      4 # Blueprint to generate the minibp binary.  To do this simply run the script
      5 # with no arguments from the desired build directory.
      6 #
      7 # It can also be invoked from another script to bootstrap a custom Blueprint-
      8 # based build system.  To do this, the invoking script must first set some or
      9 # all of the following environment variables, which are documented below where
     10 # their default values are set:
     11 #
     12 #   BOOTSTRAP
     13 #   WRAPPER
     14 #   SRCDIR
     15 #   BLUEPRINTDIR
     16 #   BUILDDIR
     17 #   NINJA_BUILDDIR
     18 #   GOROOT
     19 #
     20 # The invoking script should then run this script, passing along all of its
     21 # command line arguments.
     22 
     23 set -e
     24 
     25 EXTRA_ARGS=""
     26 
     27 # BOOTSTRAP should be set to the path of the bootstrap script.  It can be
     28 # either an absolute path or one relative to the build directory (which of
     29 # these is used should probably match what's used for SRCDIR).
     30 if [ -z "$BOOTSTRAP" ]; then
     31     BOOTSTRAP="${BASH_SOURCE[0]}"
     32 
     33     # WRAPPER should only be set if you want a ninja wrapper script to be
     34     # installed into the builddir. It is set to blueprint's blueprint.bash
     35     # only if BOOTSTRAP and WRAPPER are unset.
     36     [ -z "$WRAPPER" ] && WRAPPER="`dirname "${BOOTSTRAP}"`/blueprint.bash"
     37 fi
     38 
     39 # SRCDIR should be set to the path of the root source directory.  It can be
     40 # either an absolute path or a path relative to the build directory.  Whether
     41 # its an absolute or relative path determines whether the build directory can
     42 # be moved relative to or along with the source directory without re-running
     43 # the bootstrap script.
     44 [ -z "$SRCDIR" ] && SRCDIR=`dirname "${BOOTSTRAP}"`
     45 
     46 # BLUEPRINTDIR should be set to the path to the blueprint source. It generally
     47 # should start with SRCDIR.
     48 [ -z "$BLUEPRINTDIR" ] && BLUEPRINTDIR="${SRCDIR}"
     49 
     50 # BUILDDIR should be set to the path to store build results. By default, this
     51 # is the current directory, but it may be set to an absolute or relative path.
     52 [ -z "$BUILDDIR" ] && BUILDDIR=.
     53 
     54 # NINJA_BUILDDIR should be set to the path to store the .ninja_log/.ninja_deps
     55 # files. By default this is the same as $BUILDDIR.
     56 [ -z "$NINJA_BUILDDIR" ] && NINJA_BUILDDIR="${BUILDDIR}"
     57 
     58 # TOPNAME should be set to the name of the top-level Blueprints file
     59 [ -z "$TOPNAME" ] && TOPNAME="Blueprints"
     60 
     61 # These variables should be set by auto-detecting or knowing a priori the host
     62 # Go toolchain properties.
     63 [ -z "$GOROOT" ] && GOROOT=`go env GOROOT`
     64 
     65 usage() {
     66     echo "Usage of ${BOOTSTRAP}:"
     67     echo "  -h: print a help message and exit"
     68     echo "  -b <builddir>: set the build directory"
     69     echo "  -t: run tests"
     70 }
     71 
     72 # Parse the command line flags.
     73 while getopts ":b:ht" opt; do
     74     case $opt in
     75         b) BUILDDIR="$OPTARG";;
     76         t) RUN_TESTS=true;;
     77         h)
     78             usage
     79             exit 1
     80             ;;
     81         \?)
     82             echo "Invalid option: -$OPTARG" >&2
     83             usage
     84             exit 1
     85             ;;
     86         :)
     87             echo "Option -$OPTARG requires an argument." >&2
     88             exit 1
     89             ;;
     90     esac
     91 done
     92 
     93 # If RUN_TESTS is set, behave like -t was passed in as an option.
     94 [ ! -z "$RUN_TESTS" ] && EXTRA_ARGS="${EXTRA_ARGS} -t"
     95 
     96 # Allow the caller to pass in a list of module files
     97 if [ -z "${BLUEPRINT_LIST_FILE}" ]; then
     98   BLUEPRINT_LIST_FILE="${BUILDDIR}/.bootstrap/bplist"
     99 fi
    100 EXTRA_ARGS="${EXTRA_ARGS} -l ${BLUEPRINT_LIST_FILE}"
    101 
    102 mkdir -p $BUILDDIR/.minibootstrap
    103 
    104 echo "bootstrapBuildDir = $BUILDDIR" > $BUILDDIR/.minibootstrap/build.ninja
    105 echo "topFile = $SRCDIR/$TOPNAME" >> $BUILDDIR/.minibootstrap/build.ninja
    106 echo "extraArgs = $EXTRA_ARGS" >> $BUILDDIR/.minibootstrap/build.ninja
    107 echo "builddir = $NINJA_BUILDDIR" >> $BUILDDIR/.minibootstrap/build.ninja
    108 echo "include $BLUEPRINTDIR/bootstrap/build.ninja" >> $BUILDDIR/.minibootstrap/build.ninja
    109 
    110 echo "BLUEPRINT_BOOTSTRAP_VERSION=2" > $BUILDDIR/.blueprint.bootstrap
    111 echo "SRCDIR=\"${SRCDIR}\"" >> $BUILDDIR/.blueprint.bootstrap
    112 echo "BLUEPRINTDIR=\"${BLUEPRINTDIR}\"" >> $BUILDDIR/.blueprint.bootstrap
    113 echo "NINJA_BUILDDIR=\"${NINJA_BUILDDIR}\"" >> $BUILDDIR/.blueprint.bootstrap
    114 echo "GOROOT=\"${GOROOT}\"" >> $BUILDDIR/.blueprint.bootstrap
    115 echo "TOPNAME=\"${TOPNAME}\"" >> $BUILDDIR/.blueprint.bootstrap
    116 
    117 touch "${BUILDDIR}/.out-dir"
    118 
    119 if [ ! -z "$WRAPPER" ]; then
    120     cp $WRAPPER $BUILDDIR/
    121 fi
    122