diff --git a/.github/workflows/cmake-multi-platform.yml b/.github/workflows/cmake-multi-platform.yml new file mode 100644 index 0000000..0d560fc --- /dev/null +++ b/.github/workflows/cmake-multi-platform.yml @@ -0,0 +1,151 @@ +# Github CI config +# Inspired by https://github.com/libcpr/cpr/blob/master/.github/workflows/ci.yml +# Runs: clang format check, g++ & clang, release & debug, on Fedora + +name: OSTree-TUI CI + +on: [push, workflow_dispatch, pull_request] + +env: + # ctest not used yet + # standard dependencies for building & project + BUILD_DEPENDENCIES: "gcc-c++ clang git gcc gdb make cmake automake autoconf" + OSTREE_TUI_DEPENDENCIES: "glib2-devel gtk-doc ostree-devel libtool bison liblzf e2fsprogs-devel xz-devel gpgme-devel fuse-devel" + +jobs: + fedora-clang: + strategy: + matrix: + buildType: [Debug, Release] + runs-on: ubuntu-latest + container: "fedora:latest" + steps: + - name: Update package list + run: dnf update -y + - name: Install Dependencies + run: | + sudo dnf install -y ${{ env.BUILD_DEPENDENCIES }} + sudo dnf install -y ${{ env.OSTREE_TUI_DEPENDENCIES }} + - name: Checkout + uses: actions/checkout@v3 + - name: "Build" # & Test" + env: + CPR_BUILD_TESTS: OFF # ON + uses: ashutoshvarma/action-cmake-build@master + with: + build-dir: ${{ github.workspace }}/build + source-dir: ${{ github.workspace }} + cc: clang + cxx: clang++ + build-type: Release + run-test: false # true + # ctest-options: ${{ env.CTEST_OPTIONS }} + + fedora-gcc: + strategy: + matrix: + buildType: [Debug, Release] + runs-on: ubuntu-latest + container: "fedora:latest" + steps: + - name: Update package list + run: dnf update -y + - name: Install Dependencies + run: | + sudo dnf install -y ${{ env.BUILD_DEPENDENCIES }} + sudo dnf install -y ${{ env.OSTREE_TUI_DEPENDENCIES }} + - name: Checkout + uses: actions/checkout@v3 + - name: "Build" # & Test" + env: + CPR_BUILD_TESTS: OFF # ON + uses: ashutoshvarma/action-cmake-build@master + with: + build-dir: ${{ github.workspace }}/build + source-dir: ${{ github.workspace }} + cc: gcc + cxx: g++ + build-type: ${{ matrix.buildType }} + run-test: false # true + # ctest-options: ${{ env.CTEST_OPTIONS }} + + fedora-gcc-sanitizer: + strategy: + matrix: + buildType: [UdefSan, LeakSan, AddrSan, ThreadSan] + runs-on: ubuntu-latest + container: "fedora:latest" + steps: + - name: Update package list + run: dnf update -y + - name: Install Dependencies + run: | + sudo dnf install -y ${{ env.BUILD_DEPENDENCIES }} + sudo dnf install -y ${{ env.OSTREE_TUI_DEPENDENCIES }} + sudo dnf install -y libasan libubsan liblsan libtsan + - name: Checkout + uses: actions/checkout@v3 + - name: "Build" # & Test + env: + CPR_BUILD_TESTS: OFF + uses: ashutoshvarma/action-cmake-build@master + with: + build-dir: ${{ github.workspace }}/build + source-dir: ${{ github.workspace }} + cc: gcc + cxx: g++ + build-type: ${{ matrix.buildType }} + run-test: false # true + # ctest-options: ${{ env.CTEST_OPTIONS }} + + clang-tidy: + runs-on: ubuntu-latest + container: "fedora:latest" + steps: + - name: Update package list + run: sudo dnf update -y + - name: Install dependencies + run: | + sudo dnf install -y cmake git gcc-c++ clang ninja-build automake autoconf clang-tools-extra + sudo dnf install -y ${{ env.OSTREE_TUI_DEPENDENCIES }} + - name: Checkout + uses: actions/checkout@v3 + - name: "Build Debug" # & Test" + env: + CPR_BUILD_TESTS: OFF # ON + uses: ashutoshvarma/action-cmake-build@master + with: + build-dir: ${{github.workspace}}/build + source-dir: ${{github.workspace}} + cc: clang + cxx: clang++ + build-type: Debug + run-test: false + configure-options: -DCPR_ENABLE_LINTING=ON + + clang-format: + runs-on: ubuntu-latest + container: "fedora:latest" + steps: + - name: Update package list + run: sudo dnf update -y + - name: Install clang-format + run: sudo dnf install -y clang-tools-extra + - name: Checkout + uses: actions/checkout@v3 + - name: Check format + run: bash scripts/check_clang_format.sh + + cppcheck: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: "Run cppcheck" + uses: deep5050/cppcheck-action@main + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + check_library: enable + enable: warning,style,performance,missingInclude + output_file: cppcheck_report.txt + - name: "Print report" + run: cat cppcheck_report.txt diff --git a/scripts/check_clang_format.sh b/scripts/check_clang_format.sh new file mode 100644 index 0000000..0ae00aa --- /dev/null +++ b/scripts/check_clang_format.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Based on: https://gist.github.com/leilee/1d0915a583f8f29414cc21cd86e7151b +# Checks if all files are formatted based on the clang-format formatting rules. +# Execute as follows: +# ./scripts/check_clang_format.sh src + +printf "📑 Checking if your code fulfills all clang-format rules...\n" + +RET_CODE=0 + +function format() { + for f in $(find $@ -name '*.h' -or -name '*.hpp' -or -name '*.c' -or -name '*.cpp'); do + clang-format -i --dry-run --Werror --style=file ${f}; + ret=$? + if [ $ret -ne 0 ]; then + RET_CODE=$ret + fi + done + + echo "~~~ $@ directory checked ~~~"; +} + +# Check all of the arguments first to make sure they're all directories +for dir in "$@"; do + if [ ! -d "${dir}" ]; then + echo "${dir} is not a directory"; + else + format ${dir}; + fi +done + +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' + +if [ $RET_CODE -eq 0 ]; then + printf "✅ ${GREEN}Everything up to standard :party: ${NC}\n" +else + printf "❌ ${RED}Not up to formatting standard :sad_face: ${NC}\n" + echo "Try running run_clang_format.sh to format all files." +fi + +exit $RET_CODE diff --git a/scripts/run_clang_format.sh b/scripts/run_clang_format.sh new file mode 100644 index 0000000..a09b3e5 --- /dev/null +++ b/scripts/run_clang_format.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Based on: https://gist.github.com/leilee/1d0915a583f8f29414cc21cd86e7151b +# Run from the project root directory as follows: +# ./scripts/run_clang_format.sh tests + +printf "📝 Running clang-format...\n" + +function format() { + for f in $(find $@ -name '*.h' -or -name '*.hpp' -or -name '*.c' -or -name '*.cpp'); do + echo "format ${f}"; + clang-format -i --style=file ${f}; + done + + echo "~~~ $@ directory formatted ~~~"; +} + +# Check all of the arguments first to make sure they're all directories +for dir in "$@"; do + if [ ! -d "${dir}" ]; then + echo "${dir} is not a directory"; + else + format ${dir}; + fi +done + +GREEN='\033[0;32m' +NC='\033[0m' + +printf "✅ ${GREEN}Done. All files were formatted (if required).${NC}\n"