name: C/C++ CI

on: [push, pull_request]

jobs:
  build-ubuntu:

    runs-on: ${{ matrix.config.os }}

    strategy:
      matrix:
        config:
          - {os: ubuntu-20.04, c: gcc-11, cpp: g++-11}
          - {os: ubuntu-22.04, c: gcc-12, cpp: g++-12}

    steps:
    - name: Install dependencies
      run: |
        sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
        sudo apt update
        sudo apt install -y git build-essential cmake libuv1-dev libzmq3-dev libsodium-dev libpgm-dev libnorm-dev libgss-dev libcurl4-openssl-dev libidn2-0-dev ${{ matrix.config.c }} ${{ matrix.config.cpp }}

    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        submodules: true

    - name: Build p2pool
      run: |
        mkdir build
        cd build
        cmake .. -DCMAKE_C_COMPILER=${{ matrix.config.c }} -DCMAKE_CXX_COMPILER=${{ matrix.config.cpp }}
        make -j$(nproc)

    - name: Build tests
      run: |
        cd tests
        mkdir build
        cd build
        cmake .. -DCMAKE_C_COMPILER=${{ matrix.config.c }} -DCMAKE_CXX_COMPILER=${{ matrix.config.cpp }}
        make -j$(nproc)

    - name: Run tests
      run: cd tests/build && ./p2pool_tests

    - name: Archive binary
      uses: actions/upload-artifact@v3
      with:
        name: p2pool-${{ matrix.config.os }}
        path: build/p2pool

  build-ubuntu-static-libs:

    runs-on: ubuntu-22.04

    steps:
    - name: Install dependencies
      run: |
        sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
        sudo apt update
        sudo apt install -y git build-essential cmake autoconf libgss-dev gcc-12 g++-12
        sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 --slave /usr/bin/g++ g++ /usr/bin/g++-12 --slave /usr/bin/gcov gcov /usr/bin/gcov-12

    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        submodules: true

    - name: Build libcurl
      run: |
        cd external/src/curl
        autoreconf -fi
        ./configure --without-ssl --without-hyper --without-zlib --without-brotli --without-zstd --without-default-ssl-backend --without-ca-bundle --without-ca-path --without-ca-fallback --without-libpsl --without-libgsasl --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-ngtcp2 --without-nghttp3 --without-quiche --without-msh3 --without-zsh-functions-dir --without-fish-functions-dir --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-mqtt --disable-manual --disable-ntlm --disable-ntlm-wb --disable-tls-srp --disable-unix-sockets --disable-cookies --disable-socketpair --disable-doh --disable-dateparse --disable-netrc --disable-progress-meter --disable-dnsshuffle --disable-hsts --disable-alt-svc --disable-ares
        make -j$(nproc)

    - name: Build libuv
      run: |
        cd external/src/libuv
        mkdir build
        cd build
        cmake .. -DBUILD_TESTING=OFF
        make -j$(nproc)

    - name: Build libzmq
      run: |
        cd external/src/libzmq
        mkdir build
        cd build
        cmake .. -DWITH_TLS=OFF -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF
        make -j$(nproc)

    - name: Build p2pool
      run: |
        mkdir build
        cd build
        cmake .. -DSTATIC_LIBS=ON
        make -j$(nproc)

    - name: Build tests
      run: |
        cd tests
        mkdir build
        cd build
        cmake .. -DSTATIC_LIBS=ON
        make -j$(nproc)

    - name: Run tests
      run: cd tests/build && ./p2pool_tests

    - name: Archive binary
      uses: actions/upload-artifact@v3
      with:
        name: p2pool-ubuntu-static-libs
        path: build/p2pool

  build-ubuntu-aarch64:

    runs-on: ${{ matrix.config.os }}

    strategy:
      matrix:
        config:
          - {os: ubuntu-20.04}
          - {os: ubuntu-22.04}

    steps:
    - name: Install dependencies
      run: |
        sudo apt update
        sudo apt install -y git build-essential cmake autoconf gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu

    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        submodules: true

    - name: Build libcurl
      run: |
        cd external/src/curl
        autoreconf -fi
        ./configure --host=aarch64-linux-gnu --without-ssl --without-hyper --without-zlib --without-brotli --without-zstd --without-default-ssl-backend --without-ca-bundle --without-ca-path --without-ca-fallback --without-libpsl --without-libgsasl --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-ngtcp2 --without-nghttp3 --without-quiche --without-msh3 --without-zsh-functions-dir --without-fish-functions-dir --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-mqtt --disable-manual --disable-ntlm --disable-ntlm-wb --disable-tls-srp --disable-unix-sockets --disable-cookies --disable-socketpair --disable-doh --disable-dateparse --disable-netrc --disable-progress-meter --disable-dnsshuffle --disable-hsts --disable-alt-svc --disable-ares
        make -j$(nproc)

    - name: Build libuv
      run: |
        cd external/src/libuv
        mkdir build
        cd build
        cmake .. -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DBUILD_TESTING=OFF
        make -j$(nproc)

    - name: Build libzmq
      run: |
        cd external/src/libzmq
        mkdir build
        cd build
        cmake .. -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DWITH_TLS=OFF -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF
        make -j$(nproc)

    - name: Build p2pool
      run: |
        mkdir build
        cd build
        cmake .. -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_STRIP=/usr/bin/aarch64-linux-gnu-strip -DSTATIC_LIBS=ON -DARCH_ID=aarch64
        make -j$(nproc)

    - name: Archive binary
      uses: actions/upload-artifact@v3
      with:
        name: p2pool-${{ matrix.config.os }}-aarch64
        path: build/p2pool

  build-windows-msys2:

    runs-on: windows-latest

    defaults:
      run:
        shell: msys2 {0}

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        submodules: recursive

    - name: Setup MSYS2
      uses: eine/setup-msys2@v2
      with:
        update: true
        install: mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake make autoconf libtool automake

    - name: Build libcurl
      run: |
        cd external/src/curl
        autoreconf -fi
        ./configure --without-ssl --without-hyper --without-zlib --without-brotli --without-zstd --without-default-ssl-backend --without-ca-bundle --without-ca-path --without-ca-fallback --without-libpsl --without-libgsasl --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-ngtcp2 --without-nghttp3 --without-quiche --without-msh3 --without-zsh-functions-dir --without-fish-functions-dir --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-mqtt --disable-manual --disable-ntlm --disable-ntlm-wb --disable-tls-srp --disable-unix-sockets --disable-cookies --disable-socketpair --disable-doh --disable-dateparse --disable-netrc --disable-progress-meter --disable-dnsshuffle --disable-hsts --disable-alt-svc --disable-ares
        make -j$(nproc)

    - name: Build libuv
      run: |
        cd external/src/libuv
        mkdir build
        cd build
        cmake .. -G "Unix Makefiles" -DBUILD_TESTING=OFF
        make -j$(nproc)

    - name: Build libzmq
      run: |
        cd external/src/libzmq
        mkdir build
        cd build
        cmake .. -G "Unix Makefiles" -DWITH_TLS=OFF -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DZMQ_HAVE_IPC=OFF
        make -j$(nproc)

    - name: Build p2pool
      run: |
        mkdir build
        cd build
        cmake .. -G "Unix Makefiles" -DSTATIC_LIBS=ON
        make -j$(nproc)

    - name: Build tests
      run: |
        cd tests
        mkdir build
        cd build
        cmake .. -G "Unix Makefiles" -DSTATIC_LIBS=ON
        make -j$(nproc)

    - name: Run tests
      run: |
        cd tests/build
        ./p2pool_tests.exe

    - name: Archive binary
      uses: actions/upload-artifact@v3
      with:
        name: p2pool-msys2.exe
        path: build/p2pool.exe

  build-windows-msbuild:

    runs-on: windows-${{ matrix.config.os }}

    strategy:
      matrix:
        config:
          - {vs: Visual Studio 16 2019, os: 2019, msbuild: "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\MSBuild\\Current\\Bin\\amd64\\", rx: "ON"}
          - {vs: Visual Studio 17 2022, os: 2022, msbuild: "C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\Msbuild\\Current\\Bin\\amd64\\", rx: "ON"}
          - {vs: Visual Studio 17 2022, os: 2022, msbuild: "C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\Msbuild\\Current\\Bin\\amd64\\", rx: "OFF"}

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        submodules: recursive

    - name: Setup cmake
      uses: lukka/get-cmake@latest

    - name: Build p2pool
      run: |
        mkdir build
        cd build
        cmake .. -G "${{ matrix.config.vs }}" -DWITH_RANDOMX=${{ matrix.config.rx }}
        & "${{ matrix.config.msbuild }}msbuild" /m /p:Configuration=Release p2pool.vcxproj

    - name: Build tests
      run: |
        cd tests
        mkdir build
        cd build
        cmake .. -G "${{ matrix.config.vs }}"
        & "${{ matrix.config.msbuild }}msbuild" /m /p:Configuration=Debug p2pool_tests.vcxproj

    - name: Run tests
      run: |
        cd tests/build/Debug
        ./p2pool_tests.exe

    - name: Archive binary
      uses: actions/upload-artifact@v3
      with:
        name: p2pool-msbuild-${{ matrix.config.os }}-randomx-${{ matrix.config.rx }}.exe
        path: build/Release/p2pool.exe

  build-macos:

    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [macos-11, macos-12]

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        submodules: recursive

    - name: Install dependencies
      run: HOMEBREW_NO_AUTO_UPDATE=1 brew install cmake autoconf libtool automake

    - name: Build libcurl
      run: |
        cd external/src/curl
        autoreconf -fi
        ./configure --without-ssl --without-hyper --without-zlib --without-brotli --without-zstd --without-default-ssl-backend --without-ca-bundle --without-ca-path --without-ca-fallback --without-libpsl --without-libgsasl --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-ngtcp2 --without-nghttp3 --without-quiche --without-msh3 --without-zsh-functions-dir --without-fish-functions-dir --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-mqtt --disable-manual --disable-ntlm --disable-ntlm-wb --disable-tls-srp --disable-unix-sockets --disable-cookies --disable-socketpair --disable-doh --disable-dateparse --disable-netrc --disable-progress-meter --disable-dnsshuffle --disable-hsts --disable-alt-svc --disable-ares
        make -j3

    - name: Build libuv
      run: |
        cd external/src/libuv
        mkdir build
        cd build
        cmake .. -DBUILD_TESTING=OFF
        make -j3

    - name: Build libzmq
      run: |
        cd external/src/libzmq
        mkdir build
        cd build
        cmake .. -DWITH_TLS=OFF -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF
        make -j3

    - name: Build p2pool
      run: |
        mkdir build
        cd build
        cmake .. -DSTATIC_BINARY=ON
        make -j3

    - name: Build tests
      run: |
        cd tests
        mkdir build
        cd build
        cmake .. -DSTATIC_LIBS=ON
        make -j3

    - name: Run tests
      run: |
        cd tests/build
        ./p2pool_tests

    - name: Archive binary
      uses: actions/upload-artifact@v3
      with:
        name: p2pool-${{ matrix.os }}
        path: build/p2pool