blob: 81ae8bd4114046e31c033a5a824cfd81de396d0a [file] [log] [blame]
# Azure Pipelines CI build configuration
# Documentation at https://aka.ms/yaml
variables:
VERILATOR_VERSION: 4.010
VERILATOR_PATH: /opt/buildcache/verilator/$(VERILATOR_VERSION)
TOOLCHAIN_PATH: /opt/buildcache/riscv
# Release tag from https://github.com/lowRISC/lowrisc-toolchains/releases
TOOLCHAIN_VERSION: 20190827-2
trigger:
# Combine builds on master as long as another build is running
batch: true
branches:
include:
- master
stages:
# Stage 1 are fast checks for tools which provide fast turnaround time
# (< 5 minutes)
- stage: quick_sanity
displayName: Quick sanity checks
jobs:
- job: "lint"
displayName: "Run code quality checks (lint)"
pool: "Default"
steps:
- bash: |
sudo apt-get install -y python3 python3-pip build-essential srecord python3-setuptools zlib1g-dev libusb-1.0 clang-format
sudo pip3 install -r python-requirements.txt
displayName: 'Install dependencies'
- bash: |
python3 --version
yapf --version
isort --version
clang-format -version
displayName: 'Display tool versions'
# XXX: Python lint checks are until Issue #313 is resolved
# - bash: find ./util -iname '*.py' -print0 | xargs -0 -n1 $PWD/util/lintpy.py -f
# displayName: 'Run Python lint'
- bash: |
make -C hw regs && git diff --exit-code
if [ $? != 0 ]; then
echo -n "##vso[task.logissue type=error]"
echo "Register headers not up-to-date. Regenerate them with 'make -C hw regs'."
exit 1
fi
condition: always()
displayName: 'Ensure all generated files are clean and up-to-date'
- bash: |
# XXX: As of today, task.logissue comments with 'sourcepath' set don't
# get reported to GitHub Checks annotations. Upstream bug report:
# https://developercommunity.visualstudio.com/content/problem/689794/pipelines-logging-command-logissue-does-not-report.html
#echo "##vso[task.issue type=error;sourcepath=/azure-pipelines.yml;linenumber=45;columnnumber=1;code=100;]Found something that could be a problem."
fork_origin=$(git merge-base --fork-point origin/master)
changed_files=$(git diff --name-only $fork_origin | grep -v /vendor/)
git diff -U0 $fork_origin $changed_files | clang-format-diff -p1 | tee clang-format-output
if [ -s clang-format-output ]; then
echo -n "##vso[task.logissue type=error]"
echo "C/C++ lint failed. Use 'util/run-clang-format.sh' or 'git clang-format' to format the code."
exit 1
fi
# This check is not idempotent, but checks changes to a base branch.
# Run it only on pull requests.
condition: eq(variables['Build.Reason'], 'PullRequest')
displayName: 'Use clang-format to check C/C++ coding style'
- bash: |
commit_range=$(git merge-base --fork-point origin/master)..HEAD
# Notes:
# * Merge commits are not checked. We always use rebases instead of
# merges to keep a linear history, which makes merge commits disappear
# ultimately, making them only a CI artifact which should not be
# checked.
# * 'type=error' is used even for warnings. Only "errors" are shown in
# the GitHub checks API. However, warnings don't return a non-zero
# error code and don't fail the build step.
./util/lint_commits.py \
--no-merges \
--error-msg-prefix='##vso[task.logissue type=error]' \
--warning-msg-prefix='##vso[task.logissue type=error]' \
$commit_range
# Only run on pull requests to check new commits only
condition: eq(variables['Build.Reason'], 'PullRequest')
displayName: "Check commit metadata"
# Stage 2 for longer builds and tests. Jobs run in parallel by default, and
# dependencies should be used for build -> test dependencies.
- stage: build_test
displayName: Build and test
jobs:
- job: "sw_build"
displayName: "Build Software"
pool: "Default"
steps:
- bash: |
sudo apt-get install -y python3 python3-pip build-essential srecord python3-setuptools zlib1g-dev libusb-1.0 \
&& sudo pip3 install -r python-requirements.txt
displayName: 'Install dependencies'
- bash: |
export TOOLCHAIN_PATH="${TOOLCHAIN_PATH}"
export TOOLCHAIN_VERSION="${TOOLCHAIN_VERSION}"
REQUEST_UPDATE=true ci/run_sw_build.sh
displayName: 'Build embedded targets'
- job: "top_earlgrey_verilator"
displayName: "Build Verilator simulation of the Earl Grey toplevel design"
pool: "Default"
steps:
- bash: |
sudo apt-get install -y python3 python3-pip build-essential srecord python3-setuptools zlib1g-dev libusb-1.0 \
&& sudo pip3 install -r python-requirements.txt \
&& sudo apt-get install git make autoconf g++ flex bison curl
displayName: 'Install dependencies'
- bash: |
set -e
if [ ! -d $(VERILATOR_PATH) ]; then
echo "Building verilator (no cached build found)"
mkdir -p build/verilator
cd build/verilator
curl -Ls -o verilator.tgz https://www.veripool.org/ftp/verilator-$(VERILATOR_VERSION).tgz
tar -xf verilator.tgz
cd verilator-$(VERILATOR_VERSION)
./configure --prefix=$(VERILATOR_PATH)
make -j$(nproc)
mkdir -p $VERILATOR_PATH
make install
else
echo "Re-using cached verilator build"
fi
displayName: 'Build and install Verilator'
- bash: |
export PATH=$VERILATOR_PATH/bin:$PATH
python3 --version
fusesoc --version
verilator --version
displayName: 'Display environment'
- bash: |
export PATH=$VERILATOR_PATH/bin:$PATH
fusesoc --cores-root=. sim --build-only lowrisc:systems:top_earlgrey_verilator
displayName: 'Build simulation with Verilator'
- job: "top_earlgrey_nexysvideo"
displayName: "Build NexysVideo variant of the Earl Grey toplevel design using Vivado"
pool: "Default"
timeoutInMinutes: 120 # 2 hours
steps:
- bash: |
sudo apt-get install -y python3 python3-pip build-essential srecord python3-setuptools zlib1g-dev libusb-1.0 \
&& sudo pip3 install -r python-requirements.txt
displayName: 'Install dependencies'
- bash: |
set -e
source /opt/xilinx/Vivado/2018.3/settings64.sh
fusesoc --cores-root . build lowrisc:systems:top_earlgrey_nexysvideo
displayName: 'Build bitstream with Vivado'