diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..e2ff80ebc --- /dev/null +++ b/.dockerignore @@ -0,0 +1,27 @@ +.git +release +depends/built +depends/work +depends/x86_64-unknown-linux-gnu +depends/x86_64-w64-mingw32 +src/RandomX/build +src/*.o +src/*.a +src/*.la +src/*.lo +src/.libs +src/.deps +src/univalue/.libs +src/univalue/.deps +src/cc/*.o +src/cc/*.a +src/dragonxd +src/dragonx-cli +src/dragonx-tx +src/dragonxd.exe +src/dragonx-cli.exe +src/dragonx-tx.exe +sapling-output.params +sapling-spend.params +config.status +config.log diff --git a/Dockerfile.compat b/Dockerfile.compat new file mode 100644 index 000000000..27a4a3b0f --- /dev/null +++ b/Dockerfile.compat @@ -0,0 +1,31 @@ +FROM ubuntu:20.04 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get install -y \ + build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool \ + ncurses-dev unzip python3 zlib1g-dev wget bsdmainutils automake cmake \ + libcurl4-openssl-dev curl git binutils \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +WORKDIR /build +COPY . /build/ + +# Clean host-built depends and src artifacts to force full rebuild inside container +RUN rm -rf /build/depends/built /build/depends/work \ + /build/depends/x86_64-unknown-linux-gnu \ + /build/depends/x86_64-w64-mingw32 \ + /build/src/RandomX/build \ + && find /build/src -name '*.o' -o -name '*.a' -o -name '*.la' -o -name '*.lo' \ + -o -name '*.lai' | xargs rm -f \ + && rm -rf /build/src/univalue/.libs /build/src/univalue/.deps \ + && rm -rf /build/src/.libs /build/src/.deps \ + && rm -rf /build/src/cc/*.o /build/src/cc/*.a \ + && rm -f /build/config.status /build/config.log + +RUN cd /build && ./util/build.sh --disable-tests -j$(nproc) + +# Strip binaries inside the container so extracted files are already small +RUN strip /build/src/dragonxd /build/src/dragonx-cli /build/src/dragonx-tx + +CMD ["/bin/bash"] diff --git a/build.sh b/build.sh index 53e1556ce..29fb86fd2 100755 --- a/build.sh +++ b/build.sh @@ -14,6 +14,7 @@ RELEASE_DIR="$SCRIPT_DIR/release" BUILD_LINUX_RELEASE=0 BUILD_WIN_RELEASE=0 BUILD_MAC_RELEASE=0 +BUILD_LINUX_COMPAT=0 REMAINING_ARGS=() for arg in "$@"; do @@ -21,6 +22,9 @@ for arg in "$@"; do --linux-release) BUILD_LINUX_RELEASE=1 ;; + --linux-compat) + BUILD_LINUX_COMPAT=1 + ;; --win-release) BUILD_WIN_RELEASE=1 ;; @@ -110,8 +114,59 @@ package_release() { } # Handle release builds -if [ $BUILD_LINUX_RELEASE -eq 1 ] || [ $BUILD_WIN_RELEASE -eq 1 ] || [ $BUILD_MAC_RELEASE -eq 1 ]; then +if [ $BUILD_LINUX_COMPAT -eq 1 ] || [ $BUILD_LINUX_RELEASE -eq 1 ] || [ $BUILD_WIN_RELEASE -eq 1 ] || [ $BUILD_MAC_RELEASE -eq 1 ]; then mkdir -p "$RELEASE_DIR" + + if [ $BUILD_LINUX_COMPAT -eq 1 ]; then + echo "=== Building Linux compat release (Ubuntu 20.04 via Docker) ===" + if ! command -v docker &>/dev/null; then + echo "Error: docker is required for --linux-compat builds" + exit 1 + fi + + # Use sudo for docker if the user isn't in the docker group + DOCKER_CMD="docker" + if ! docker info &>/dev/null 2>&1; then + echo "Note: Using sudo for docker (add yourself to the docker group to avoid this)" + DOCKER_CMD="sudo docker" + fi + + DOCKER_IMAGE="dragonx-compat-builder" + COMPAT_PLATFORM="linux-amd64-ubuntu2004" + COMPAT_RELEASE_DIR="$RELEASE_DIR/dragonx-$VERSION-$COMPAT_PLATFORM" + + echo "Building Docker image (Ubuntu 20.04 base)..." + $DOCKER_CMD build -f Dockerfile.compat -t "$DOCKER_IMAGE" . + + echo "Extracting binaries from Docker image..." + CONTAINER_ID=$($DOCKER_CMD create "$DOCKER_IMAGE") + mkdir -p "$COMPAT_RELEASE_DIR" + + for bin in dragonxd dragonx-cli dragonx-tx; do + $DOCKER_CMD cp "$CONTAINER_ID:/build/src/$bin" "$COMPAT_RELEASE_DIR/$bin" + done + $DOCKER_CMD rm "$CONTAINER_ID" >/dev/null + + # Fix ownership (docker cp creates root-owned files) + # Binaries are already stripped inside the Docker container + if [ "$(stat -c '%U' "$COMPAT_RELEASE_DIR/dragonxd")" = "root" ]; then + sudo chown "$(id -u):$(id -g)" "$COMPAT_RELEASE_DIR"/dragonx* + fi + + # Copy common files + cp "$SCRIPT_DIR/util/bootstrap-dragonx.sh" "$COMPAT_RELEASE_DIR/" + cp "$SCRIPT_DIR/contrib/asmap/asmap.dat" "$COMPAT_RELEASE_DIR/" 2>/dev/null || true + cp "$SCRIPT_DIR/sapling-output.params" "$COMPAT_RELEASE_DIR/" 2>/dev/null || true + cp "$SCRIPT_DIR/sapling-spend.params" "$COMPAT_RELEASE_DIR/" 2>/dev/null || true + + echo "Compat release packaged: $COMPAT_RELEASE_DIR" + ls -la "$COMPAT_RELEASE_DIR" + + # Show glibc version requirement + echo "" + echo "Binary compatibility info:" + objdump -T "$COMPAT_RELEASE_DIR/dragonxd" | grep -oP 'GLIBC_\d+\.\d+' | sort -uV | tail -1 && echo "(max GLIBC version required)" + fi if [ $BUILD_LINUX_RELEASE -eq 1 ]; then echo "=== Building Linux release ==="