|
| 1 | +# [Choice] bionic (18.04), focal (20.04) |
| 2 | +ARG VARIANT="focal" |
| 3 | +FROM ubuntu:${VARIANT} |
| 4 | + |
| 5 | +# Restate the variant to use it later on in the llvm and cmake installations |
| 6 | +ARG VARIANT |
| 7 | + |
| 8 | +# Install necessary packages available from standard repos |
| 9 | +RUN apt-get update -qq && export DEBIAN_FRONTEND=noninteractive && \ |
| 10 | + apt-get install -y --no-install-recommends \ |
| 11 | + software-properties-common wget apt-utils file zip \ |
| 12 | + openssh-client gpg-agent socat rsync \ |
| 13 | + make ninja-build git \ |
| 14 | + python3 python3-pip |
| 15 | + |
| 16 | +# User-settable versions: |
| 17 | +# This Dockerfile should support gcc-[7, 8, 9, 10, 11] and clang-[10, 11, 12, 13] |
| 18 | +# Earlier versions of clang will require significant modifications to the IWYU section |
| 19 | +ARG GCC_VER="11" |
| 20 | +# Add gcc-${GCC_VER} |
| 21 | +RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test && \ |
| 22 | + apt-get update -qq && export DEBIAN_FRONTEND=noninteractive && \ |
| 23 | + apt-get install -y --no-install-recommends \ |
| 24 | + gcc-${GCC_VER} g++-${GCC_VER} gdb |
| 25 | + |
| 26 | +# Set gcc-${GCC_VER} as default gcc |
| 27 | +RUN update-alternatives --install /usr/bin/gcc gcc $(which gcc-${GCC_VER}) 100 |
| 28 | +RUN update-alternatives --install /usr/bin/g++ g++ $(which g++-${GCC_VER}) 100 |
| 29 | + |
| 30 | +ARG LLVM_VER="13" |
| 31 | +# Add clang-${LLVM_VER} |
| 32 | +ARG LLVM_URL="http://apt.llvm.org/${VARIANT}/" |
| 33 | +ARG LLVM_PKG="llvm-toolchain-${VARIANT}-${LLVM_VER}" |
| 34 | +RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - 2>/dev/null && \ |
| 35 | + add-apt-repository -y "deb ${LLVM_URL} ${LLVM_PKG} main" && \ |
| 36 | + apt-get update -qq && export DEBIAN_FRONTEND=noninteractive && \ |
| 37 | + apt-get install -y --no-install-recommends \ |
| 38 | + clang-${LLVM_VER} lldb-${LLVM_VER} lld-${LLVM_VER} clangd-${LLVM_VER} \ |
| 39 | + llvm-${LLVM_VER}-dev libclang-${LLVM_VER}-dev clang-tidy-${LLVM_VER} |
| 40 | + |
| 41 | +# Set the default clang-tidy, so CMake can find it |
| 42 | +RUN update-alternatives --install /usr/bin/clang-tidy clang-tidy $(which clang-tidy-${LLVM_VER}) 1 |
| 43 | + |
| 44 | +# Set clang-${LLVM_VER} as default clang |
| 45 | +RUN update-alternatives --install /usr/bin/clang clang $(which clang-${LLVM_VER}) 100 |
| 46 | +RUN update-alternatives --install /usr/bin/clang++ clang++ $(which clang++-${LLVM_VER}) 100 |
| 47 | + |
| 48 | +# Add current cmake/ccmake, from Kitware |
| 49 | +ARG CMAKE_URL="https://apt.kitware.com/ubuntu/" |
| 50 | +ARG CMAKE_PKG=${VARIANT} |
| 51 | +RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null \ |
| 52 | + | gpg --dearmor - | tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null && \ |
| 53 | + apt-add-repository -y "deb ${CMAKE_URL} ${CMAKE_PKG} main" && \ |
| 54 | + apt-get update -qq && export DEBIAN_FRONTEND=noninteractive && \ |
| 55 | + apt-get install -y --no-install-recommends cmake cmake-curses-gui |
| 56 | + |
| 57 | +# Install editors |
| 58 | +RUN apt-get update -qq && export DEBIAN_FRONTEND=noninteractive && \ |
| 59 | + apt-get install -y --no-install-recommends \ |
| 60 | + neovim emacs nano |
| 61 | + |
| 62 | +# Install optional dependecies |
| 63 | +RUN apt-get update -qq && export DEBIAN_FRONTEND=noninteractive && \ |
| 64 | + apt-get install -y --no-install-recommends \ |
| 65 | + doxygen graphviz ccache cppcheck |
| 66 | + |
| 67 | +# Install include-what-you-use |
| 68 | +ENV IWYU /home/iwyu |
| 69 | +ENV IWYU_BUILD ${IWYU}/build |
| 70 | +ENV IWYU_SRC ${IWYU}/include-what-you-use |
| 71 | +RUN mkdir -p ${IWYU_BUILD} && \ |
| 72 | + git clone --branch clang_${LLVM_VER} \ |
| 73 | + https://github.com/include-what-you-use/include-what-you-use.git \ |
| 74 | + ${IWYU_SRC} |
| 75 | +RUN CC=clang-${LLVM_VER} CXX=clang++-${LLVM_VER} cmake -S ${IWYU_SRC} \ |
| 76 | + -B ${IWYU_BUILD} \ |
| 77 | + -G "Unix Makefiles" -DCMAKE_PREFIX_PATH=/usr/lib/llvm-${LLVM_VER} && \ |
| 78 | + cmake --build ${IWYU_BUILD} -j && \ |
| 79 | + cmake --install ${IWYU_BUILD} |
| 80 | + |
| 81 | +# Per https://github.com/include-what-you-use/include-what-you-use#how-to-install: |
| 82 | +# `You need to copy the Clang include directory to the expected location before |
| 83 | +# running (similarly, use include-what-you-use -print-resource-dir to learn |
| 84 | +# exactly where IWYU wants the headers).` |
| 85 | +RUN mkdir -p $(include-what-you-use -print-resource-dir 2>/dev/null) |
| 86 | +RUN ln -s $(readlink -f /usr/lib/clang/${LLVM_VER}/include) \ |
| 87 | + $(include-what-you-use -print-resource-dir 2>/dev/null)/include |
| 88 | + |
| 89 | +## Cleanup cached apt data we don't need anymore |
| 90 | +RUN apt-get autoremove -y && apt-get clean && \ |
| 91 | + rm -rf /var/lib/apt/lists/* |
| 92 | + |
| 93 | +# Allow the user to set compiler defaults |
| 94 | +ARG USE_CLANG |
| 95 | +# if --build-arg USE_CLANG=1, set CC to 'clang' or set to null otherwise. |
| 96 | +ENV CC=${USE_CLANG:+"clang"} |
| 97 | +ENV CXX=${USE_CLANG:+"clang++"} |
| 98 | +# if CC is null, set it to 'gcc' (or leave as is otherwise). |
| 99 | +ENV CC=${CC:-"gcc"} |
| 100 | +ENV CXX=${CXX:-"g++"} |
| 101 | + |
| 102 | +# Include project |
| 103 | +#ADD . /workspaces/cpp_starter_project |
| 104 | +#WORKDIR /workspaces/cpp_starter_project |
| 105 | + |
| 106 | +CMD ["/bin/bash"] |
0 commit comments