diff --git a/build-setup.sh b/build-setup.sh index c73e8085..5f302b55 100755 --- a/build-setup.sh +++ b/build-setup.sh @@ -28,7 +28,7 @@ usage() { echo "Options" echo " --help -h : Display this message" echo " --unpinned-deps -ud : Use unpinned conda environment" - echo " --skip-validate : Skip prompt checking for tagged release/conda" + echo " --batch : Skip prompt checking for tagged release/conda" echo " --skip-conda : Skip conda env creation" echo " --skip-toolchain-extra : Skip building extra RISC-V toolchain collateral (Spike, PK, tests, libgloos)" exit "$1" @@ -36,7 +36,7 @@ usage() { TOOLCHAIN="riscv-tools" USE_PINNED_DEPS=true -SKIP_VALIDATE_FLAG="" +BATCH_FLAG="" SKIP_CONDA=false SKIP_TOOLCHAIN=false @@ -50,8 +50,8 @@ do TOOLCHAIN=$1 ;; -ud | --unpinned-deps ) USE_PINNED_DEPS=false ;; - --skip-validate) - SKIP_VALIDATE_FLAG=$1 ;; + --batch) + BATCH_FLAG=$1 ;; --skip-conda) SKIP_CONDA=true ;; --skip-toolchain-extra) @@ -80,19 +80,21 @@ if [ "$SKIP_CONDA" = false ]; then conda activate $DIR/.conda-env fi -if [ -z "$SKIP_VALIDATE_FLAG" ]; then +if [ -z "$BATCH_FLAG" ]; then if [ -z ${CONDA_DEFAULT_ENV+x} ]; then error "ERROR: No conda environment detected. Did you activate the conda environment (e.x. 'conda activate base')?" exit 1 fi fi -$DIR/scripts/init-submodules-no-riscv-tools.sh $SKIP_VALIDATE_FLAG +$DIR/scripts/init-submodules-no-riscv-tools.sh $BATCH_FLAG if [ "$SKIP_TOOLCHAIN" = false ]; then - $DIR/scripts/build-toolchain-extra.sh $SKIP_VALIDATE_FLAG $TOOLCHAIN + $DIR/scripts/build-toolchain-extra.sh $BATCH_FLAG $TOOLCHAIN fi +$DIR/scripts/gen-tags.sh + cat << EOT >> env.sh # line auto-generated by $0 conda activate $DIR/.conda-env diff --git a/scripts/build-toolchain-extra.sh b/scripts/build-toolchain-extra.sh index dfdcbc9a..3d7a25e0 100755 --- a/scripts/build-toolchain-extra.sh +++ b/scripts/build-toolchain-extra.sh @@ -1,22 +1,15 @@ #!/usr/bin/env bash -# this script is based on the firesim build toolchains script - # exit script if any command fails set -e set -o pipefail -# On macOS, use GNU readlink from 'coreutils' package in Homebrew/MacPorts -if [ "$(uname -s)" = "Darwin" ] ; then - READLINK=greadlink -else - READLINK=readlink -fi +RDIR=$(git rev-parse --show-toplevel) -# If BASH_SOURCE is undefined, we may be running under zsh, in that case -# provide a zsh-compatible alternative -DIR="$(dirname "$($READLINK -f "${BASH_SOURCE[0]:-${(%):-%x}}")")" -CHIPYARD_DIR="$(dirname "$DIR")" +# get helpful utilities +source $RDIR/scripts/utils.sh + +common_setup # Allow user to override MAKE [ -n "${MAKE:+x}" ] || MAKE=$(command -v gnumake || command -v gmake || command -v make) @@ -33,29 +26,21 @@ usage() { echo " --prefix PREFIX : Install destination. If unset, defaults to $CONDA_PREFIX/riscv-tools" echo " or $CONDA_PREFIX/esp-tools" echo " --clean-after-install : Run make clean in calls to module_make and module_build" - echo " --skip-validate : Skip prompt checking for conda" + echo " --batch : Skip prompt checking for conda" echo " --help -h : Display this message" exit "$1" } -error() { - echo "${0##*/}: ${1}" >&2 -} -die() { - error "$1" - exit "${2:--1}" -} - TOOLCHAIN="riscv-tools" CLEANAFTERINSTALL="" RISCV="" -SKIP_VALIDATE=false +BATCH=false # getopts does not support long options, and is inflexible while [ "$1" != "" ]; do case $1 in - -h | --help | help ) + -h | -H | --help | help ) usage 3 ;; -p | --prefix ) shift @@ -64,8 +49,8 @@ do CLEANAFTERINSTALL="true" ;; riscv-tools | esp-tools) TOOLCHAIN=$1 ;; - --skip-validate) - SKIP_VALIDATE=true; + --batch) + BATCH=true; ;; * ) error "invalid option $1" @@ -74,7 +59,7 @@ do shift done -if [ "$SKIP_VALIDATE" = false ]; then +if [ "$BATCH" = false ]; then if [ -z ${CONDA_DEFAULT_ENV+x} ]; then error "ERROR: No conda environment detected. Did you activate the conda environment (e.x. 'conda activate chipyard')?" exit 1 @@ -82,7 +67,7 @@ if [ "$SKIP_VALIDATE" = false ]; then fi if [ -z "$RISCV" ] ; then - RISCV="$CONDA_PREFIX/$TOOLCHAIN" + RISCV="$CONDA_PREFIX/$TOOLCHAIN" fi XLEN=64 @@ -92,7 +77,7 @@ echo "Installing extra toolchain utilities/tests to $RISCV" # install risc-v tools export RISCV="$RISCV" -cd "${CHIPYARD_DIR}" +cd "${RDIR}" SRCDIR="$(pwd)/toolchains/${TOOLCHAIN}" [ -d "${SRCDIR}" ] || die "unsupported toolchain: ${TOOLCHAIN}" diff --git a/scripts/firesim-setup.sh b/scripts/firesim-setup.sh index a7f265f1..2572ffc2 100755 --- a/scripts/firesim-setup.sh +++ b/scripts/firesim-setup.sh @@ -5,13 +5,12 @@ set -e set -o pipefail -RDIR=$(pwd) -scripts_dir="$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" >/dev/null 2>&1 && pwd )" +RDIR=$(git rev-parse --show-toplevel) -cd "${scripts_dir}/.." +cd "$RDIR" # Reenable the FireSim submodule git config --unset submodule.sims/firesim.update || true -cd sims/firesim +pushd sims/firesim ./build-setup.sh "$@" --library --skip-validate -cd "$RDIR" +popd diff --git a/scripts/init-submodules-no-riscv-tools-nolog.sh b/scripts/init-submodules-no-riscv-tools-nolog.sh index 5d79dd8d..a18ad429 100755 --- a/scripts/init-submodules-no-riscv-tools-nolog.sh +++ b/scripts/init-submodules-no-riscv-tools-nolog.sh @@ -4,27 +4,34 @@ set -e set -o pipefail -SKIP_VALIDATE=false +RDIR=$(git rev-parse --show-toplevel) + +# get helpful utilities +source $RDIR/scripts/utils.sh + +common_setup function usage { - echo "Usage: $0 [--skip-validate]" + echo "Usage: $0 [--batch]" echo "Initialize Chipyard submodules and setup initial env.sh script." echo "" - echo " --skip-validate Skip prompt checking for tagged release" + echo " --batch Skip prompt checking for tagged release" } +BATCH=false while test $# -gt 0 do case "$1" in - --skip-validate) - SKIP_VALIDATE=true; + --batch) + BATCH=true; ;; - -h | -H | --help) + -h | -H | --help | help) usage exit 1 ;; - *) echo "ERROR: bad argument $1" + *) + echo "ERROR: bad argument $1" usage exit 2 ;; @@ -32,47 +39,36 @@ do shift done -# Check that git version is at least 1.7.8 -MYGIT=$(git --version) -MYGIT=${MYGIT#'git version '} # Strip prefix -case ${MYGIT} in -[1-9]*) ;; -*) echo 'warning: unknown git version' ;; -esac -MINGIT="1.8.5" -if [ "$MINGIT" != "$(echo -e "$MINGIT\n$MYGIT" | sort -V | head -n1)" ]; then - echo "This script requires git version $MINGIT or greater. Exiting." - false -fi - # before doing anything verify that you are on a release branch/tag +save_bash_options set +e -tag=$(git describe --exact-match --tags) -tag_ret_code=$? -set -e -if [ $tag_ret_code -ne 0 ]; then - if [ "$SKIP_VALIDATE" = false ]; then - read -p "WARNING: You are not on an official release of Chipyard."$'\n'"Type \"y\" to continue if this is intended, otherwise see https://chipyard.readthedocs.io/en/stable/Chipyard-Basics/Initial-Repo-Setup.html#setting-up-the-chipyard-repo: " validate - [[ $validate == [yY] ]] || exit 3 - echo "Setting up non-official Chipyard release" +git_tag=$(git describe --exact-match --tags) +git_tag_rc=$? +restore_bash_options +if [ "$git_tag_rc" -ne 0 ]; then + if [ "$BATCH" == false ]; then + while true; do + read -p "WARNING: You are not on an official release of Chipyard."$'\n'"Type \"y\" to continue if this is intended or \"n\" if not: " validate + case "$validate" in + y | Y) + echo "Continuing on to setting up non-official Chipyard release repository" + break + ;; + n | N) + error "See https://chipyard.readthedocs.io/en/stable/Chipyard-Basics/Initial-Repo-Setup.html#setting-up-the-chipyard-repo for setting up an official release of Chipyard. " + exit 3 + ;; + *) + error "Invalid response. Please type \"y\" or \"n\"" + ;; + esac + done fi else - echo "Setting up official Chipyard release: $tag" + echo "Setting up official Chipyard release: $git_tag" fi -# On macOS, use GNU readlink from 'coreutils' package in Homebrew/MacPorts -if [ "$(uname -s)" = "Darwin" ] ; then - READLINK=greadlink -else - READLINK=readlink -fi - -# If BASH_SOURCE is undefined we may be running under zsh, in that case -# provide a zsh-compatible alternative -DIR="$(dirname "$($READLINK -f "${BASH_SOURCE[0]:-${(%):-%x}}")")" -CHIPYARD_DIR="$(dirname "$DIR")" - -cd "$CHIPYARD_DIR" +cd "$RDIR" ( # Blocklist of submodules to initially skip: @@ -106,29 +102,28 @@ cd "$CHIPYARD_DIR" _unskip() { git config --local --unset-all "submodule.${1}.update" || : ; } trap 'git_submodule_exclude _unskip' EXIT INT TERM - set -x - git_submodule_exclude _skip - git submodule update --init --recursive #--jobs 8 - set +x + ( + set -x + git_submodule_exclude _skip + git submodule update --init --recursive #--jobs 8 + ) ) -set -x +( + # Non-recursive clone to exclude riscv-linux + git submodule update --init generators/sha3 -# Non-recursive clone to exclude riscv-linux -git submodule update --init generators/sha3 + # Non-recursive clone to exclude gemmini-software + git submodule update --init generators/gemmini + git -C generators/gemmini/ submodule update --init --recursive software/gemmini-rocc-tests -# Non-recursive clone to exclude gemmini-software -git submodule update --init generators/gemmini -git -C generators/gemmini/ submodule update --init --recursive software/gemmini-rocc-tests + # Minimal non-recursive clone to initialize sbt dependencies + git submodule update --init sims/firesim + git config --local submodule.sims/firesim.update none -# Minimal non-recursive clone to initialize sbt dependencies -git submodule update --init sims/firesim -git config --local submodule.sims/firesim.update none - -# Only shallow clone needed for basic SW tests -git submodule update --init software/firemarshal - -set +x + # Only shallow clone needed for basic SW tests + git submodule update --init software/firemarshal +) # Configure firemarshal to know where our firesim installation is if [ ! -f ./software/firemarshal/marshal-config.yaml ]; then diff --git a/scripts/utils.sh b/scripts/utils.sh new file mode 100644 index 00000000..30d3e092 --- /dev/null +++ b/scripts/utils.sh @@ -0,0 +1,55 @@ +#/usr/bin/env bash + +####################################### +# Common setup. Init MacOS compatibility +# variables. +# Globals: +# READLINK +####################################### +function common_setup +{ + # On macOS, use GNU readlink from 'coreutils' package in Homebrew/MacPorts + if [ "$(uname -s)" = "Darwin" ] ; then + READLINK=greadlink + else + READLINK=readlink + fi +} + +####################################### +# Error echo wrapper +####################################### +function error +{ + echo "${0##*/}: ${1}" >&2 +} + +####################################### +# Error then exit wrapper +# Arguments: +# string to print before exit +# (optional) int error code +####################################### +function die +{ + error "$1" + exit "${2:--1}" +} + +####################################### +# Save bash options. Must be called +# before a corresponding `restore_bash_options`. +####################################### +function save_bash_options +{ + OLDSTATE=$(set +o) +} + +####################################### +# Restore bash options. Must be called +# after a corresponding `save_bash_options`. +####################################### +function restore_bash_options +{ + set +vx; eval "$OLDSTATE" +}