diff --git a/scripts/build-setup.sh b/scripts/build-setup.sh index 080b79af..c58ddd7b 100755 --- a/scripts/build-setup.sh +++ b/scripts/build-setup.sh @@ -109,15 +109,49 @@ if [ $TOOLCHAIN_TYPE == "esp-tools" ]; then done fi + +####################################### +###### BEGIN STEP-BY-STEP SETUP ####### +####################################### + +# In order to run code on error, we must handle errors manually +set +e; + +function begin_step +{ + thisStepNum=$1; + thisStepDesc=$2; + echo " ========== BEGINNING STEP $thisStepNum: $thisStepDesc ==========" +} +function exit_if_last_command_failed +{ + local exitcode=$?; + if [ $exitcode -ne 0 ]; then + die "Build script failed with exit code $exitcode at step $thisStepNum: $thisStepDesc" $exitcode; + fi +} + # setup and install conda environment if run_step "1"; then - try; ( - source $CYDIR/scripts/build-step-init-conda-environment.sh - ) - catch || { - echo "Build script exited with exit code $? at step 1: conda environment setup. Check the above logs for more details on the error." - exit $? - } + begin_step "1" "Conda environment setup" + # note: lock file must end in .conda-lock.yml - see https://github.com/conda-incubator/conda-lock/issues/154 + CONDA_REQS=$CYDIR/conda-reqs + CONDA_LOCK_REQS=$CONDA_REQS/conda-lock-reqs + # must match with the file generated by generate-conda-lockfile.sh + LOCKFILE=$CONDA_LOCK_REQS/conda-requirements-$TOOLCHAIN_TYPE-linux-64.conda-lock.yml + + if [ "$USE_UNPINNED_DEPS" = true ]; then + # auto-gen the lockfiles + $CYDIR/scripts/generate-conda-lockfiles.sh + exit_if_last_command_failed + fi + + # use conda-lock to create env + conda-lock install --conda $(which conda) -p $CYDIR/.conda-env $LOCKFILE && + + source $CYDIR/.conda-env/etc/profile.d/conda.sh && + conda activate $CYDIR/.conda-env + exit_if_last_command_failed fi if [ -z "$FORCE_FLAG" ]; then @@ -129,17 +163,14 @@ fi # initialize all submodules (without the toolchain submodules) if run_step "2"; then - try; ( - $CYDIR/scripts/init-submodules-no-riscv-tools.sh $FORCE_FLAG - ) - catch || { - echo "Build script exited with exit code $? at step 2: submodule initialization. Check the above logs for more details on the error." - exit $? - } + begin_step "2" "Initializing Chipyard submodules" + $CYDIR/scripts/init-submodules-no-riscv-tools.sh $FORCE_FLAG + exit_if_last_command_failed fi # build extra toolchain collateral (i.e. spike, pk, riscv-tests, libgloss) if run_step "3"; then + begin_step "3" "Building toolchain collateral" if run_step "1"; then PREFIX=$CONDA_PREFIX/$TOOLCHAIN_TYPE else @@ -149,95 +180,74 @@ if run_step "3"; then fi PREFIX=$RISCV fi - try; ( - $CYDIR/scripts/build-toolchain-extra.sh $TOOLCHAIN_TYPE -p $PREFIX - ) - catch || { - echo "Build script exited with exit code $? at step 3: toolchain collateral. Check the above logs for more details on the error." - exit $? - } + $CYDIR/scripts/build-toolchain-extra.sh $TOOLCHAIN_TYPE -p $PREFIX + exit_if_last_command_failed fi # run ctags for code navigation if run_step "4"; then - try; ( + begin_step "4" "Running ctags for code navigation" $CYDIR/scripts/gen-tags.sh - ) - catch || { - echo "Build script exited with exit code $? at step 4: ctags generation. Check the above logs for more details on the error." - exit $? - } + exit_if_last_command_failed fi # precompile chipyard scala sources if run_step "5"; then - try; ( - source $CYDIR/scripts/build-step-precompile-chipyard-scala.sh - ) - catch || { - echo "Build script exited with exit code $? at step 5: chipyard pre-compile sources. Check the above logs for more details on the error." - exit $? - } + begin_step "5" "Pre-compiling Chipyard Scala sources" + pushd $CYDIR/sims/verilator + make launch-sbt SBT_COMMAND=";project chipyard; compile" + make launch-sbt SBT_COMMAND=";project tapeout; compile" + popd + exit_if_last_command_failed fi # setup firesim if run_step "6"; then - try; ( - $CYDIR/scripts/firesim-setup.sh && + begin_step "6" "Setting up FireSim" + $CYDIR/scripts/firesim-setup.sh $CYDIR/sims/firesim/gen-tags.sh - ) - catch || { - echo "Build script exited with exit code $? at step 6: firesim setup. Check the above logs for more details on the error." - exit $? - } + exit_if_last_command_failed # precompile firesim scala sources if run_step "7"; then - try; ( - source $CYDIR/scripts/build-step-precompile-firesim-scala.sh + begin_step "7" "Pre-compiling Firesim Scala sources" + pushd $CYDIR/sims/firesim + ( + set -e # Subshells un-set "set -e" so it must be re enabled + echo $CYDIR + source sourceme-manager.sh --skip-ssh-setup + pushd sim + make sbt SBT_COMMAND="project {file:$CYDIR}firechip; compile" TARGET_PROJECT=firesim + popd ) - catch || { - echo "Build script exited with exit code $? at step 7: firesim pre-compile sources. Check the above logs for more details on the error." - exit $? - } + exit_if_last_command_failed + popd fi fi # setup firemarshal if run_step "8"; then + begin_step "8" "Setting up FireMarshal" pushd $CYDIR/software/firemarshal - try; ( - ./init-submodules.sh - ) - catch || { - echo "Build script exited with exit code $? at step 8: firemarshal setup. Check the above logs for more details on the error." - exit $? - } + ./init-submodules.sh + exit_if_last_command_failed # precompile firemarshal buildroot sources if run_step "9"; then - try; ( - source $CYDIR/scripts/fix-open-files.sh && - ./marshal $VERBOSE_FLAG build br-base.json && - ./marshal $VERBOSE_FLAG clean br-base.json - ) - catch || { - echo "Build script exited with exit code $? at step 9: firemarshal pre-compile buildroot sources. Check the above logs for more details on the error." - exit $? - } + begin_step "9" "Pre-compiling FireMarshal buildroot sources" + source $CYDIR/scripts/fix-open-files.sh && + ./marshal $VERBOSE_FLAG build br-base.json && + ./marshal $VERBOSE_FLAG clean br-base.json + exit_if_last_command_failed fi popd fi # do misc. cleanup for a "clean" git status if run_step "10"; then - try; ( - $CYDIR/scripts/repo-clean.sh - ) - catch || { - echo "Build script exited with exit code $? at step 10: repository cleanup. Check the above logs for more details on the error." - exit $? - } + begin_step "10" "Cleaning up repository" + $CYDIR/scripts/repo-clean.sh + exit_if_last_command_failed fi cat <> env.sh diff --git a/scripts/utils.sh b/scripts/utils.sh index 6f0fc5f7..30d3e092 100755 --- a/scripts/utils.sh +++ b/scripts/utils.sh @@ -53,24 +53,3 @@ function restore_bash_options { set +vx; eval "$OLDSTATE" } - -####################################### -# Basic try-catch block implementation -# for bash scripts. -# Usage: try; ( run commands ) -# catch || { handle error } -# Source: https://stackoverflow.com/a/25180186/5121242 -####################################### -function try() -{ - [[ $- = *e* ]]; SAVED_OPT_E=$? - set +e -} - -function catch() -{ - export ex_code=$? - (( $SAVED_OPT_E )) && set +e - return $ex_code -} -