19c263d07SPeter Maydell#!/bin/sh -e 29c263d07SPeter Maydell 39c263d07SPeter Maydell# Upload a created tarball to Coverity Scan, as per 49c263d07SPeter Maydell# https://scan.coverity.com/projects/qemu/builds/new 59c263d07SPeter Maydell 69c263d07SPeter Maydell# This work is licensed under the terms of the GNU GPL version 2, 79c263d07SPeter Maydell# or (at your option) any later version. 89c263d07SPeter Maydell# See the COPYING file in the top-level directory. 99c263d07SPeter Maydell# 109c263d07SPeter Maydell# Copyright (c) 2017-2020 Linaro Limited 119c263d07SPeter Maydell# Written by Peter Maydell 129c263d07SPeter Maydell 139c263d07SPeter Maydell# Note that this script will automatically download and 149c263d07SPeter Maydell# run the (closed-source) coverity build tools, so don't 159c263d07SPeter Maydell# use it if you don't trust them! 169c263d07SPeter Maydell 179c263d07SPeter Maydell# This script assumes that you're running it from a QEMU source 189c263d07SPeter Maydell# tree, and that tree is a fresh clean one, because we do an in-tree 199c263d07SPeter Maydell# build. (This is necessary so that the filenames that the Coverity 209c263d07SPeter Maydell# Scan server sees are relative paths that match up with the component 219c263d07SPeter Maydell# regular expressions it uses; an out-of-tree build won't work for this.) 229c263d07SPeter Maydell# The host machine should have as many of QEMU's dependencies 239c263d07SPeter Maydell# installed as possible, for maximum coverity coverage. 249c263d07SPeter Maydell 259c263d07SPeter Maydell# To do an upload you need to be a maintainer in the Coverity online 269c263d07SPeter Maydell# service, and you will need to know the "Coverity token", which is a 279c263d07SPeter Maydell# secret 8 digit hex string. You can find that from the web UI in the 289c263d07SPeter Maydell# project settings, if you have maintainer access there. 299c263d07SPeter Maydell 309c263d07SPeter Maydell# Command line options: 319c263d07SPeter Maydell# --dry-run : run the tools, but don't actually do the upload 3272659059SPaolo Bonzini# --docker : create and work inside a container 3372659059SPaolo Bonzini# --docker-engine : specify the container engine to use (docker/podman/auto); 3472659059SPaolo Bonzini# implies --docker 359c263d07SPeter Maydell# --update-tools-only : update the cached copy of the tools, but don't run them 36b99b0079SPaolo Bonzini# --no-update-tools : do not update the cached copy of the tools 379c263d07SPeter Maydell# --tokenfile : file to read Coverity token from 389c263d07SPeter Maydell# --version ver : specify version being analyzed (default: ask git) 399c263d07SPeter Maydell# --description desc : specify description of this version (default: ask git) 409c263d07SPeter Maydell# --srcdir : QEMU source tree to analyze (default: current working dir) 419c263d07SPeter Maydell# --results-tarball : path to copy the results tarball to (default: don't 429c263d07SPeter Maydell# copy it anywhere, just upload it) 439edfa358SPeter Maydell# --src-tarball : tarball to untar into src dir (default: none); this 449edfa358SPeter Maydell# is intended mainly for internal use by the Docker support 459c263d07SPeter Maydell# 469c263d07SPeter Maydell# User-specifiable environment variables: 476ed4075cSPaolo Bonzini# COVERITY_TOKEN -- Coverity token (default: looks at your 486ed4075cSPaolo Bonzini# coverity.token config) 499c263d07SPeter Maydell# COVERITY_EMAIL -- the email address to use for uploads (default: 506ed4075cSPaolo Bonzini# looks at your git coverity.email or user.email config) 519c263d07SPeter Maydell# COVERITY_BUILD_CMD -- make command (default: 'make -jN' where N is 529c263d07SPeter Maydell# number of CPUs as determined by 'nproc') 539c263d07SPeter Maydell# COVERITY_TOOL_BASE -- set to directory to put coverity tools 549c263d07SPeter Maydell# (default: /tmp/coverity-tools) 559c263d07SPeter Maydell# 569c263d07SPeter Maydell# You must specify the token, either by environment variable or by 579c263d07SPeter Maydell# putting it in a file and using --tokenfile. Everything else has 589c263d07SPeter Maydell# a reasonable default if this is run from a git tree. 599c263d07SPeter Maydell 609c263d07SPeter Maydellcheck_upload_permissions() { 619c263d07SPeter Maydell # Check whether we can do an upload to the server; will exit the script 629c263d07SPeter Maydell # with status 1 if the check failed (usually a bad token); 639c263d07SPeter Maydell # will exit the script with status 0 if the check indicated that we 649c263d07SPeter Maydell # can't upload yet (ie we are at quota) 656ed4075cSPaolo Bonzini # Assumes that COVERITY_TOKEN, PROJNAME and DRYRUN have been initialized. 669c263d07SPeter Maydell 679c263d07SPeter Maydell echo "Checking upload permissions..." 689c263d07SPeter Maydell 696ed4075cSPaolo Bonzini if ! up_perm="$(wget https://scan.coverity.com/api/upload_permitted --post-data "token=$COVERITY_TOKEN&project=$PROJNAME" -q -O -)"; then 709c263d07SPeter Maydell echo "Coverity Scan API access denied: bad token?" 719c263d07SPeter Maydell exit 1 729c263d07SPeter Maydell fi 739c263d07SPeter Maydell 749c263d07SPeter Maydell # Really up_perm is a JSON response with either 759c263d07SPeter Maydell # {upload_permitted:true} or {next_upload_permitted_at:<date>} 769c263d07SPeter Maydell # We do some hacky string parsing instead of properly parsing it. 779c263d07SPeter Maydell case "$up_perm" in 789c263d07SPeter Maydell *upload_permitted*true*) 799c263d07SPeter Maydell echo "Coverity Scan: upload permitted" 809c263d07SPeter Maydell ;; 819c263d07SPeter Maydell *next_upload_permitted_at*) 829c263d07SPeter Maydell if [ "$DRYRUN" = yes ]; then 839c263d07SPeter Maydell echo "Coverity Scan: upload quota reached, continuing dry run" 849c263d07SPeter Maydell else 859c263d07SPeter Maydell echo "Coverity Scan: upload quota reached; stopping here" 869c263d07SPeter Maydell # Exit success as this isn't a build error. 879c263d07SPeter Maydell exit 0 889c263d07SPeter Maydell fi 899c263d07SPeter Maydell ;; 909c263d07SPeter Maydell *) 919c263d07SPeter Maydell echo "Coverity Scan upload check: unexpected result $up_perm" 929c263d07SPeter Maydell exit 1 939c263d07SPeter Maydell ;; 949c263d07SPeter Maydell esac 959c263d07SPeter Maydell} 969c263d07SPeter Maydell 979c263d07SPeter Maydell 98fbb84f07SPaolo Bonzinibuild_docker_image() { 99fbb84f07SPaolo Bonzini # build docker container including the coverity-scan tools 100fbb84f07SPaolo Bonzini echo "Building docker container..." 101fbb84f07SPaolo Bonzini # TODO: This re-unpacks the tools every time, rather than caching 102fbb84f07SPaolo Bonzini # and reusing the image produced by the COPY of the .tgz file. 103fbb84f07SPaolo Bonzini # Not sure why. 104fbb84f07SPaolo Bonzini tests/docker/docker.py --engine ${DOCKER_ENGINE} build \ 105fbb84f07SPaolo Bonzini -t coverity-scanner -f scripts/coverity-scan/coverity-scan.docker \ 106fbb84f07SPaolo Bonzini --extra-files scripts/coverity-scan/run-coverity-scan \ 107fbb84f07SPaolo Bonzini "$COVERITY_TOOL_BASE"/coverity_tool.tgz 108fbb84f07SPaolo Bonzini} 109fbb84f07SPaolo Bonzini 1109c263d07SPeter Maydellupdate_coverity_tools () { 1119c263d07SPeter Maydell # Check for whether we need to download the Coverity tools 1129c263d07SPeter Maydell # (either because we don't have a copy, or because it's out of date) 1136ed4075cSPaolo Bonzini # Assumes that COVERITY_TOOL_BASE, COVERITY_TOKEN and PROJNAME are set. 1149c263d07SPeter Maydell 1159c263d07SPeter Maydell mkdir -p "$COVERITY_TOOL_BASE" 1169c263d07SPeter Maydell cd "$COVERITY_TOOL_BASE" 1179c263d07SPeter Maydell 1189c263d07SPeter Maydell echo "Checking for new version of coverity build tools..." 1196ed4075cSPaolo Bonzini wget https://scan.coverity.com/download/linux64 --post-data "token=$COVERITY_TOKEN&project=$PROJNAME&md5=1" -O coverity_tool.md5.new 1209c263d07SPeter Maydell 1219c263d07SPeter Maydell if ! cmp -s coverity_tool.md5 coverity_tool.md5.new; then 1229c263d07SPeter Maydell # out of date md5 or no md5: download new build tool 1239c263d07SPeter Maydell # blow away the old build tool 1249c263d07SPeter Maydell echo "Downloading coverity build tools..." 1259c263d07SPeter Maydell rm -rf coverity_tool coverity_tool.tgz 1266ed4075cSPaolo Bonzini wget https://scan.coverity.com/download/linux64 --post-data "token=$COVERITY_TOKEN&project=$PROJNAME" -O coverity_tool.tgz 1279c263d07SPeter Maydell if ! (cat coverity_tool.md5.new; echo " coverity_tool.tgz") | md5sum -c --status; then 1289c263d07SPeter Maydell echo "Downloaded tarball didn't match md5sum!" 1299c263d07SPeter Maydell exit 1 1309c263d07SPeter Maydell fi 1312e90470eSPaolo Bonzini 1322e90470eSPaolo Bonzini if [ "$DOCKER" != yes ]; then 1339c263d07SPeter Maydell # extract the new one, keeping it corralled in a 'coverity_tool' directory 1349c263d07SPeter Maydell echo "Unpacking coverity build tools..." 1359c263d07SPeter Maydell mkdir -p coverity_tool 1369c263d07SPeter Maydell cd coverity_tool 1379c263d07SPeter Maydell tar xf ../coverity_tool.tgz 1389c263d07SPeter Maydell cd .. 1399c263d07SPeter Maydell mv coverity_tool.md5.new coverity_tool.md5 1409c263d07SPeter Maydell fi 1412e90470eSPaolo Bonzini fi 1429c263d07SPeter Maydell rm -f coverity_tool.md5.new 143fbb84f07SPaolo Bonzini cd "$SRCDIR" 144fbb84f07SPaolo Bonzini 145fbb84f07SPaolo Bonzini if [ "$DOCKER" = yes ]; then 146fbb84f07SPaolo Bonzini build_docker_image 147fbb84f07SPaolo Bonzini fi 1489c263d07SPeter Maydell} 1499c263d07SPeter Maydell 1509c263d07SPeter Maydell 1519c263d07SPeter Maydell# Check user-provided environment variables and arguments 1529c263d07SPeter MaydellDRYRUN=no 153b99b0079SPaolo BonziniUPDATE=yes 1549edfa358SPeter MaydellDOCKER=no 1559c263d07SPeter Maydell 1569c263d07SPeter Maydellwhile [ "$#" -ge 1 ]; do 1579c263d07SPeter Maydell case "$1" in 1589c263d07SPeter Maydell --dry-run) 1599c263d07SPeter Maydell shift 1609c263d07SPeter Maydell DRYRUN=yes 1619c263d07SPeter Maydell ;; 162b99b0079SPaolo Bonzini --no-update-tools) 163b99b0079SPaolo Bonzini shift 164b99b0079SPaolo Bonzini UPDATE=no 165b99b0079SPaolo Bonzini ;; 1669c263d07SPeter Maydell --update-tools-only) 1679c263d07SPeter Maydell shift 168b99b0079SPaolo Bonzini UPDATE=only 1699c263d07SPeter Maydell ;; 1709c263d07SPeter Maydell --version) 1719c263d07SPeter Maydell shift 1729c263d07SPeter Maydell if [ $# -eq 0 ]; then 1739c263d07SPeter Maydell echo "--version needs an argument" 1749c263d07SPeter Maydell exit 1 1759c263d07SPeter Maydell fi 1769c263d07SPeter Maydell VERSION="$1" 1779c263d07SPeter Maydell shift 1789c263d07SPeter Maydell ;; 1799c263d07SPeter Maydell --description) 1809c263d07SPeter Maydell shift 1819c263d07SPeter Maydell if [ $# -eq 0 ]; then 1829c263d07SPeter Maydell echo "--description needs an argument" 1839c263d07SPeter Maydell exit 1 1849c263d07SPeter Maydell fi 1859c263d07SPeter Maydell DESCRIPTION="$1" 1869c263d07SPeter Maydell shift 1879c263d07SPeter Maydell ;; 1889c263d07SPeter Maydell --tokenfile) 1899c263d07SPeter Maydell shift 1909c263d07SPeter Maydell if [ $# -eq 0 ]; then 1919c263d07SPeter Maydell echo "--tokenfile needs an argument" 1929c263d07SPeter Maydell exit 1 1939c263d07SPeter Maydell fi 1949c263d07SPeter Maydell COVERITY_TOKEN="$(cat "$1")" 1959c263d07SPeter Maydell shift 1969c263d07SPeter Maydell ;; 1979c263d07SPeter Maydell --srcdir) 1989c263d07SPeter Maydell shift 1999c263d07SPeter Maydell if [ $# -eq 0 ]; then 2009c263d07SPeter Maydell echo "--srcdir needs an argument" 2019c263d07SPeter Maydell exit 1 2029c263d07SPeter Maydell fi 2039c263d07SPeter Maydell SRCDIR="$1" 2049c263d07SPeter Maydell shift 2059c263d07SPeter Maydell ;; 2069c263d07SPeter Maydell --results-tarball) 2079c263d07SPeter Maydell shift 2089c263d07SPeter Maydell if [ $# -eq 0 ]; then 2099c263d07SPeter Maydell echo "--results-tarball needs an argument" 2109c263d07SPeter Maydell exit 1 2119c263d07SPeter Maydell fi 2129c263d07SPeter Maydell RESULTSTARBALL="$1" 2139c263d07SPeter Maydell shift 2149c263d07SPeter Maydell ;; 2159edfa358SPeter Maydell --src-tarball) 2169edfa358SPeter Maydell shift 2179edfa358SPeter Maydell if [ $# -eq 0 ]; then 2189edfa358SPeter Maydell echo "--src-tarball needs an argument" 2199edfa358SPeter Maydell exit 1 2209edfa358SPeter Maydell fi 2219edfa358SPeter Maydell SRCTARBALL="$1" 2229edfa358SPeter Maydell shift 2239edfa358SPeter Maydell ;; 2249edfa358SPeter Maydell --docker) 2259edfa358SPeter Maydell DOCKER=yes 22672659059SPaolo Bonzini DOCKER_ENGINE=auto 22772659059SPaolo Bonzini shift 22872659059SPaolo Bonzini ;; 22972659059SPaolo Bonzini --docker-engine) 23072659059SPaolo Bonzini shift 23172659059SPaolo Bonzini if [ $# -eq 0 ]; then 23272659059SPaolo Bonzini echo "--docker-engine needs an argument" 23372659059SPaolo Bonzini exit 1 23472659059SPaolo Bonzini fi 23572659059SPaolo Bonzini DOCKER=yes 23672659059SPaolo Bonzini DOCKER_ENGINE="$1" 2379edfa358SPeter Maydell shift 2389edfa358SPeter Maydell ;; 2399c263d07SPeter Maydell *) 2409c263d07SPeter Maydell echo "Unexpected argument '$1'" 2419c263d07SPeter Maydell exit 1 2429c263d07SPeter Maydell ;; 2439c263d07SPeter Maydell esac 2449c263d07SPeter Maydelldone 2459c263d07SPeter Maydell 2469c263d07SPeter Maydellif [ -z "$COVERITY_TOKEN" ]; then 2476ed4075cSPaolo Bonzini COVERITY_TOKEN="$(git config coverity.token)" 2486ed4075cSPaolo Bonzinifi 2496ed4075cSPaolo Bonziniif [ -z "$COVERITY_TOKEN" ]; then 2509c263d07SPeter Maydell echo "COVERITY_TOKEN environment variable not set" 2519c263d07SPeter Maydell exit 1 2529c263d07SPeter Maydellfi 2539c263d07SPeter Maydell 2549c263d07SPeter Maydellif [ -z "$COVERITY_BUILD_CMD" ]; then 2559c263d07SPeter Maydell NPROC=$(nproc) 2569c263d07SPeter Maydell COVERITY_BUILD_CMD="make -j$NPROC" 2579c263d07SPeter Maydell echo "COVERITY_BUILD_CMD: using default '$COVERITY_BUILD_CMD'" 2589c263d07SPeter Maydellfi 2599c263d07SPeter Maydell 2609c263d07SPeter Maydellif [ -z "$COVERITY_TOOL_BASE" ]; then 2619c263d07SPeter Maydell echo "COVERITY_TOOL_BASE: using default /tmp/coverity-tools" 2629c263d07SPeter Maydell COVERITY_TOOL_BASE=/tmp/coverity-tools 2639c263d07SPeter Maydellfi 2649c263d07SPeter Maydell 2659c263d07SPeter Maydellif [ -z "$SRCDIR" ]; then 2669c263d07SPeter Maydell SRCDIR="$PWD" 2679c263d07SPeter Maydellfi 2689c263d07SPeter Maydell 2699c263d07SPeter MaydellPROJNAME=QEMU 2709c263d07SPeter MaydellTARBALL=cov-int.tar.xz 2719c263d07SPeter Maydell 272b99b0079SPaolo Bonziniif [ "$UPDATE" = only ]; then 2739c263d07SPeter Maydell # Just do the tools update; we don't need to check whether 2749c263d07SPeter Maydell # we are in a source tree or have upload rights for this, 2759c263d07SPeter Maydell # so do it before some of the command line and source tree checks. 276fbb84f07SPaolo Bonzini 277fbb84f07SPaolo Bonzini if [ "$DOCKER" = yes ] && [ ! -z "$SRCTARBALL" ]; then 278fbb84f07SPaolo Bonzini echo --update-tools-only --docker is incompatible with --src-tarball. 279fbb84f07SPaolo Bonzini exit 1 280fbb84f07SPaolo Bonzini fi 281fbb84f07SPaolo Bonzini 2829c263d07SPeter Maydell update_coverity_tools 2839c263d07SPeter Maydell exit 0 2849c263d07SPeter Maydellfi 2859c263d07SPeter Maydell 2869edfa358SPeter Maydellif [ ! -e "$SRCDIR" ]; then 2879edfa358SPeter Maydell mkdir "$SRCDIR" 2889edfa358SPeter Maydellfi 2899edfa358SPeter Maydell 2909c263d07SPeter Maydellcd "$SRCDIR" 2919c263d07SPeter Maydell 2929edfa358SPeter Maydellif [ ! -z "$SRCTARBALL" ]; then 2939edfa358SPeter Maydell echo "Untarring source tarball into $SRCDIR..." 2949edfa358SPeter Maydell tar xvf "$SRCTARBALL" 2959edfa358SPeter Maydellfi 2969edfa358SPeter Maydell 2979c263d07SPeter Maydellecho "Checking this is a QEMU source tree..." 2989c263d07SPeter Maydellif ! [ -e "$SRCDIR/VERSION" ]; then 2999c263d07SPeter Maydell echo "Not in a QEMU source tree?" 3009c263d07SPeter Maydell exit 1 3019c263d07SPeter Maydellfi 3029c263d07SPeter Maydell 3039c263d07SPeter Maydell# Fill in defaults used by the non-update-only process 3049c263d07SPeter Maydellif [ -z "$VERSION" ]; then 3059c263d07SPeter Maydell VERSION="$(git describe --always HEAD)" 3069c263d07SPeter Maydellfi 3079c263d07SPeter Maydell 3089c263d07SPeter Maydellif [ -z "$DESCRIPTION" ]; then 3099c263d07SPeter Maydell DESCRIPTION="$(git rev-parse HEAD)" 3109c263d07SPeter Maydellfi 3119c263d07SPeter Maydell 3129c263d07SPeter Maydellif [ -z "$COVERITY_EMAIL" ]; then 3136ed4075cSPaolo Bonzini COVERITY_EMAIL="$(git config coverity.email)" 3146ed4075cSPaolo Bonzinifi 3156ed4075cSPaolo Bonziniif [ -z "$COVERITY_EMAIL" ]; then 3169c263d07SPeter Maydell COVERITY_EMAIL="$(git config user.email)" 3179c263d07SPeter Maydellfi 3189c263d07SPeter Maydell 3192e90470eSPaolo Bonzini# Otherwise, continue with the full build and upload process. 3202e90470eSPaolo Bonzini 3212e90470eSPaolo Bonzinicheck_upload_permissions 3222e90470eSPaolo Bonzini 3232e90470eSPaolo Bonziniif [ "$UPDATE" != no ]; then 3242e90470eSPaolo Bonzini update_coverity_tools 3252e90470eSPaolo Bonzinifi 3262e90470eSPaolo Bonzini 3279edfa358SPeter Maydell# Run ourselves inside docker if that's what the user wants 3289edfa358SPeter Maydellif [ "$DOCKER" = yes ]; then 3299edfa358SPeter Maydell # Put the Coverity token into a temporary file that only 3309edfa358SPeter Maydell # we have read access to, and then pass it to docker build 33172659059SPaolo Bonzini # using a volume. A volume is enough for the token not to 33272659059SPaolo Bonzini # leak into the Docker image. 3339edfa358SPeter Maydell umask 077 3349edfa358SPeter Maydell SECRETDIR=$(mktemp -d) 3359edfa358SPeter Maydell if [ -z "$SECRETDIR" ]; then 3369edfa358SPeter Maydell echo "Failed to create temporary directory" 3379edfa358SPeter Maydell exit 1 3389edfa358SPeter Maydell fi 3399edfa358SPeter Maydell trap 'rm -rf "$SECRETDIR"' INT TERM EXIT 3409edfa358SPeter Maydell echo "Created temporary directory $SECRETDIR" 3419edfa358SPeter Maydell SECRET="$SECRETDIR/token" 3429edfa358SPeter Maydell echo "$COVERITY_TOKEN" > "$SECRET" 3439edfa358SPeter Maydell echo "Archiving sources to be analyzed..." 3449edfa358SPeter Maydell ./scripts/archive-source.sh "$SECRETDIR/qemu-sources.tgz" 3453077453cSPaolo Bonzini ARGS="--no-update-tools" 3469edfa358SPeter Maydell if [ "$DRYRUN" = yes ]; then 3473077453cSPaolo Bonzini ARGS="$ARGS --dry-run" 3489edfa358SPeter Maydell fi 3499edfa358SPeter Maydell echo "Running scanner..." 3509edfa358SPeter Maydell # If we need to capture the output tarball, get the inner run to 3519edfa358SPeter Maydell # save it to the secrets directory so we can copy it out before the 3529edfa358SPeter Maydell # directory is cleaned up. 3539edfa358SPeter Maydell if [ ! -z "$RESULTSTARBALL" ]; then 3543077453cSPaolo Bonzini ARGS="$ARGS --results-tarball /work/cov-int.tar.xz" 3559edfa358SPeter Maydell fi 3569edfa358SPeter Maydell # Arrange for this docker run to get access to the sources with -v. 3579edfa358SPeter Maydell # We pass through all the configuration from the outer script to the inner. 3589edfa358SPeter Maydell export COVERITY_EMAIL COVERITY_BUILD_CMD 35972659059SPaolo Bonzini tests/docker/docker.py run -it --env COVERITY_EMAIL --env COVERITY_BUILD_CMD \ 3609edfa358SPeter Maydell -v "$SECRETDIR:/work" coverity-scanner \ 3619edfa358SPeter Maydell ./run-coverity-scan --version "$VERSION" \ 3623077453cSPaolo Bonzini --description "$DESCRIPTION" $ARGS --tokenfile /work/token \ 3633077453cSPaolo Bonzini --srcdir /qemu --src-tarball /work/qemu-sources.tgz 3649edfa358SPeter Maydell if [ ! -z "$RESULTSTARBALL" ]; then 3659edfa358SPeter Maydell echo "Copying results tarball to $RESULTSTARBALL..." 3669edfa358SPeter Maydell cp "$SECRETDIR/cov-int.tar.xz" "$RESULTSTARBALL" 3679edfa358SPeter Maydell fi 3689edfa358SPeter Maydell echo "Docker work complete." 3699edfa358SPeter Maydell exit 0 3709edfa358SPeter Maydellfi 3719edfa358SPeter Maydell 3729c263d07SPeter MaydellTOOLBIN="$(cd "$COVERITY_TOOL_BASE" && echo $PWD/coverity_tool/cov-analysis-*/bin)" 3739c263d07SPeter Maydell 3749c263d07SPeter Maydellif ! test -x "$TOOLBIN/cov-build"; then 3759c263d07SPeter Maydell echo "Couldn't find cov-build in the coverity build-tool directory??" 3769c263d07SPeter Maydell exit 1 3779c263d07SPeter Maydellfi 3789c263d07SPeter Maydell 3799c263d07SPeter Maydellexport PATH="$TOOLBIN:$PATH" 3809c263d07SPeter Maydell 3819c263d07SPeter Maydellcd "$SRCDIR" 3829c263d07SPeter Maydell 383dd52af17SPaolo Bonziniecho "Nuking build directory..." 384dd52af17SPaolo Bonzinirm -rf +build 385dd52af17SPaolo Bonzinimkdir +build 386dd52af17SPaolo Bonzinicd +build 3879c263d07SPeter Maydell 3889c263d07SPeter Maydellecho "Configuring..." 3899c263d07SPeter Maydell# We configure with a fixed set of enables here to ensure that we don't 3909c263d07SPeter Maydell# accidentally reduce the scope of the analysis by doing the build on 3919c263d07SPeter Maydell# the system that's missing a dependency that we need to build part of 3929c263d07SPeter Maydell# the codebase. 393dd52af17SPaolo Bonzini../configure --disable-modules --enable-sdl --enable-gtk \ 3949c263d07SPeter Maydell --enable-opengl --enable-vte --enable-gnutls \ 3959c263d07SPeter Maydell --enable-nettle --enable-curses --enable-curl \ 3969c263d07SPeter Maydell --audio-drv-list=oss,alsa,sdl,pa --enable-virtfs \ 397*95f8510eSKshitij Suri --enable-vnc --enable-vnc-sasl --enable-vnc-jpeg --enable-png \ 3989c263d07SPeter Maydell --enable-xen --enable-brlapi \ 3999c263d07SPeter Maydell --enable-linux-aio --enable-attr \ 4009c263d07SPeter Maydell --enable-cap-ng --enable-trace-backends=log --enable-spice --enable-rbd \ 401a5730b8bSThomas Huth --enable-libusb --enable-usb-redir \ 4029c263d07SPeter Maydell --enable-libiscsi --enable-libnfs --enable-seccomp \ 4039c263d07SPeter Maydell --enable-tpm --enable-libssh --enable-lzo --enable-snappy --enable-bzip2 \ 4049c263d07SPeter Maydell --enable-numa --enable-rdma --enable-smartcard --enable-virglrenderer \ 4059e8be4c5SMichael Tokarev --enable-mpath --enable-glusterfs \ 4069c263d07SPeter Maydell --enable-virtfs --enable-zstd 4079c263d07SPeter Maydell 4089c263d07SPeter Maydellecho "Running cov-build..." 4099c263d07SPeter Maydellrm -rf cov-int 4109c263d07SPeter Maydellmkdir cov-int 4119c263d07SPeter Maydellcov-build --dir cov-int $COVERITY_BUILD_CMD 4129c263d07SPeter Maydell 4139c263d07SPeter Maydellecho "Creating results tarball..." 4149c263d07SPeter Maydelltar cvf - cov-int | xz > "$TARBALL" 4159c263d07SPeter Maydell 4169c263d07SPeter Maydellif [ ! -z "$RESULTSTARBALL" ]; then 4179c263d07SPeter Maydell echo "Copying results tarball to $RESULTSTARBALL..." 4189c263d07SPeter Maydell cp "$TARBALL" "$RESULTSTARBALL" 4199c263d07SPeter Maydellfi 4209c263d07SPeter Maydell 4219c263d07SPeter Maydellecho "Uploading results tarball..." 4229c263d07SPeter Maydell 4239c263d07SPeter Maydellif [ "$DRYRUN" = yes ]; then 4249c263d07SPeter Maydell echo "Dry run only, not uploading $TARBALL" 4259c263d07SPeter Maydell exit 0 4269c263d07SPeter Maydellfi 4279c263d07SPeter Maydell 4286ed4075cSPaolo Bonzinicurl --form token="$COVERITY_TOKEN" --form email="$COVERITY_EMAIL" \ 4299c263d07SPeter Maydell --form file=@"$TARBALL" --form version="$VERSION" \ 4309c263d07SPeter Maydell --form description="$DESCRIPTION" \ 4319c263d07SPeter Maydell https://scan.coverity.com/builds?project="$PROJNAME" 4329c263d07SPeter Maydell 4339c263d07SPeter Maydellecho "Done." 434