FROM ubuntu:bionic # Install packages available from standard repos RUN apt-get update -qq && \ apt-get install -y --no-install-recommends \ software-properties-common wget git gpg-agent file \ python3 python3-pip graphviz ccache cppcheck build-essential \ neovim # User-settable versions: # This Dockerfile should support gcc-[7, 8, 9, 10] and clang-[10, 11] # Earlier versions of clang will require significant modifications to the IWYU section ARG GCC_VER="10" ARG LLVM_VER="11" # Add gcc-${GCC_VER} RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test && \ apt-get update -qq && \ apt-get install -y --no-install-recommends gcc-${GCC_VER} g++-${GCC_VER} # Add clang-${LLVM_VER} RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - 2>/dev/null && \ add-apt-repository -y "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-${LLVM_VER} main" && \ apt-get update -qq && \ apt-get install -y --no-install-recommends \ clang-${LLVM_VER} lldb-${LLVM_VER} lld-${LLVM_VER} clangd-${LLVM_VER} \ llvm-${LLVM_VER}-dev libclang-${LLVM_VER}-dev clang-tidy-${LLVM_VER} # Add current cmake/ccmake, from Kitware RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null \ | gpg --dearmor - | tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null && \ apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' && \ apt-get update -qq && \ apt-get install -y --no-install-recommends cmake cmake-curses-gui # Set the default clang-tidy, so CMake can find it RUN update-alternatives --install /usr/bin/clang-tidy clang-tidy $(which clang-tidy-${LLVM_VER}) 1 # Install include-what-you-use ENV IWYU /home/iwyu ENV IWYU_BUILD ${IWYU}/build ENV IWYU_SRC ${IWYU}/include-what-you-use RUN mkdir -p ${IWYU_BUILD} && \ git clone --branch clang_${LLVM_VER} \ https://github.com/include-what-you-use/include-what-you-use.git \ ${IWYU_SRC} RUN CC=clang-${LLVM_VER} CXX=clang++-${LLVM_VER} cmake -S ${IWYU_SRC} \ -B ${IWYU_BUILD} \ -G "Unix Makefiles" -DCMAKE_PREFIX_PATH=/usr/lib/llvm-${LLVM_VER} && \ cmake --build ${IWYU_BUILD} -j && \ cmake --install ${IWYU_BUILD} # Per https://github.com/include-what-you-use/include-what-you-use#how-to-install: # `You need to copy the Clang include directory to the expected location before # running (similarly, use include-what-you-use -print-resource-dir to learn # exactly where IWYU wants the headers).` RUN mkdir -p $(include-what-you-use -print-resource-dir 2>/dev/null) RUN ln -s $(readlink -f /usr/lib/clang/${LLVM_VER}/include) \ $(include-what-you-use -print-resource-dir 2>/dev/null)/include ## Cleanup cached apt data we don't need anymore #RUN apt-get clean && \ # rm -rf /var/lib/apt/lists/* # Set gcc-${GCC_VER} as default gcc RUN update-alternatives --install /usr/bin/gcc gcc $(which gcc-${GCC_VER}) 100 RUN update-alternatives --install /usr/bin/g++ g++ $(which g++-${GCC_VER}) 100 # Set clang-${LLVM_VER} as default clang RUN update-alternatives --install /usr/bin/clang clang $(which clang-${LLVM_VER}) 100 RUN update-alternatives --install /usr/bin/clang++ clang++ $(which clang++-${LLVM_VER}) 100 # Allow the user to set compiler defaults ARG USE_CLANG # if --build-arg USE_CLANG=1, set CC to 'clang' or set to null otherwise. ENV CC=${USE_CLANG:+"clang"} ENV CXX=${USE_CLANG:+"clang++"} # if CC is null, set it to 'gcc' (or leave as is otherwise). ENV CC=${CC:-"gcc"} ENV CXX=${CXX:-"g++"} # Include project ADD . /starter_project WORKDIR /starter_project CMD ["/bin/bash"]