name: Build Wownero LWS (Mac x86 Fix) on: push: branches: [ master, main ] tags: [ 'v*' ] workflow_dispatch: env: NODE_TLS_REJECT_UNAUTHORIZED: '0' CORE_TAG: 'v0.11.4.2' jobs: # ================================================================== # JOB 1: LINUX NATIVE - UNTOUCHED # ================================================================== linux-native: runs-on: ubuntu-latest container: image: wownero-builder-base:latest options: --user root steps: - name: Fix DNS run: echo "192.168.88.230 git.such.software" >> /etc/hosts - name: Install Static System Libs run: apt-get update && apt-get install -y libc6-dev - name: Manual Checkout env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | rm -rf * git init git config --global --add safe.directory '*' git config --global url."http://oauth2:${GITHUB_TOKEN}@git.such.software:3000/Builds/RandomWOW.git".insteadOf "https://codeberg.org/wownero/RandomWOW" git config --global url."http://oauth2:${GITHUB_TOKEN}@git.such.software:3000/Builds/wownero.git".insteadOf "https://codeberg.org/wownero/wownero.git" git remote add origin http://oauth2:${GITHUB_TOKEN}@git.such.software:3000/${{ github.repository }}.git git fetch origin ${{ github.sha }} git checkout ${{ github.sha }} git submodule update --init --recursive - name: Patch Source run: | perl -pi -e 's/handler_loop\s+final/handler_loop/g' src/rest_server.cpp perl -pi -e 's/find_library\(ICU/# find_library(ICU/g' external/monero/CMakeLists.txt perl -pi -e 's/-Werror//g' CMakeLists.txt perl -pi -e 's/-Werror//g' external/monero/CMakeLists.txt - name: Download SDK run: | curl -L -k -o sdk.tar.gz "https://git.such.software/Builds/wownero/releases/download/${{ env.CORE_TAG }}/wownero-core-x86_64-linux-gnu.tar.gz" mkdir -p /opt/wownero-sdk tar -xf sdk.tar.gz -C /opt/wownero-sdk - name: Normalize SDK run: | cd /opt/wownero-sdk/lib find . -name "libzstd*.a" -exec cp -n {} libzstd.a \; || true find . -name "libz*.a" ! -name "*zmq*" -exec cp -n {} libz.a \; || true find . -name "libhidapi*.a" -exec cp -n {} libhidapi.a \; || true SYSTEM_RT=$(find /usr -name "librt.a" | head -n 1) if [ -n "$SYSTEM_RT" ]; then ln -s "$SYSTEM_RT" librt.a; fi - name: Install Modern CMake run: | curl -L -o cmake.tar.gz https://github.com/Kitware/CMake/releases/download/v3.28.1/cmake-3.28.1-linux-x86_64.tar.gz tar -xf cmake.tar.gz echo "$(pwd)/cmake-3.28.1-linux-x86_64/bin" >> $GITHUB_PATH - name: Build run: | mkdir build && cd build SDK_DIR="/opt/wownero-sdk" cmake .. -DCMAKE_BUILD_TYPE=Release \ -DBUILD_STATIC=ON \ -DCMAKE_PREFIX_PATH="$SDK_DIR" \ -DBOOST_ROOT="$SDK_DIR" \ -DBoost_NO_SYSTEM_PATHS=ON \ -DBoost_NO_BOOST_CMAKE=ON \ -DBoost_USE_STATIC_RUNTIME=ON \ -DOPENSSL_ROOT_DIR="$SDK_DIR" \ -DOPENSSL_USE_STATIC_LIBS=TRUE \ -DUNBOUND_INCLUDE_DIR="$SDK_DIR/include" \ -DUNBOUND_LIBRARY="$SDK_DIR/lib/libunbound.a" \ -DZMQ_INCLUDE_DIR="$SDK_DIR/include" \ -DZMQ_LIBRARY="$SDK_DIR/lib/libzmq.a" \ -DSodium_INCLUDE_DIR="$SDK_DIR/include" \ -DSodium_LIBRARY_RELEASE="$SDK_DIR/lib/libsodium.a" \ -DLIBUSB_INCLUDE_DIR="$SDK_DIR/include" \ -DLIBUSB_LIBRARY="$SDK_DIR/lib/libusb-1.0.a" \ -DHIDAPI_INCLUDE_DIR="$SDK_DIR/include" \ -DHIDAPI_LIBRARY="$SDK_DIR/lib/libhidapi.a;$SDK_DIR/lib/libusb-1.0.a;$SDK_DIR/lib/libudev.a" \ -DZSTD_LIBRARY="$SDK_DIR/lib/libzstd.a" \ -DZSTD_INCLUDE_DIR="$SDK_DIR/include" \ -DZLIB_LIBRARY="$SDK_DIR/lib/libz.a" \ -DZLIB_INCLUDE_DIR="$SDK_DIR/include" \ -DLIBEVENT_LIBRARY=$SDK_DIR/lib/libevent.a \ -DLIBEVENT_INCLUDE_DIR=$SDK_DIR/include \ -DRT_LIBRARY=rt \ -DUSE_READLINE=OFF \ -DCMAKE_EXE_LINKER_FLAGS="-static -Wl,--allow-multiple-definition" make -j$(nproc) - name: Package run: | mkdir release tar -czf release/wownero-lws-x86_64-linux-gnu.tar.gz -C build/src wownero-lws-daemon wownero-lws-admin - name: Upload uses: actions/upload-artifact@v3 with: name: wownero-lws-x86_64-linux-gnu path: release/*.tar.gz # ================================================================== # JOB 2: LINUX CROSS - UNTOUCHED # ================================================================== linux-cross: runs-on: ubuntu-latest container: image: wownero-builder-base:latest options: --user root strategy: fail-fast: false matrix: include: - target: aarch64-linux-gnu proc: aarch64 sysroot: /usr/aarch64-linux-gnu - target: riscv64-linux-gnu proc: riscv64 sysroot: /usr/riscv64-linux-gnu steps: - name: Fix DNS run: echo "192.168.88.230 git.such.software" >> /etc/hosts - name: Manual Checkout env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | rm -rf * git init git config --global --add safe.directory '*' git config --global url."http://oauth2:${GITHUB_TOKEN}@git.such.software:3000/Builds/RandomWOW.git".insteadOf "https://codeberg.org/wownero/RandomWOW" git config --global url."http://oauth2:${GITHUB_TOKEN}@git.such.software:3000/Builds/wownero.git".insteadOf "https://codeberg.org/wownero/wownero.git" git remote add origin http://oauth2:${GITHUB_TOKEN}@git.such.software:3000/${{ github.repository }}.git git fetch origin ${{ github.sha }} git checkout ${{ github.sha }} git submodule update --init --recursive - name: Patch Source run: | perl -pi -e 's/handler_loop\s+final/handler_loop/g' src/rest_server.cpp perl -pi -e 's/find_library\(ICU/# find_library(ICU/g' external/monero/CMakeLists.txt perl -pi -e 's/-Werror//g' CMakeLists.txt perl -pi -e 's/-Werror//g' external/monero/CMakeLists.txt - name: Download SDK run: | curl -L -k -o sdk.tar.gz "https://git.such.software/Builds/wownero/releases/download/${{ env.CORE_TAG }}/wownero-core-${{ matrix.target }}.tar.gz" mkdir -p /opt/wownero-sdk tar -xf sdk.tar.gz -C /opt/wownero-sdk - name: Normalize SDK run: | cd /opt/wownero-sdk/lib find . -name "libhidapi*.a" -exec cp -n {} libhidapi.a \; || true find . -name "libzstd*.a" -exec cp -n {} libzstd.a \; || true find . -name "libz*.a" ! -name "*zmq*" -exec cp -n {} libz.a \; || true SYSROOT_RT=$(find ${{ matrix.sysroot }} -name "librt.a" 2>/dev/null | head -n 1) if [ -n "$SYSROOT_RT" ]; then ln -s "$SYSROOT_RT" librt.a; else FALLBACK=$(find /usr -name "librt.a" | grep ${{ matrix.proc }} | head -n 1); if [ -n "$FALLBACK" ]; then ln -s "$FALLBACK" librt.a; fi; fi - name: Patch Boost Context (Aarch64) if: matrix.target == 'aarch64-linux-gnu' run: | mkdir -p boost_asm && cd boost_asm BASE="https://raw.githubusercontent.com/boostorg/context/develop/src/asm" curl -f -O $BASE/jump_arm64_aapcs_elf_gas.S curl -f -O $BASE/make_arm64_aapcs_elf_gas.S curl -f -O $BASE/ontop_arm64_aapcs_elf_gas.S if [ ! -s jump_arm64_aapcs_elf_gas.S ]; then exit 1; fi aarch64-linux-gnu-gcc -c jump_arm64_aapcs_elf_gas.S -o jump.o aarch64-linux-gnu-gcc -c make_arm64_aapcs_elf_gas.S -o make.o aarch64-linux-gnu-gcc -c ontop_arm64_aapcs_elf_gas.S -o ontop.o aarch64-linux-gnu-ar r /opt/wownero-sdk/lib/libboost_context.a jump.o make.o ontop.o aarch64-linux-gnu-ar s /opt/wownero-sdk/lib/libboost_context.a - name: Install Modern CMake run: | curl -L -o cmake.tar.gz https://github.com/Kitware/CMake/releases/download/v3.28.1/cmake-3.28.1-linux-x86_64.tar.gz tar -xf cmake.tar.gz echo "$(pwd)/cmake-3.28.1-linux-x86_64/bin" >> $GITHUB_PATH - name: Generate Toolchain run: | cat < cross.cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR ${{ matrix.proc }}) set(CMAKE_C_COMPILER ${{ matrix.target }}-gcc) set(CMAKE_CXX_COMPILER ${{ matrix.target }}-g++) set(CMAKE_C_FLAGS "-D_GNU_SOURCE -D_XOPEN_SOURCE=700" CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS "-D_GNU_SOURCE -D_XOPEN_SOURCE=700" CACHE STRING "" FORCE) set(CMAKE_FIND_ROOT_PATH /opt/wownero-sdk) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) EOF - name: Build run: | mkdir build && cd build SDK_DIR="/opt/wownero-sdk" cmake .. -DCMAKE_TOOLCHAIN_FILE=../cross.cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DCMAKE_PREFIX_PATH="$SDK_DIR" -DBOOST_ROOT="$SDK_DIR" -DBoost_NO_SYSTEM_PATHS=ON -DBoost_NO_BOOST_CMAKE=ON -DOPENSSL_ROOT_DIR="$SDK_DIR" -DOPENSSL_USE_STATIC_LIBS=TRUE -DUNBOUND_INCLUDE_DIR="$SDK_DIR/include" -DUNBOUND_LIBRARY="$SDK_DIR/lib/libunbound.a" -DZMQ_INCLUDE_DIR="$SDK_DIR/include" -DZMQ_LIBRARY="$SDK_DIR/lib/libzmq.a" -DSodium_INCLUDE_DIR="$SDK_DIR/include" -DSodium_LIBRARY_RELEASE="$SDK_DIR/lib/libsodium.a" -DLIBUSB_INCLUDE_DIR="$SDK_DIR/include" -DLIBUSB_LIBRARY="$SDK_DIR/lib/libusb-1.0.a" -DHIDAPI_INCLUDE_DIR="$SDK_DIR/include" -DHIDAPI_LIBRARY="$SDK_DIR/lib/libhidapi.a;$SDK_DIR/lib/libusb-1.0.a;$SDK_DIR/lib/libudev.a" -DZSTD_LIBRARY="$SDK_DIR/lib/libzstd.a" -DZSTD_INCLUDE_DIR="$SDK_DIR/include" -DZLIB_LIBRARY="$SDK_DIR/lib/libz.a" -DZLIB_INCLUDE_DIR="$SDK_DIR/include" -DLIBEVENT_LIBRARY=$SDK_DIR/lib/libevent.a -DLIBEVENT_INCLUDE_DIR=$SDK_DIR/include -DRT_LIBRARY=rt -DUSE_READLINE=OFF -DCMAKE_EXE_LINKER_FLAGS="-static -Wl,--allow-multiple-definition" make -j$(nproc) - name: Package run: | mkdir release tar -czf release/wownero-lws-${{ matrix.target }}.tar.gz -C build/src wownero-lws-daemon wownero-lws-admin - name: Upload uses: actions/upload-artifact@v3 with: name: wownero-lws-${{ matrix.target }} path: release/*.tar.gz # ================================================================== # JOB 4: MACOS - ARCH SPECIFIC COMPILATION # ================================================================== macos: runs-on: macos-latest env: NODE_TLS_REJECT_UNAUTHORIZED: '0' strategy: fail-fast: false matrix: include: - target: x86_64-apple-darwin11 arch: x86_64 build_arch: "x86-64" platform: macos-x64 - target: aarch64-apple-darwin11 arch: arm64 build_arch: "armv8-a" platform: macos-arm64 steps: - name: Manual Checkout env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | rm -rf * git init git config --global url."http://oauth2:${GITHUB_TOKEN}@git.such.software:3000/Builds/RandomWOW.git".insteadOf "https://codeberg.org/wownero/RandomWOW" git config --global url."http://oauth2:${GITHUB_TOKEN}@git.such.software:3000/Builds/wownero.git".insteadOf "https://codeberg.org/wownero/wownero.git" git remote add origin http://oauth2:${GITHUB_TOKEN}@git.such.software:3000/${{ github.repository }}.git git fetch origin ${{ github.sha }} git checkout ${{ github.sha }} git submodule update --init --recursive - name: Patch Source run: | perl -pi -e 's/handler_loop\s+final/handler_loop/g' src/rest_server.cpp perl -pi -e 's/find_library\(ICU/# find_library(ICU/g' external/monero/CMakeLists.txt perl -pi -e 's/locale//g' external/monero/CMakeLists.txt # Delete 'rt' so it doesn't try to link against it perl -pi -e 's/rt //g' CMakeLists.txt perl -pi -e 's/RT_LIBRARY//g' CMakeLists.txt - name: Install CMake run: brew install cmake - name: Download SDK run: | curl -L -k -o sdk.tar.gz "https://git.such.software/Builds/wownero/releases/download/${{ env.CORE_TAG }}/wownero-core-${{ matrix.target }}.tar.gz" if [ $(stat -f%z sdk.tar.gz) -lt 1000000 ]; then exit 1; fi mkdir -p wownero-sdk tar -xf sdk.tar.gz -C wownero-sdk # FIX: Compile dummy lib with the CORRECT ARCHITECTURE - name: Create Dummy RT Lib run: | echo "Creating dummy librt.a for ${{ matrix.arch }}..." mkdir -p wownero-sdk/lib echo "void dummy_rt_func() {}" > dummy.c cc -arch ${{ matrix.arch }} -c dummy.c -o dummy.o ar cr wownero-sdk/lib/librt.a dummy.o ranlib wownero-sdk/lib/librt.a # FIX: Patch x86_64 Boost Context - name: Patch Boost Context (x86_64) if: matrix.arch == 'x86_64' run: | echo "Patching broken x86 boost context..." mkdir -p boost_asm && cd boost_asm BASE="https://raw.githubusercontent.com/boostorg/context/develop/src/asm" curl -f -O $BASE/jump_x86_64_sysv_macho_gas.S curl -f -O $BASE/make_x86_64_sysv_macho_gas.S curl -f -O $BASE/ontop_x86_64_sysv_macho_gas.S if [ ! -s jump_x86_64_sysv_macho_gas.S ]; then echo "FATAL: Empty file"; exit 1; fi clang -c -arch x86_64 jump_x86_64_sysv_macho_gas.S -o jump.o clang -c -arch x86_64 make_x86_64_sysv_macho_gas.S -o make.o clang -c -arch x86_64 ontop_x86_64_sysv_macho_gas.S -o ontop.o ar r ../wownero-sdk/lib/libboost_context.a jump.o make.o ontop.o ranlib ../wownero-sdk/lib/libboost_context.a - name: Build run: | mkdir build && cd build SDK_DIR="$(pwd)/../wownero-sdk" cmake .. -DCMAKE_BUILD_TYPE=Release \ -DBUILD_STATIC=ON \ -DBoost_USE_STATIC_RUNTIME=OFF \ -DCMAKE_OSX_ARCHITECTURES=${{ matrix.arch }} \ -DCMAKE_SYSTEM_PROCESSOR=${{ matrix.arch }} \ -DARCH="${{ matrix.build_arch }}" \ -DCMAKE_PREFIX_PATH="$SDK_DIR" \ -DBOOST_ROOT="$SDK_DIR" \ -DOPENSSL_ROOT_DIR="$SDK_DIR" \ -DOPENSSL_USE_STATIC_LIBS=TRUE \ -DUNBOUND_INCLUDE_DIR="$SDK_DIR/include" \ -DUNBOUND_LIBRARY="$SDK_DIR/lib/libunbound.a" \ -DZMQ_INCLUDE_DIR="$SDK_DIR/include" \ -DZMQ_LIBRARY="$SDK_DIR/lib/libzmq.a" \ -DSodium_INCLUDE_DIR="$SDK_DIR/include" \ -DSodium_LIBRARY_RELEASE="$SDK_DIR/lib/libsodium.a" \ -DLIBUSB_INCLUDE_DIR="$SDK_DIR/include" \ -DLIBUSB_LIBRARY="$SDK_DIR/lib/libusb-1.0.a" \ -DHIDAPI_INCLUDE_DIR="$SDK_DIR/include" \ -DHIDAPI_LIBRARY="$SDK_DIR/lib/libhidapi.a" \ -DZSTD_LIBRARY="$SDK_DIR/lib/libzstd.a" \ -DZSTD_INCLUDE_DIR="$SDK_DIR/include" \ -DZLIB_LIBRARY="$SDK_DIR/lib/libz.a" \ -DZLIB_INCLUDE_DIR="$SDK_DIR/include" \ -DLIBEVENT_LIBRARY=$SDK_DIR/lib/libevent.a \ -DLIBEVENT_INCLUDE_DIR=$SDK_DIR/include \ -DRT_LIBRARY="$SDK_DIR/lib/librt.a" \ -DUSE_READLINE=OFF \ -DCMAKE_EXE_LINKER_FLAGS="-Wl,-L$SDK_DIR/lib" make -j$(sysctl -n hw.ncpu) - name: Package run: | mkdir release zip -j release/wownero-lws-${{ matrix.platform }}.zip build/src/wownero-lws-daemon build/src/wownero-lws-admin - name: Upload uses: actions/upload-artifact@v3 with: name: wownero-lws-${{ matrix.platform }} path: release/*.zip