commit 48ca0420054ad3b69d6dc26ee98a7fd464068409 Author: Kyle Isom Date: Wed Oct 18 18:17:43 2023 -0700 Initial import. diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..798c146 --- /dev/null +++ b/Containerfile @@ -0,0 +1,24 @@ +FROM docker.io/library/ubuntu:jammy +LABEL maintainer="K. Isom " + +ARG DEBIAN_FRONTEND=noninteractive +ARG AUTOMATED_MODE=yes +ARG USE_CLANG=yes +ENV TZ=America/Los_Angeles + +# prepare build +RUN mkdir -p /usr/local/sc/bin /build +ENV PATH="${PATH}:/usr/local/sc/bin/" +RUN apt-get update && apt-get install -y bash ca-certificates sudo + +# setup shimmering-clarity development +# environment +ADD *.sh /usr/local/sc/bin/ +RUN container-setup.sh + +# clean image +RUN apt-get autoclean && \ + apt-get autoremove && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* +WORKDIR /build diff --git a/Containerfile.alpine b/Containerfile.alpine new file mode 100644 index 0000000..0aabcce --- /dev/null +++ b/Containerfile.alpine @@ -0,0 +1,19 @@ +FROM docker.io/library/alpine:3.18 +LABEL maintainer="K. Isom " +ARG AUTOMATED_MODE=yes +ARG USE_CLANG=yes +ENV TZ=America/Los_Angeles + +# prepare build +RUN mkdir -p /usr/local/sc/bin /build +ENV PATH="${PATH}:/usr/local/sc/bin/" +RUN apk add --update-cache bash + +# setup shimmering-clarity development +# environment +ADD *.sh /usr/local/sc/bin/ +RUN container-setup.sh + +# clean image +RUN rm -f /var/cache/apk/* +WORKDIR /build diff --git a/Containerfile.debian b/Containerfile.debian new file mode 100644 index 0000000..23d178b --- /dev/null +++ b/Containerfile.debian @@ -0,0 +1,23 @@ +FROM docker.io/library/debian:12.2 +LABEL maintainer="K. Isom " +ARG DEBIAN_FRONTEND=noninteractive +ARG AUTOMATED_MODE=yes +ARG USE_CLANG=yes +ENV TZ=America/Los_Angeles + +# prepare build +RUN mkdir -p /usr/local/sc/bin /build +ENV PATH="${PATH}:/usr/local/sc/bin/" +RUN apt-get update && apt-get install -y bash ca-certificates sudo + +# setup shimmering-clarity development +# environment +ADD *.sh /usr/local/sc/bin/ +RUN container-setup.sh + +# clean image +RUN apt-get autoclean && \ + apt-get autoremove && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* +WORKDIR /build diff --git a/Containerfile.fedora b/Containerfile.fedora new file mode 100644 index 0000000..8e44c5c --- /dev/null +++ b/Containerfile.fedora @@ -0,0 +1,18 @@ +FROM docker.io/library/fedora:38 +LABEL maintainer="K. Isom " +ARG AUTOMATED_MODE=yes +ENV TZ=America/Los_Angeles + +# prepare build +RUN mkdir -p /usr/local/sc/bin /build +ENV PATH="${PATH}:/usr/local/sc/bin/" +RUN dnf install -y bash + +# setup shimmering-clarity development +# environment +ADD *.sh /usr/local/sc/bin/ +RUN container-setup.sh + +# clean package +RUN dnf clean all && rm -rf /var/cache/yum +WORKDIR /build diff --git a/README.md b/README.md new file mode 100644 index 0000000..708a502 --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +# sc3dev +## the shimmering clarity c++ development environment + +This is a set of tools to set up the standard development environment +used across shimmering clarity projects. + +### Scripts + +- build-all-containers.sh automates building all supported + containers. +- build-container.sh automated building and pushing a container. +- check-code.sh wraps several code scanning tools. +- install-cmake-debian.sh install the latest CMake on Debian- + based systems. +- install-depdendencies.sh installs the tools needed to build and + package projects. +- setup-cmake.sh sets up cmake projects building a RelWithDebInfo + config. +- validate-container.sh attempts to clone a few repos and build/test + them, validating that the image contains the correct tools to + build them. + + +- install-devenv.sh - check-code.sh + +### OCI imags + +- Containerfile is an OCI-image spec for building development images. +- Containerfile.{flavor} provide additional images for testing. Current + flavors are: + + - alpine: (Alpine 3.18) a minimal image, suitable for CI + - debian: (Debian 12.2) verify Debian installation + - fedora: (Fedora 38) verify Fedora installation diff --git a/build-all-containers.sh b/build-all-containers.sh new file mode 100755 index 0000000..dc8583b --- /dev/null +++ b/build-all-containers.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +###################################################################### +# @author : kyle (kyle@imap.cc) +# @file : build-all-containers.sh +# @created : Wednesday Oct 18, 2023 18:09:07 PDT +# +# @description : build the containers in this project and push them. +###################################################################### + +# most important is the main build +./build-container.sh Containerfile sc/dev:main + +for container_file in Containerfile.* +do + flavor="${container_file#Containerfile.}" + ./build-container.sh Container.${flavor} sc/dev:${flavor} +done + diff --git a/build-container.sh b/build-container.sh new file mode 100755 index 0000000..cd45bdd --- /dev/null +++ b/build-container.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +###################################################################### +# @author : kyle (kyle@imap.cc) +# @file : build-container.sh +# @created : Wednesday Oct 18, 2023 15:04:57 PDT +# +# @description : build a new container image +###################################################################### + +set -eu + +CONTAINERFILE="${1}" +IMAGE_NAME="git.wntrmute.dev/${2}" + +podman build -t ${IMAGE_NAME} -f ${CONTAINERFILE} +podman push ${IMAGE_NAME} +podman container prune --force +podman image prune --force diff --git a/check-code.sh b/check-code.sh new file mode 100755 index 0000000..c0359d8 --- /dev/null +++ b/check-code.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env sh + +###################################################################### +# @author : kyle (kyle@midgard) +# @file : check-code +# @created : Tuesday Oct 17, 2023 22:39:39 PDT +# +# @description : +###################################################################### + + +run_clang_tidy () { + sources="${1:-*.cc}" + echo "[+] clang-tidy ${sources}" + + if [ ! -e compile_commands.json ] + then + echo "[!] compile_commands.json not found" > /dev/stderr + candidate=$(find -name compile_commands.json | head) + + if [ -z "${candidates}" ] + then + echo "[!] no suitable candidates found; can't proceed" > /dev/stderr + exit 1 + fi + + echo "[+] compile_commands.json candidate: $candidate" + ln -s ${candidate} . + echo "[+] if this isn't correct, you will need to manually link it" + fi + + clang-tidy ${sources} +} + + +run_cppcheck () { + sources="${1:-*.cc}" + echo "[+] cppcheck ${sources}" + + cppcheck --enable=all --suppress=unusedFunction --suppress=missingIncludeSystem -I. ${sources} +} + + +run_trunk () { + sources="${1:-}" + echo "[+] trunk check ${sources}" + + trunk check --filter clang-tidy ${sources} +} + + +main () { + command="${1:-usage}" + shift + + case ${command} in + clang-tidy) run_clang_tidy $@ ;; + cppcheck) run_cppcheck $@ ;; + trunk) run_trunk $@ ;; + *) + echo "[!] scanner ${command} isn't supported" > /dev/stderr + exit 1 + ;; + esac +} + +main $@ + diff --git a/cmake-build-and-test.sh b/cmake-build-and-test.sh new file mode 100755 index 0000000..1beb8f8 --- /dev/null +++ b/cmake-build-and-test.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +###################################################################### +# @author : kyle (kyleimap.cc) +# @file : setup-cmake +# @created : Wednesday Oct 18, 2023 04:24:21 PDT +# +# @description : Prepare a CMake build environment, build, and test. +###################################################################### + +set -eux + +if [ "${USE_CLANG:-}" == "yes" ] +then + export CC=$(command -v clang) + export CXX=$(command -v clang++) +fi + +mkdir -p build && cd build +cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. && make all test && ctest diff --git a/container-setup.sh b/container-setup.sh new file mode 100755 index 0000000..0e9d885 --- /dev/null +++ b/container-setup.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env sh + +###################################################################### +# @author : kyle (kyle@midgard) +# @file : container-setup +# @created : Wednesday Oct 18, 2023 18:13:11 PDT +# +# @description : small script to run the same tooling in each container. +# +# specifically, this enables easier renaming of scripts or refactoring +# scripts across every machine. +###################################################################### + +install-development-tools.sh +validate-container.sh + diff --git a/install-cmake-debian.sh b/install-cmake-debian.sh new file mode 100755 index 0000000..3822e10 --- /dev/null +++ b/install-cmake-debian.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +set -eu + + +source /etc/lsb-release +SUDO="sudo" +USE_CMAKE_RC="${USE_CMAKE_RC:-}" + +preinstall () { + echo "[+] preparing to install" + if [ "$(whoami)" == "root" ] + then + SUDO= + fi + + $SUDO apt-get -y update + $SUDO apt-get -y install ca-certificates gpg wget +} + +do_install () { + if [ ! -f /etc/apt/sources.list.d/kitware.list ] + then + echo "[+] fetching initial keyring" + wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | $SUDO tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null + + echo "[+] adding repo to sources.list.d" + echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ ${DISTRIB_CODENAME} main" | \ + $SUDO tee /etc/apt/sources.list.d/kitware.list >/dev/null + $SUDO apt-get -y update + + echo "[+] installing kitware keyring" + if [ -f "/usr/share/keyrings/kitware-archive-keyring.gpg" ] + then + $SUDO rm /usr/share/keyrings/kitware-archive-keyring.gpg + fi + $SUDO apt-get -y install kitware-archive-keyring + fi + + if [ "${USE_CMAKE_RC}" = "YES" ] + then + echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ ${DISTRIB_RELEASE}-rc main' | \ + $SUDO tee -a /etc/apt/sources.list.d/kitware.list >/dev/null + $SUDO apt-get update + fi +} + +preinstall +do_install +$SUDO apt-get install -y cmake diff --git a/install-development-tools.sh b/install-development-tools.sh new file mode 100755 index 0000000..65508ce --- /dev/null +++ b/install-development-tools.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash + +######################################################################### +# This script attempts to install the appopriate build dependencies # +# for the host system. # +# # +# This is primarily developed on the latest Ubuntu LTS release and # +# MacOS; other platforms are not supported. # +# # +# The primary packages required: # +# # +# - clang # +# - clang-tidy # +# - cmake # +# - cppcheck # +# - doxygen # +# - git # +# - graphviz # +# - make # +# - scdoc # +# # +# Furthermore, certain CI systems require additional packages, and some # +# base system packages are also useful. # +# # +# - bash # +# - ca-certificates # +# - gzip # +# - ssh # +# - tar # +######################################################################### + +set -eu + +AUTOMATED_MODE=${AUTOMATED_MODE:-} + +install_debianesque () { + APTARGS="" + SUDO="sudo" + if [ "$(whoami)" == "root" ] + then + SUDO= + fi + + if [ ! -z "${AUTOMATED_MODE}" ] + then + APTARGS="-y" + fi + + echo "[+] distribution is ${DISTRIB_ID}, choosing Debianesque install." + + if [ -z "$(command -v cmake)" ] + then + install-cmake-debian.sh + fi + + echo "[+] installing tools" + sudo $SUDO apt-get $APTARGS install git clang scdoc python3-pip doxygen graphviz +} + +install_alpine () { + APK_ADD="apk add --update-cache" + echo "[+] distribution is ${DISTRIB_ID}, choosing Alpine install." + + $APK_ADD alpine-sdk + + echo "[+] setting up base system" + $APK_ADD bash ca-certificates gzip openssh tar + + echo "[+] installing development tooling" + $APK_ADD clang clang-extra-tools cmake cppcheck doxygen g++ git \ + graphviz make scdoc +} + +install_redhat () { + DNF_INSTALL="dnf install -y" + SUDO="sudo" + if [ "$(whoami)" == "root" ] + then + SUDO= + fi + + echo "[+] setting up base system" + # dnf is probably the slowest package manager I've used, so + # install everything in one shot. + $DNF_INSTALL ca-certificates gzip openssh tar \ + clang clang-tools-extra cmake cppcheck doxygen \ + gcc-c++ git graphviz libstdc++-devel make scdoc +} + +install_unsupported () { + echo "[+] distribution is ${DISTRIB_ID}, choosing Redhat install." + echo "[!] This distribution is unsupported." > /dev/stderr + exit 1; +} + +install_macos () { + # TODO: consider supporting macports? + echo "[+] host system is MacOS" + + echo "[+] installing tools" + brew install git cmake scdoc + + echo "[+] installing libraries and development headers" + # TODO: look up proper package names in homebrew +} + + +install_linux () { + DISTRIB_ID="${DISTRIB_ID:-}" + echo "[+] host system is Linux" + if [[ -f "/etc/lsb-release" ]] + then + source /etc/lsb-release + elif [[ -d "/etc/apt" ]] + then + DISTRIB_ID="apt-based" + elif [[ -f "/etc/rpi-issue" ]] + then + DISTRIB_ID=apt-based + elif [[ -d "/etc/apk" ]] + then + DISTRIB_ID=alpine + elif [[ -d "/etc/dnf" ]] + then + DISTRIB_ID="redhat" + else + DISTRIB_ID="unsupported/unknown" + fi + + case ${DISTRIB_ID} in + Ubuntu) install_debianesque ;; + Debian) install_debianesque ;; + apt-based) install_debianesque ;; + alpine) install_alpine ;; + redhat) install_redhat ;; + *) + echo "[!] distribution ${DISTRIB_ID} isn't supported in this script." > /dev/null + exit 1 + ;; + esac +} + + +case "$(uname -s)" in + Linux) install_linux ;; + Darwin) install_macos ;; + *) + echo "[!] platform $(uname -s) isn't supported in this script." > /dev/null + ;; +esac + + diff --git a/validate-container.sh b/validate-container.sh new file mode 100755 index 0000000..3b4c464 --- /dev/null +++ b/validate-container.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env sh + +###################################################################### +# @author : kyle (kyle@imap.cc) +# @file : validate-container.sh +# @created : Wednesday Oct 18, 2023 15:04:57 PDT +# +# @description : validate container build actually builds repos. +###################################################################### + +set -eux + +check_repo () { + repo="${1}" + lpath="$(basename ${repo})" + cd /build + + echo "[+] cloning ${repo}" + git clone ${repo} + + cd ${lpath} + echo "[+] running build" + cmake-build-and-test.sh + + echo "[+] removing ${lpath}" + cd .. && rm -rf ${lpath} +} + +check_repo https://git.wntrmute.dev/sc/scsl +check_repo https://git.wntrmute.dev/sc/emsha