blob: bd90dc8b32316c01632053bc0abd4e6109e43654 [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: 20191010-1
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:
vmImage: "ubuntu-16.04"
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 disabled 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/)
test -z $changed_files || 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 libftdi1-dev libftdi1-2 libssl-dev \
&& sudo pip3 install -r python-requirements.txt
displayName: 'Install dependencies'
- bash: |
export TOOLCHAIN_PATH="${TOOLCHAIN_PATH}"
export TOOLCHAIN_VERSION="${TOOLCHAIN_VERSION}"
export DIST_DIR="$(Build.ArtifactStagingDirectory)/dist"
REQUEST_UPDATE=true ci/run_sw_build.sh
displayName: 'Build embedded targets'
- bash: |
make -C sw/host/spiflash clean all
# TODO: build system updates needed to copy build output to a dist
# staging directory.
mkdir -p $(Build.ArtifactStagingDirectory)/dist/sw/host/bin
cp sw/host/spiflash/spiflash $(Build.ArtifactStagingDirectory)/dist/sw/host/bin
displayName: 'Build host targets'
- bash: |
cd $(Build.ArtifactStagingDirectory)
tar -cf dist-partial-sw_build.tar dist
displayName: 'Prepare partial distribution artifacts'
- publish: $(Build.ArtifactStagingDirectory)/dist-partial-sw_build.tar
artifact: dist-partial-sw_build
displayName: "Upload partial distribution artifacts"
- 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=. run --target=sim --setup --build lowrisc:systems:top_earlgrey_verilator
displayName: 'Build simulation with Verilator'
- bash: |
DIST_DIR="$(Build.ArtifactStagingDirectory)/dist/hw/top_earlgrey"
mkdir -p "${DIST_DIR}"
cp build/lowrisc_systems_top_earlgrey_verilator_0.1/sim-verilator/Vtop_earlgrey_verilator \
${DIST_DIR}
cd $(Build.ArtifactStagingDirectory)
tar -cf dist-partial-top_earlgrey_verilator.tar dist
displayName: 'Prepare partial distribution artifacts'
- publish: $(Build.ArtifactStagingDirectory)/dist-partial-top_earlgrey_verilator.tar
artifact: dist-partial-top_earlgrey_verilator
displayName: "Upload partial distribution artifacts"
- job: "top_earlgrey_nexysvideo"
displayName: "Build NexysVideo variant of the Earl Grey toplevel design using Vivado"
pool: "Default"
timeoutInMinutes: 120 # 2 hours
dependsOn:
# The bootrom is built into the FPGA image at synthesis time.
- sw_build
steps:
- task: DownloadPipelineArtifact@2
inputs:
buildType: current
targetPath: '$(Build.ArtifactStagingDirectory)/dist-partial-download'
- bash: |
sudo apt-get install -y tree
mkdir -p $(Build.ArtifactStagingDirectory)/dist-other
cd $(Build.ArtifactStagingDirectory)/dist-other
find "$(Build.ArtifactStagingDirectory)/dist-partial-download" -iname '*.tar' -exec tar --strip-components=1 --overwrite -xf {} \;
tree $(Build.ArtifactStagingDirectory)
displayName: 'Restore partial dist directory'
- 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
BOOTROM_VMEM=$(Build.ArtifactStagingDirectory)/dist-other/sw/device/boot_rom/rom.vmem
test -f ${BOOTROM_VMEM}
source /opt/xilinx/Vivado/2018.3/settings64.sh
fusesoc --cores-root . run --target=synth --setup --build \
lowrisc:systems:top_earlgrey_nexysvideo \
--ROM_INIT_FILE=${BOOTROM_VMEM}
displayName: 'Build bitstream with Vivado'
- bash: |
DIST_DIR="$(Build.ArtifactStagingDirectory)/dist/hw/top_earlgrey"
mkdir -p "${DIST_DIR}"
cp build/lowrisc_systems_top_earlgrey_nexysvideo_0.1/synth-vivado/lowrisc_systems_top_earlgrey_nexysvideo_0.1.bit \
${DIST_DIR}
cd $(Build.ArtifactStagingDirectory)
tar -cf dist-partial-top_earlgrey_nexysvideo.tar dist
displayName: 'Prepare partial distribution artifacts'
- publish: $(Build.ArtifactStagingDirectory)/dist-partial-top_earlgrey_nexysvideo.tar
artifact: dist-partial-top_earlgrey_nexysvideo
displayName: 'Upload partial distribution artifacts'
- job: "deploy_releaseartifacts"
displayName: "Package and deploy release distribution"
pool:
vmImage: "ubuntu-16.04"
dependsOn:
- sw_build
- top_earlgrey_verilator
- top_earlgrey_nexysvideo
steps:
- task: DownloadPipelineArtifact@2
inputs:
buildType: current
targetPath: '$(Build.ArtifactStagingDirectory)/dist-partial-download'
- bash: |
OT_VERSION=$(git describe --always)
cd "$(Build.ArtifactStagingDirectory)"
find "$(Build.ArtifactStagingDirectory)/dist-partial-download" -iname '*.tar' -exec tar --overwrite -xf {} \;
mv dist opentitan-$OT_VERSION
mkdir -p dist-final
tar -cJf dist-final/opentitan-$OT_VERSION.tar.xz opentitan-$OT_VERSION
displayName: 'Create final dist directory out of partial ones'
- publish: $(Build.ArtifactStagingDirectory)/dist-final
artifact: opentitan-dist
displayName: "Upload release artifacts as Azure artifact"
- task: GithubRelease@0
displayName: 'Upload to GitHub releases (only tags)'
inputs:
gitHubConnection: opentitan-release-upload
repositoryName: lowrisc/opentitan
addChangeLog: false
assets: |
$(Build.ArtifactStagingDirectory)/dist-final/*