Skip to content

Commit

Permalink
chg: add scripts to ease the build of images for others versions of c…
Browse files Browse the repository at this point in the history
…ompilers
  • Loading branch information
pictavien committed Nov 17, 2023
1 parent e824bdd commit 1d3d849
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 35 deletions.
69 changes: 45 additions & 24 deletions ci-scripts/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,64 @@
# build and publish the image with command:
# docker-image-build-publish.sh
#
FROM debian:latest as base
ARG COMPILER_IMAGE
ARG LIBBOOST_VERSION=1.81

FROM gcc:12 as gcc-12
ENV CXX=g++
ENV CC=gcc
ENV GCC_VERSION=12

RUN apt-get update

FROM gcc:10 as gcc-10
ENV CXX=g++
ENV CC=gcc
ENV GCC_VERSION=10
ENV LIBBOOST_VERSION=1.74

FROM gcc:11 as gcc-11
ENV CXX=g++
ENV CC=gcc
ENV GCC_VERSION=11
ENV LIBBOOST_VERSION=1.74

RUN apt-get update

FROM debian:latest as clang-13
ENV CXX=clang++
ENV CC=clang
ENV CLANG_VERSION=13
ENV LIBBOOST_VERSION=${LIBBOOST_VERSION}

RUN apt-get update && \
apt-get install -y clang-${CLANG_VERSION} && \
update-alternatives --install /usr/bin/clang clang /usr/bin/clang-${CLANG_VERSION} 1 && \
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-${CLANG_VERSION} 1

FROM ${COMPILER_IMAGE} as target-image
ARG CATCH2_REV=v3.2.0
ARG CATCH2_REPO=https://github.com/catchorg/Catch2.git
ARG LIBBOOST_VERSION=1.81
ARG CXX
ARG COMPILER_IMAGE=${COMPILER_IMAGE}

ENV TCHECKER_DOCKER=true
ENV TCHECKER_DOCKER_IMAGE="${COMPILER_IMAGE}"

RUN apt-get update && \
apt-get install -y \
git cmake bison flex doxygen \
libboost${LIBBOOST_VERSION}-dev \
libboost-json${LIBBOOST_VERSION}-dev \
valgrind graphviz

RUN git clone --branch ${CATCH2_REV} ${CATCH2_REPO} /tmp/catch2

FROM base as gcc-image
RUN apt-get install -y gcc-12 g++-12 && \
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 1 && \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 1
RUN if test $(echo "${LIBBOOST_VERSION}" | tr -d '.') -ge 175; then \
apt-get install -y libboost-json${LIBBOOST_VERSION}-dev; \
fi

RUN mkdir -p /tmp/catch2/build && \
cd /tmp/catch2/build && \
cmake -DCMAKE_CXX_COMPILER=g++ .. && \
make -j 4 && \
make install

ENTRYPOINT [ "/bin/bash", "-s" ]

FROM base as clang-image

RUN apt-get install -y clang-13 && \
update-alternatives --install /usr/bin/clang clang /usr/bin/clang-13 1 && \
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-13 1
RUN git clone --branch ${CATCH2_REV} ${CATCH2_REPO} /tmp/catch2

RUN mkdir -p /tmp/catch2/build && \
cd /tmp/catch2/build && \
cmake -DCMAKE_CXX_COMPILER=clang++ .. && \
cmake -DCMAKE_CXX_COMPILER=${CXX} .. && \
make -j 4 && \
make install

Expand Down
23 changes: 23 additions & 0 deletions ci-scripts/build-in-docker.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/bin/bash -x

SCRIPTDIR=$(cd $(dirname $0); pwd)
BUILDDIR=build/docker-${TCHECKER_DOCKER_IMAGE}
PROJECTROOT=$(cd ${SCRIPTDIR}/..; pwd)

error() {
echo "$0: error: $1." 1>&2
exit 1
}

${TCHECKER_DOCKER:-false} || error "not in a tcheker container"

cd ${PROJECTROOT}

export INSTALL_DIR=${BUILDDIR}/_inst
export TCHECKER_BUILD_TYPE=Debug
export CXX=g++
export CC=gcc
export CONFNAME=all:int64:memcheck
export VERBOSE=1
./ci-scripts/build.sh ${BUILDDIR}

14 changes: 11 additions & 3 deletions ci-scripts/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ fi

set -eu

SCRIPTDIR=$(cd $(dirname $0); pwd)
SOURCEDIR=$(cd ${SCRIPTDIR}/..; pwd)

if test $# = 1; then
BUILDDIR=$1
else
BUILDDIR=build
fi

nbbits="32"
memcheck="OFF"
Expand Down Expand Up @@ -50,13 +58,13 @@ TEST_CONF="${TEST_CONF} -DTCK_ENABLE_BUGFIXES_TESTS=${bugfixes}"

echo "TEST_CONF=${TEST_CONF}"

mkdir build || true
cd build
mkdir -p ${BUILDDIR} || true
cd ${BUILDDIR}
cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
-DCMAKE_CXX_COMPILER=${CXX} \
-DCMAKE_BUILD_TYPE=${TCHECKER_BUILD_TYPE} \
${TEST_CONF} \
..
${SOURCEDIR}

NB_CPUS=$(getconf _NPROCESSORS_CONF)
exec make -j ${NB_CPUS}
Expand Down
108 changes: 100 additions & 8 deletions ci-scripts/docker-image-build-publish.sh
Original file line number Diff line number Diff line change
@@ -1,16 +1,108 @@
#! /usr/bin/env bash

GCC_LATEST_IMAGE="gcc-12"
CLANG_LATEST_IMAGE="clang-13"
REPOSITORY=pictavien/tchecker-ci
if test $# = 0; then
TAG=latest

SCRIPTDIR=$(cd $(dirname $0); pwd)

OPT_TAG=NONE
OPT_GCC_IMAGE=NONE
OPT_CLANG_IMAGE=NONE

# option set to true if built images have to be pushed on Docker registry
OPT_PUSH=false
# option set to true to only display Docker commands
OPT_DRY=false

usage() {
cat <<EOF
USAGE: $0 [options]
where options are:
-n
-p
-g gcc-image
-c clang-image
-t image-tag-suffix
-h display this help message
EOF
exit 0
}

error() {
echo "$0: error: $1." 1>&2
exit 1
}

parse_args() {
OPTIONS=":g:c:t:nph"
while getopts ${OPTIONS} opt; do
case ${opt} in
"g") OPT_GCC_IMAGE=${OPTARG} ;;
"c") OPT_CLANG_IMAGE=${OPTARG} ;;
"t") OPT_TAG=${OPTARG} ;;
"h") usage ;;
"p") OPT_PUSH=true ;;
"n") OPT_DRY=true ;;
":") error "missing argument to option '${OPTARG}'" ;;
"?") error "invalid option '${OPTARG}'" ;;
esac
done

if test $((${OPTIND}-1)) -ne $#; then
error "wrong # of arguments ($#)"
fi
}

set -eu

parse_args "$@"

GCC_COMPILER_IMAGE=${OPT_GCC_IMAGE}
CLANG_COMPILER_IMAGE=${OPT_CLANG_IMAGE}
case ${OPT_TAG} in
"latest")
GCC_COMPILER_IMAGE=${GCC_LATEST_IMAGE}
GCC_TAG=gcc-${OPT_TAG}
CLANG_COMPILER_IMAGE=${CLANG_LATEST_IMAGE}
CLANG_TAG=clang-${OPT_TAG}
;;
"NONE")
GCC_TAG=${OPT_GCC_IMAGE}
CLANG_TAG=${OPT_CLANG_IMAGE}
;;
*)
GCC_TAG=gcc-${OPT_TAG}
CLANG_TAG=clang-${OPT_TAG}
;;
esac

if ${OPT_DRY}; then
dry="echo"
else
TAG="$1"
dry=""
fi

set -euv
if ${OPT_PUSH}; then
push="--push"
else
push=""
echo "warning: images are not pushed."
fi

docker build --target gcc-image -t ${REPOSITORY}:gcc-${TAG} .
docker build --target clang-image -t ${REPOSITORY}:clang-${TAG} .
docker push ${REPOSITORY}:gcc-${TAG}
docker push ${REPOSITORY}:clang-${TAG}
cd ${SCRIPTDIR}
if test "${GCC_COMPILER_IMAGE}" != "NONE"; then
${dry} docker build --build-arg "COMPILER_IMAGE=${GCC_COMPILER_IMAGE}" \
--target target-image -t ${REPOSITORY}:${GCC_TAG} .
else
echo "no image built for GCC compiler"
fi

if test "${CLANG_COMPILER_IMAGE}" != "NONE"; then
${dry} docker build --build-arg "COMPILER_IMAGE=${CLANG_COMPILER_IMAGE}" \
--target target-image -t ${REPOSITORY}:${CLANG_TAG} .
else
echo "no image built for CLANG compiler"
fi

0 comments on commit 1d3d849

Please sign in to comment.