xref: /qemu/scripts/coverity-scan/run-coverity-scan (revision 95f8510ef428f988897176b9585b8ba1432f939f)
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