Skip to content

Commit

Permalink
Merge pull request #117 from JacobDomagala/116-update-tools
Browse files Browse the repository at this point in the history
[#116]: Update tools
  • Loading branch information
JacobDomagala authored Apr 22, 2024
2 parents 1f7a5bd + 532f15b commit ec289f4
Show file tree
Hide file tree
Showing 4 changed files with 192 additions and 15 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM jdomagala/static_analysis:python
FROM jdomagala/static_analysis:latest

WORKDIR /src

Expand Down
30 changes: 20 additions & 10 deletions docker/static_analysis.dockerfile
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
FROM ubuntu:23.04 as base

# Define versions as environment variables
ENV CLANG_VERSION=16
ENV CPPCHECK_VERSION=2.12.0
ENV CLANG_VERSION=18 \
CPPCHECK_VERSION=2.14.0 \
CXX=clang++ \
CC=clang \
DEBIAN_FRONTEND=noninteractive

# Other environment variables
ENV CXX=clang++
ENV CC=clang
ENV DEBIAN_FRONTEND=noninteractive
# Copy the llvm.sh installation script
COPY llvm.sh /llvm.sh

# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential python3 python3-pip git clang-$CLANG_VERSION clang-tidy-$CLANG_VERSION wget libssl-dev ninja-build \
build-essential python3 python3-pip git wget libssl-dev ninja-build \
lsb-release software-properties-common gnupg \
# Execute the LLVM install script with the version number
&& chmod +x /llvm.sh && /llvm.sh $CLANG_VERSION \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& pip3 install PyGithub pylint --break-system-packages \
# Install Python packages
&& pip3 install --break-system-packages PyGithub pylint \
# Create symlinks for clang and clang++
&& ln -s "$(which clang++-$CLANG_VERSION)" /usr/bin/clang++ \
&& ln -s "$(which clang-$CLANG_VERSION)" /usr/bin/clang \
&& ln -s /usr/bin/python3 /usr/bin/python
Expand All @@ -23,8 +29,12 @@ WORKDIR /opt

# Build CMake from source
RUN git clone https://github.com/Kitware/CMake.git \
&& cd CMake && ./bootstrap && make -j4 && make install
&& cd CMake \
&& ./bootstrap && make -j$(nproc) && make install

# Install cppcheck
RUN git clone https://github.com/danmar/cppcheck.git \
&& cd cppcheck && git checkout tags/$CPPCHECK_VERSION && mkdir build && cd build && cmake -G Ninja .. && ninja all && ninja install
&& cd cppcheck \
&& git checkout tags/$CPPCHECK_VERSION \
&& mkdir build && cd build \
&& cmake -G Ninja .. && ninja all && ninja install
8 changes: 4 additions & 4 deletions entrypoint_cpp.sh
Original file line number Diff line number Diff line change
Expand Up @@ -67,16 +67,16 @@ else
cat cppcheck_*.txt > cppcheck.txt

# Excludes for clang-tidy are handled in python script
debug_print "Running run-clang-tidy-16 $CLANG_TIDY_ARGS -p $(pwd) $files_to_check >>clang_tidy.txt 2>&1"
eval run-clang-tidy-16 "$CLANG_TIDY_ARGS" -p "$(pwd)" "$files_to_check" >clang_tidy.txt 2>&1 || true
debug_print "Running run-clang-tidy-18 $CLANG_TIDY_ARGS -p $(pwd) $files_to_check >>clang_tidy.txt 2>&1"
eval run-clang-tidy-18 "$CLANG_TIDY_ARGS" -p "$(pwd)" "$files_to_check" >clang_tidy.txt 2>&1 || true

else
# Excludes for clang-tidy are handled in python script
debug_print "Running cppcheck -j $num_proc $files_to_check $CPPCHECK_ARGS --output-file=cppcheck.txt ..."
eval cppcheck -j "$num_proc" "$files_to_check" "$CPPCHECK_ARGS" --output-file=cppcheck.txt || true

debug_print "Running run-clang-tidy-16 $CLANG_TIDY_ARGS $files_to_check >>clang_tidy.txt 2>&1"
eval run-clang-tidy-16 "$CLANG_TIDY_ARGS" "$files_to_check" >clang_tidy.txt 2>&1 || true
debug_print "Running run-clang-tidy-18 $CLANG_TIDY_ARGS $files_to_check >>clang_tidy.txt 2>&1"
eval run-clang-tidy-18 "$CLANG_TIDY_ARGS" "$files_to_check" >clang_tidy.txt 2>&1 || true
fi

cd /
Expand Down
167 changes: 167 additions & 0 deletions llvm.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
#!/bin/bash
################################################################################
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
################################################################################
#
# This script will install the llvm toolchain on the different
# Debian and Ubuntu versions

set -eux

usage() {
set +x
echo "Usage: $0 [llvm_major_version] [all] [OPTIONS]" 1>&2
echo -e "all\t\t\tInstall all packages." 1>&2
echo -e "-n=code_name\t\tSpecifies the distro codename, for example bionic" 1>&2
echo -e "-h\t\t\tPrints this help." 1>&2
echo -e "-m=repo_base_url\tSpecifies the base URL from which to download." 1>&2
exit 1;
}

CURRENT_LLVM_STABLE=18
BASE_URL="http://apt.llvm.org"

# Check for required tools
needed_binaries=(lsb_release wget add-apt-repository gpg)
missing_binaries=()
for binary in "${needed_binaries[@]}"; do
if ! which "$binary" &>/dev/null ; then
missing_binaries+=("$binary")
fi
done
if [[ ${#missing_binaries[@]} -gt 0 ]] ; then
echo "You are missing some tools this script requires: " "${missing_binaries[@]}"
echo "(hint: apt install lsb-release wget software-properties-common gnupg)"
exit 4
fi

# Set default values for commandline arguments
# We default to the current stable branch of LLVM
LLVM_VERSION=$CURRENT_LLVM_STABLE
DISTRO=$(lsb_release -is)
VERSION=$(lsb_release -sr)
UBUNTU_CODENAME=""
CODENAME_FROM_ARGUMENTS=""
# Obtain VERSION_CODENAME and UBUNTU_CODENAME (for Ubuntu and its derivatives)
# shellcheck disable=SC1091
source /etc/os-release
DISTRO=${DISTRO,,}
case ${DISTRO} in
debian)
# Debian Trixie has a workaround because of
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1038383
if [[ "${VERSION}" == "unstable" ]] || [[ "${VERSION}" == "testing" ]] || [[ "${VERSION_CODENAME}" == "trixie" ]]; then
CODENAME=unstable
LINKNAME=
else
# "stable" Debian release
CODENAME=${VERSION_CODENAME}
LINKNAME=-${CODENAME}
fi
;;
*)
# ubuntu and its derivatives
if [[ -n "${UBUNTU_CODENAME}" ]]; then
CODENAME=${UBUNTU_CODENAME}
if [[ -n "${CODENAME}" ]]; then
LINKNAME=-${CODENAME}
fi
fi
;;
esac

# read optional command line arguments
if [ "$#" -ge 1 ] && [ "${1::1}" != "-" ]; then
if [ "$1" != "all" ]; then
LLVM_VERSION=$1
fi
OPTIND=2
if [ "$#" -ge 2 ]; then
if [ "$2" == "all" ]; then
# Install all packages
OPTIND=3
fi
fi
fi

while getopts ":hm:n:" arg; do
# shellcheck disable=SC2220
case $arg in
h)
usage
;;
m)
BASE_URL=${OPTARG}
;;
n)
CODENAME=${OPTARG}
if [[ "${CODENAME}" == "unstable" ]]; then
# link name does not apply to unstable repository
LINKNAME=
else
LINKNAME=-${CODENAME}
fi
CODENAME_FROM_ARGUMENTS="true"
;;
esac
done

if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root!"
exit 1
fi

declare -A LLVM_VERSION_PATTERNS
LLVM_VERSION_PATTERNS[9]="-9"
LLVM_VERSION_PATTERNS[10]="-10"
LLVM_VERSION_PATTERNS[11]="-11"
LLVM_VERSION_PATTERNS[12]="-12"
LLVM_VERSION_PATTERNS[13]="-13"
LLVM_VERSION_PATTERNS[14]="-14"
LLVM_VERSION_PATTERNS[15]="-15"
LLVM_VERSION_PATTERNS[16]="-16"
LLVM_VERSION_PATTERNS[17]="-17"
LLVM_VERSION_PATTERNS[18]="-18"
LLVM_VERSION_PATTERNS[19]=""

if [ ! ${LLVM_VERSION_PATTERNS[$LLVM_VERSION]+_} ]; then
echo "This script does not support LLVM version $LLVM_VERSION"
exit 3
fi

LLVM_VERSION_STRING=${LLVM_VERSION_PATTERNS[$LLVM_VERSION]}

# join the repository name
if [[ -n "${CODENAME}" ]]; then
REPO_NAME="deb ${BASE_URL}/${CODENAME}/ llvm-toolchain${LINKNAME}${LLVM_VERSION_STRING} main"

# check if the repository exists for the distro and version
if ! wget -q --method=HEAD "${BASE_URL}/${CODENAME}" &> /dev/null; then
if [[ -n "${CODENAME_FROM_ARGUMENTS}" ]]; then
echo "Specified codename '${CODENAME}' is not supported by this script."
else
echo "Distribution '${DISTRO}' in version '${VERSION}' is not supported by this script."
fi
exit 2
fi
fi


# install everything

if [[ ! -f /etc/apt/trusted.gpg.d/apt.llvm.org.asc ]]; then
# download GPG key once
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
fi

# shellcheck disable=SC2006
if [[ -z "`apt-key list 2> /dev/null | grep -i llvm`" ]]; then
# Delete the key in the old format
apt-key del AF4F7421
fi
add-apt-repository -y "${REPO_NAME}"
apt-get update
PKG="clang-$LLVM_VERSION lld-$LLVM_VERSION clangd-$LLVM_VERSION clang-tidy-$LLVM_VERSION"
apt-get install -y "$PKG"

0 comments on commit ec289f4

Please sign in to comment.