diff --git a/CMakeLists.txt b/CMakeLists.txt index ffc92f2..5f3516f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,7 @@ pkg_check_modules( LIBNM REQUIRED IMPORTED_TARGET - libnm>=1.32.12) + libnm>=1.10.6) FetchContent_Declare(ftxui GIT_REPOSITORY "https://github.com/arthursonzogni/ftxui.git" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0cbe107 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,86 @@ +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"] diff --git a/meson.build b/meson.build index b6a07de..a7f9c32 100644 --- a/meson.build +++ b/meson.build @@ -36,7 +36,7 @@ fmt = dependency('fmt', version : ['>=8.0.0'], fallback : ['fmt', 'fmt_dep']) ftxui = dependency('ftxui', modules : ['ftxui::screen', 'ftxui::dom', 'ftxui::component'], fallback : ['ftxui', 'ftxui_dep']) nlohmann_json = dependency('nlohmann_json', version : ['>=3.10.4'], fallback : ['nlohmann_json', 'nlohmann_json_dep']) cpr = dependency('cpr', version : ['>=1.7.0'], fallback : ['cpr', 'cpr_dep']) -libnm = dependency('libnm', version : ['>=1.32.12']) +libnm = dependency('libnm', version : ['>=1.10.6']) src_files = files( 'src/definitions.hpp', diff --git a/src/definitions.hpp b/src/definitions.hpp index 195ff3d..db4bb20 100644 --- a/src/definitions.hpp +++ b/src/definitions.hpp @@ -1,6 +1,8 @@ #ifndef DEFINITIONS_HPP #define DEFINITIONS_HPP +#include // for stderr + #include #include diff --git a/src/main.cpp b/src/main.cpp index f282cf5..01d177f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,9 +3,9 @@ #include "tui.hpp" #include "utils.hpp" -#include -#include -#include +#include // for seconds +#include // for regex_search, match_results<>::_Base_type +#include // for sleep_for int main() { const auto& tty = utils::exec("tty"); diff --git a/src/tui.cpp b/src/tui.cpp index 66b7bfa..7259b01 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -2,12 +2,15 @@ #include "definitions.hpp" #include "utils.hpp" -#include -#include -#include -#include -#include -#include +/* clang-format off */ +#include // for __shared_ptr_access +#include // for basic_string +#include // for ftxui +#include // for Renderer, Button +#include // for ButtonOption +#include // for Component, ScreenI... +#include // for operator|, size +/* clang-format on */ using namespace ftxui; diff --git a/src/tui.hpp b/src/tui.hpp index 95c3c53..87a7f26 100644 --- a/src/tui.hpp +++ b/src/tui.hpp @@ -1,7 +1,11 @@ #ifndef TUI_HPP #define TUI_HPP -#include +/* clang-format off */ +#include // for string_view +#include // for Component +#include // for Element +/* clang-format on */ namespace tui { ftxui::Element centered_widget(ftxui::Component& container, const std::string_view& title, const ftxui::Element& widget); diff --git a/src/utils.cpp b/src/utils.cpp index 46e94eb..e2d5c80 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -1,13 +1,19 @@ #include "utils.hpp" #include "config.hpp" -#include -#include - -#include -#include -#include -#include +#include // for array +#include // for filesystem, seconds +#include // for int32_t +#include // for feof, fgets, pclose, perror, popen +#include // for exit, WIFEXITED, WIFSIGNALED +#include // for exists, is_directory +#include // for basic_istream, cin +#include // for operator==, string, basic_string, allocator +#include // for mount +#include // for waitpid +#include // for sleep_for +#include // for execvp, fork +#include // for unordered_map #include #include @@ -41,7 +47,7 @@ bool check_root() noexcept { void clear_screen() noexcept { static constexpr auto CLEAR_SCREEN_ANSI = "\033[1;1H\033[2J"; - write(STDOUT_FILENO, CLEAR_SCREEN_ANSI, 11); + output("{}", CLEAR_SCREEN_ANSI); } std::string exec(const std::string_view& command, bool capture_output) noexcept { @@ -50,7 +56,7 @@ std::string exec(const std::string_view& command, bool capture_output) noexcept auto pid = fork(); if (pid == 0) { /* clang-format off */ - char* args[2] = { const_cast(command.data()), NULL }; + char* args[2] = { const_cast(command.data()), nullptr }; /* clang-format on */ execvp(args[0], args); } else { diff --git a/src/utils.hpp b/src/utils.hpp index d0b3b3e..19ee057 100644 --- a/src/utils.hpp +++ b/src/utils.hpp @@ -3,7 +3,8 @@ #include "definitions.hpp" -#include +#include // for string +#include // for string_view namespace utils { void print_banner() noexcept;