Skip to content

Instantly share code, notes, and snippets.

@vladiant
Last active September 12, 2025 20:19
Show Gist options
  • Select an option

  • Save vladiant/d4e23b09ef8e4acd40c0a97d9a861f63 to your computer and use it in GitHub Desktop.

Select an option

Save vladiant/d4e23b09ef8e4acd40c0a97d9a861f63 to your computer and use it in GitHub Desktop.

Revisions

  1. vladiant revised this gist Sep 12, 2025. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion ReadMe.md
    Original file line number Diff line number Diff line change
    @@ -5,4 +5,5 @@
    * <https://gist.github.com/NickNaso/ff50ecd38becbadafb1c40a5f2a49c87>
    * <https://github.com/hailiang194/NeoSekaiEngine>
    * <https://www.kdab.com/github-actions-for-cpp-and-qt/>
    * <https://github.com/MiKom/QtQuickApp>
    * <https://github.com/MiKom/QtQuickApp>
    * <https://github.com/AshleyRoll/arquebus> - .clang-format , .clang-tidy , .cmake-format.py , .pre-commit-config.yaml
  2. vladiant created this gist Aug 3, 2025.
    8 changes: 8 additions & 0 deletions ReadMe.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,8 @@
    ## Links
    * <https://github.com/andreasfertig/programming-with-cpp20>
    * <https://github.com/scivision/Cpp23-examples>
    * <https://github.com/uNetworking/uWebSockets>
    * <https://gist.github.com/NickNaso/ff50ecd38becbadafb1c40a5f2a49c87>
    * <https://github.com/hailiang194/NeoSekaiEngine>
    * <https://www.kdab.com/github-actions-for-cpp-and-qt/>
    * <https://github.com/MiKom/QtQuickApp>
    219 changes: 219 additions & 0 deletions ci.yml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,219 @@
    name: ci

    # Trigger on pushes to all branches and for all pull-requests
    on: [push, pull_request]

    env:
    CMAKE_VERSION: 3.28.2
    NINJA_VERSION: 1.10.0

    jobs:
    build:
    name: ${{ matrix.config.name }}
    runs-on: ${{ matrix.config.os }}
    strategy:
    fail-fast: false
    matrix:
    config:
    # GCC-13
    - {
    name: "Linux GCC 13",
    os: ubuntu-22.04,
    build_type: Release,
    cxx: "g++-13",
    gcc_version: 13,
    }

    # Clang-17
    - {
    name: "Linux Clang 17",
    os: ubuntu-22.04,
    build_type: Release,
    cxx: "clang++-17",
    clang_version: 17,
    libcxx: true
    }

    # # AppleClang
    # - {
    # name: "macOS Clang",
    # os: macos-latest,
    # build_type: Release,
    # cxx: "clang++",
    # }

    # MSVC 2019
    - {
    name: "Windows MSVC 2019",
    os: windows-latest,
    build_type: Release,
    cxx: "cl",
    environment_script: "C:/Program Files (x86)/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat",
    }

    steps:
    - uses: actions/checkout@v4
    with:
    fetch-depth: 2

    - name: Download Ninja and CMake
    id: cmake_and_ninja
    shell: cmake -P {0}
    run: |
    set(cmake_version $ENV{CMAKE_VERSION})
    set(ninja_version $ENV{NINJA_VERSION})
    message(STATUS "Using host CMake version: ${CMAKE_VERSION}")
    if ("${{ runner.os }}" STREQUAL "Windows")
    set(ninja_suffix "win.zip")
    set(cmake_suffix "windows-x86_64.zip")
    set(cmake_dir "cmake-${cmake_version}-windows-x86_64/bin")
    elseif ("${{ runner.os }}" STREQUAL "Linux")
    set(ninja_suffix "linux.zip")
    set(cmake_suffix "linux-x86_64.tar.gz")
    set(cmake_dir "cmake-${cmake_version}-linux-x86_64/bin")
    elseif ("${{ runner.os }}" STREQUAL "macOS")
    set(ninja_suffix "mac.zip")
    set(cmake_suffix "macos-universal.tar.gz")
    set(cmake_dir "cmake-${cmake_version}-macos-universal/CMake.app/Contents/bin")
    endif()
    set(ninja_url "https://github.com/ninja-build/ninja/releases/download/v${ninja_version}/ninja-${ninja_suffix}")
    file(DOWNLOAD "${ninja_url}" ./ninja.zip SHOW_PROGRESS)
    execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf ./ninja.zip)
    set(cmake_url "https://github.com/Kitware/CMake/releases/download/v${cmake_version}/cmake-${cmake_version}-${cmake_suffix}")
    file(DOWNLOAD "${cmake_url}" ./cmake.zip SHOW_PROGRESS)
    execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf ./cmake.zip)
    # preserve it for the next steps
    file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/${cmake_dir}" cmake_dir)
    message("::set-output name=cmake_dir::${cmake_dir}")
    if (NOT "${{ runner.os }}" STREQUAL "Windows")
    execute_process(
    COMMAND chmod +x ninja
    COMMAND chmod +x ${cmake_dir}/cmake
    )
    endif()
    - name: Install Clang 17
    id: install_clang_17
    if: startsWith(matrix.config.os, 'ubuntu') && startsWith(matrix.config.cxx, 'clang++-')
    shell: bash
    working-directory: ${{ env.HOME }}
    run: |
    wget https://apt.llvm.org/llvm.sh
    chmod +x llvm.sh
    sudo ./llvm.sh ${{ matrix.config.clang_version }}
    sudo apt-get install -y libunwind-${{ matrix.config.clang_version }}-dev libunwind-${{ matrix.config.clang_version }}
    - name: Install g++ 13
    id: install_gcc_13
    if: startsWith(matrix.config.os, 'ubuntu') && ( matrix.config.cxx == 'g++-13' )
    shell: bash
    working-directory: ${{ env.HOME }}
    env:
    CXX: ${{ matrix.config.cxx }}
    run: |
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
    sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    sudo apt-get update
    sudo apt-get install g++-${{ matrix.config.gcc_version }}
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100
    - name: Install libc++
    id: install_libcxx
    if: matrix.config.libcxx
    shell: bash
    working-directory: ${{ env.HOME }}
    env:
    CXX: ${{ matrix.config.cxx }}
    run: |
    sudo apt-get install libc++-${{ matrix.config.clang_version }}-dev libc++abi-${{ matrix.config.clang_version }}-dev
    - name: Setup MSVC Dev
    if: "startsWith(matrix.config.os, 'Windows')"
    uses: ilammy/msvc-dev-cmd@v1

    - name: Configure
    id: cmake_configure
    shell: cmake -P {0}
    run: |
    set(ENV{CXX} ${{ matrix.config.cxx }})
    if ("${{ runner.os }}" STREQUAL "Windows")
    execute_process(
    COMMAND "${{ matrix.config.environment_script }}" && set
    OUTPUT_FILE environment_script_output.txt
    )
    set(cxx_flags "/permissive- /EHsc")
    file(STRINGS environment_script_output.txt output_lines)
    foreach(line IN LISTS output_lines)
    if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$")
    set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}")
    endif()
    endforeach()
    endif()
    set(path_separator ":")
    if ("${{ runner.os }}" STREQUAL "Windows")
    set(path_separator ";")
    endif()
    set(ENV{PATH} "$ENV{GITHUB_WORKSPACE}${path_separator}$ENV{PATH}")
    if ("x${{ matrix.config.libcxx }}" STREQUAL "xtrue")
    set(cxx_flags "${cxx_flags} -stdlib=libc++ -Wno-unused-command-line-argument")
    set(link_flags "${link_flags} -lc++abi")
    endif()
    execute_process(
    COMMAND ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake
    -S .
    -B build
    -G Ninja
    -D CMAKE_BUILD_TYPE=${{ matrix.config.build_type }}
    -D CMAKE_MAKE_PROGRAM:STRING=ninja
    -D "CMAKE_CXX_FLAGS:STRING=${cxx_flags}"
    -D "CMAKE_EXE_LINKER_FLAGS:STRING=${link_flags}"
    ${{ matrix.config.cmake_args }}
    RESULT_VARIABLE result
    )
    if (NOT result EQUAL 0)
    message(FATAL_ERROR "Bad exit from cmake configure status")
    endif()
    - name: Build
    shell: cmake -P {0}
    continue-on-error: false
    run: |
    set(ENV{NINJA_STATUS} "[%f/%t %o/sec] ")
    if ("${{ runner.os }}" STREQUAL "Windows")
    execute_process(
    COMMAND "${{ matrix.config.environment_script }}" && set
    OUTPUT_FILE environment_script_output.txt
    )
    set(cxx_flags "/permissive- /EHsc")
    file(STRINGS environment_script_output.txt output_lines)
    foreach(line IN LISTS output_lines)
    if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$")
    set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}")
    endif()
    endforeach()
    endif()
    set(path_separator ":")
    if ("${{ runner.os }}" STREQUAL "Windows")
    set(path_separator ";")
    endif()
    set(ENV{PATH} "$ENV{GITHUB_WORKSPACE}${path_separator}$ENV{PATH}")
    execute_process(
    COMMAND ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake --build build
    RESULT_VARIABLE result
    )
    if (NOT result EQUAL 0)
    message(FATAL_ERROR "Bad exit status from building")
    endif()
    152 changes: 152 additions & 0 deletions cmake.yml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,152 @@
    name: cmake

    on:
    push:
    paths:
    - "**.cpp"
    - "**.ixx"
    - "**.cmake"
    - "**/CMakeLists.txt"
    - ".github/workflows/cmake.yml"
    workflow_dispatch:

    # avoid wasted runs
    concurrency:
    group: ${{ github.workflow }}-${{ github.ref }}
    cancel-in-progress: true

    env:
    CTEST_NO_TESTS_ACTION: error
    CTEST_PARALLEL_LEVEL: 0
    CMAKE_BUILD_PARALLEL_LEVEL: 4
    HOMEBREW_NO_AUTO_UPDATE: 1


    jobs:

    gcc-new:
    runs-on: ubuntu-latest
    timeout-minutes: 5

    strategy:
    matrix:
    cxx: [g++-12, g++-13, g++-14, clang++-18]

    env:
    CXX: ${{ matrix.cxx }}

    steps:
    - uses: actions/checkout@v4

    - run: cmake --workflow debug

    - run: cmake --workflow release

    - uses: actions/upload-artifact@v4
    if: success()
    with:
    name: ${{ matrix.cxx }}_features.json
    path: build/features.json


    gcc-old:
    runs-on: ubuntu-22.04
    timeout-minutes: 5

    strategy:
    matrix:
    cxx: [g++-9, g++-10, g++-11]

    env:
    CXX: ${{ matrix.cxx }}

    steps:
    - uses: actions/checkout@v4

    - run: cmake --workflow debug

    - run: cmake --workflow release

    - uses: actions/upload-artifact@v4
    if: success()
    with:
    name: ${{ matrix.cxx }}_features.json
    path: build/features.json


    mac:
    runs-on: macos-latest
    timeout-minutes: 5

    env:
    HOMEBREW_NO_AUTO_CLEANUP: 1
    CXX: ${{ matrix.cxx }}

    strategy:
    matrix:
    cxx: [clang++, g++-14]

    steps:
    - uses: actions/checkout@v4

    - run: cmake --workflow debug

    - run: cmake --workflow release

    - uses: actions/upload-artifact@v4
    if: success()
    with:
    name: ${{ runner.os }}-${{ matrix.cxx }}_features.json
    path: build/features.json



    windows-msvc:
    runs-on: windows-latest

    steps:
    - uses: actions/checkout@v4

    - run: cmake --workflow msvc

    - uses: actions/upload-artifact@v4
    if: success()
    with:
    name: ${{ runner.os }}-MSVC_features.json
    path: build/features.json


    windows-gcc:
    runs-on: windows-latest
    timeout-minutes: 10

    steps:
    - uses: msys2/setup-msys2@v2
    id: msys2
    with:
    update: true
    install: >-
    mingw-w64-ucrt-x86_64-gcc
    # need GCC install to get latest G++

    - name: Put MSYS2_MinGW64 on PATH
    run: echo "${{ steps.msys2.outputs.msys2-location }}/ucrt64/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

    - uses: actions/checkout@v4

    - run: cmake --workflow debug

    - run: cmake --workflow release

    - uses: actions/upload-artifact@v4
    if: success()
    with:
    name: ${{ runner.os }}-GCC_features.json
    path: build/features.json

    - name: upload CMakeConfigureLog.yaml
    if: failure() && hashFiles('build/CMakeFiles/CMakeConfigureLog.yaml') != ''
    uses: actions/upload-artifact@v4
    with:
    name: ${{ runner.os }}-CMakeConfigureLog.yaml
    path: build/CMakeFiles/CMakeConfigureLog.yaml
    183 changes: 183 additions & 0 deletions cpp.yml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,183 @@
    # This is a basic workflow to help you get started with Actions
    # workflow - цепочка действий
    # Имя процесса Билдится на всех типах 📦 🐍
    name: CMake Build Matrix

    # Controls when the action will run. Triggers the workflow on push
    on:
    push:
    pull_request:
    release:
    # tags:
    # - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10

    # A workflow run is made up of one or more jobs that can run sequentially or in parallel
    jobs:
    # This workflow contains a single job called "build"
    build:
    # The type of runner that the job will run on
    name: ${{ matrix.config.name }}
    runs-on: ${{ matrix.config.os }} # будет запускаться по очереди на всех типах машин
    strategy:
    fail-fast: false
    matrix:
    config:
    - {
    name: "Windows Latest MSVC",
    os: windows-latest,
    artifact: "windows_msvc.7z",
    build_type: "Release",
    cc: "cl",
    cxx: "cl",
    environment_script: "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat",
    archiver: "7z a",
    generators: "Visual Studio 16 2019"
    }
    - {
    name: "Windows Latest MinGW",
    os: windows-latest,
    artifact: "windows_mingw.7z",
    build_type: "Release",
    cc: "gcc",
    cxx: "g++",
    archiver: "7z a",
    generators: "Ninja"
    }
    - {
    name: "Ubuntu_Latest_GCC",
    os: ubuntu-latest,
    artifact: "ubuntu_gcc.7z",
    build_type: "Release",
    cc: "gcc",
    cxx: "g++",
    archiver: "7z a",
    generators: "Ninja"
    }
    - {
    name: "Ubuntu_GCC_9",
    os: ubuntu-latest,
    artifact: "ubuntu_gcc9.7z",
    build_type: "Release",
    cc: "gcc",
    cxx: "g++",
    archiver: "7z a",
    generators: "Ninja"
    }
    - {
    name: "macOS Latest Clang",
    os: macos-latest,
    artifact: "macos_clang.7z",
    build_type: "Release",
    cc: "clang",
    cxx: "clang++",
    archiver: "7za a",
    generators: "Ninja"
    }

    steps:
    # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
    - uses: actions/checkout@v2

    - name: Print env
    run: |
    echo github.event.action: ${{ github.event.action }}
    echo github.event_name: ${{ github.event_name }}
    - name: Install dependencies on windows
    if: startsWith(matrix.config.os, 'windows')
    run: |
    choco install ninja cmake
    ninja --version
    cmake --version
    # cmd "${{ matrix.config.environment_script }}"

    - name: Install dependencies on ubuntu
    if: startsWith(matrix.config.name, 'Ubuntu_Latest_GCC')
    run: |
    sudo apt-get update
    sudo apt-get install ninja-build cmake
    ninja --version
    cmake --version
    gcc --version
    - name: Install dependencies on ubuntu9
    if: startsWith(matrix.config.name, 'Ubuntu_GCC_9')
    run: |
    echo Update gcc-9 =======================================================================
    echo gcc version before
    gcc --version
    sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    sudo apt-get update
    sudo apt-get install ninja-build cmake gcc-9 g++-9
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
    echo gcc version after
    gcc --version
    echo Update ninja =======================================================================
    echo ninja version before
    ninja --version
    # wget https://github.com/ninja-build/ninja/releases/download/v1.10.0/ninja-linux.zip
    wget https://github.com/ninja-build/ninja/releases/latest/download/ninja-linux.zip
    sudo unzip ninja-linux.zip -d /usr/local/bin/
    sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force
    echo ninja version after
    ninja --version
    echo Update cmake =======================================================================
    echo cmake version before
    cmake --version
    # curl --silent "https://api.github.com/repos/Kitware/CMake/releases/latest" | sed -n 's/.*tag_name":\s"\(.*\)".*/\1/p' | head -2
    # wget https://github.com/Kitware/CMake/releases/latest/download/cmake-3.16.5-Linux-x86_64.sh
    cmake_version=$(curl --silent "https://api.github.com/repos/Kitware/CMake/releases/latest" | sed -n 's/.*tag_name":\s"\(.*\)".*/\1/p' | head -2 | cut -c 2-)
    echo cmake download latest v$cmake_version version
    wget https://github.com/Kitware/CMake/releases/download/v$cmake_version/cmake-$cmake_version-Linux-x86_64.sh
    chmod +x cmake-$cmake_version-Linux-x86_64.sh
    sudo mkdir /opt/cmake
    sudo ./cmake-$cmake_version-Linux-x86_64.sh --prefix=/opt/cmake --skip-license
    sudo update-alternatives --install /usr/bin/cmake cmake /opt/cmake/bin/cmake 1 --force
    echo cmake version after
    cmake --version
    - name: Install dependencies on macos
    if: startsWith(matrix.config.os, 'macos')
    run: |
    brew install p7zip cmake ninja
    ninja --version
    cmake --version
    - name: Configure
    shell: bash
    run: |
    mkdir build
    mkdir instdir
    cmake \
    -S . \
    -B . \
    -DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \
    -G "${{ matrix.config.generators }}" \
    -DCMAKE_INSTALL_PREFIX:PATH=instdir
    - name: Build
    shell: bash
    run: cmake --build . --config ${{ matrix.config.build_type }}

    - name: Install Strip
    shell: bash
    run: cmake --install . --strip

    - name: Pack
    shell: bash
    working-directory: instdir
    run: |
    ls -laR
    ${{ matrix.config.archiver }} ../${{ matrix.config.artifact }} .
    - name: Upload
    uses: actions/upload-artifact@v1
    with:
    path: ./${{ matrix.config.artifact }}
    name: ${{ matrix.config.artifact }}

    - name: Upload release asset
    if: github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'created')
    uses: actions/upload-release-asset@v1
    env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    with:
    upload_url: ${{ github.event.release.upload_url }}
    asset_path: ./${{ matrix.config.artifact }}
    asset_name: ${{ matrix.config.artifact }}.zip
    asset_content_type: application/zip
    94 changes: 94 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,94 @@
    name: C++ CI

    on: [push]

    jobs:

    short_fuzzing:
    runs-on: ubuntu-latest
    steps:
    - name: Build fuzzers
    id: build
    uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
    with:
    oss-fuzz-project-name: 'uwebsockets'
    language: c++
    - name: Run fuzzers
    uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
    with:
    oss-fuzz-project-name: 'uwebsockets'
    language: c++
    fuzz-seconds: 600
    - name: Upload crash
    uses: actions/upload-artifact@v4
    if: failure() && steps.build.outcome == 'success'
    with:
    name: artifacts
    path: ./out/artifacts

    build_windows:
    runs-on: windows-latest
    steps:
    - name: Clone source
    run: git clone --recursive https://github.com/uNetworking/uWebSockets.git
    - name: Install libuv
    run: |
    vcpkg install libuv:x64-windows
    cp C:\vcpkg\installed\x64-windows\bin\uv.dll uWebSockets\uv.dll
    - uses: ilammy/msvc-dev-cmd@v1
    - name: Build examples
    run: |
    cd uWebSockets
    $Env:WITH_ZLIB='0'; $ENV:WITH_LTO='0'; $Env:CC='clang';
    $ENV:CFLAGS='-I C:\vcpkg\installed\x64-windows\include';
    $ENV:LDFLAGS='-L C:\vcpkg\installed\x64-windows\lib';
    $ENV:CXX='clang++'; $ENV:EXEC_SUFFIX='.exe'; $ENV:WITH_LIBUV='1'; nmake
    ls
    - name: Run smoke test
    run: |
    cd uWebSockets
    iwr https://deno.land/x/install/install.ps1 -useb | iex
    Start-Process -NoNewWindow .\Crc32
    sleep 1
    deno run --allow-net tests\smoke.mjs
    Stop-Process -Name Crc32

    build_linux:

    runs-on: ubuntu-latest

    steps:
    - name: Clone source
    run: git clone --recursive https://github.com/uNetworking/uWebSockets.git
    - name: Build source
    run: cmake -S uWebSockets/libdeflate -B uWebSockets/libdeflate && make -C uWebSockets/libdeflate && WITH_ASAN=1 WITH_LIBDEFLATE=1 make -C uWebSockets
    - name: List binaries
    run: ls uWebSockets
    - name: Install Deno
    run: curl -fsSL https://deno.land/x/install/install.sh | sh
    - name: Run smoke test
    run: make -C uWebSockets/tests smoke
    - name: Run compliance test
    run: make -C uWebSockets/tests compliance
    - name: Run unit tests
    run: make -C uWebSockets/tests
    - name: Autobahn|Testsuite
    run: ~/.deno/bin/deno run -A --unstable uWebSockets/autobahn/server-test.js

    build_osx:

    runs-on: macos-latest

    steps:
    - name: Clone source
    run: git clone --recursive https://github.com/uNetworking/uWebSockets.git
    - name: Build source
    run: make -C uWebSockets
    - name: List binaries
    run: ls uWebSockets
    - name: Install Deno
    run: curl -fsSL https://deno.land/x/install/install.sh | sh
    - name: Run smoke test
    run: make -C uWebSockets/tests smoke
    - name: Run unit tests
    run: make -C uWebSockets/tests