FROM docker.io/library/rockylinux:9

RUN dnf install --assumeyes --enablerepo=crb \
        autoconf \
        automake \
        bzip2 \
        ca-certificates \
        cmake \
        curl-minimal \
        gcc \
        gcc-c++ \
        gcc-toolset-15-gcc-c++ \
        libasan \
        git \
        libtool \
        make \
        ninja-build \
        patch \
        perl-core \
        pkgconf-pkg-config \
        rpm-build \
        tar \
        xz \
        which \
        epel-release \
    && sed \
        -e 's!^metalink=!#metalink=!g' \
        -e 's!^#baseurl=!baseurl=!g' \
        -e 's!https\?://download\.example/pub/epel!https://mirrors.ustc.edu.cn/epel!g' \
        -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo \
    && dnf install --assumeyes \
        makeself \
    && dnf upgrade --assumeyes \
    && dnf clean all \
    && rm -rf /var/cache/dnf

RUN git config --global url."https://wangguofang.net/github.com/".insteadOf "https://github.com/"

RUN export RUSTUP_DIST_SERVER="https://mirrors.ustc.edu.cn/rust-static" \
    && export RUSTUP_UPDATE_ROOT="https://mirrors.ustc.edu.cn/rust-static/rustup" \
    && RUST_ARCH="$(uname -m)" \
    && curl --fail --location --output rustup-init \
        "https://mirrors.ustc.edu.cn/rust-static/rustup/archive/1.28.2/${RUST_ARCH}-unknown-linux-gnu/rustup-init" \
    && chmod +x rustup-init \
    && ./rustup-init -y --default-toolchain none \
    && rm rustup-init \
    && "$HOME/.cargo/bin/rustup" --version \
    && "$HOME/.cargo/bin/rustup" toolchain install 1.98.0 --profile minimal \
    && ln --symbolic "$HOME"/.cargo/bin/* /usr/local/bin/

RUN --mount=type=bind,from=sources,source=boost_1_83_0.tar.bz2,target=/tmp/boost.tar.bz2 \
    mkdir src \
    && tar --extract --bzip2 --file=/tmp/boost.tar.bz2 --directory=src --strip-components=1 \
    && cd src \
    && ./bootstrap.sh --prefix=/usr/local --libdir=/usr/local/lib64 \
    && ./b2 --jobs="$(nproc)" \
        --with-atomic \
        --with-chrono \
        --with-context \
        --with-date_time \
        --with-filesystem \
        --with-program_options \
        --with-regex \
        --with-system \
        --with-thread \
        cflags=-fPIC \
        cxxflags=-fPIC \
        link=static \
        pch=off \
        runtime-link=shared \
        threading=multi \
        variant=release \
        install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=openssl-openssl-3.0.15.tar.gz,target=/tmp/openssl.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/openssl.tar.gz --directory=src --strip-components=1 \
    && cd src \
    && ./Configure --prefix=/usr/local no-shared no-tests -fPIC \
    && make --jobs="$(nproc)" \
    && make install_sw \
    && cd .. \
    && rm -rf src

COPY libevent-lib64-install.patch /tmp/
RUN --mount=type=bind,from=sources,source=libevent-release-2.1.12-stable.tar.gz,target=/tmp/libevent.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/libevent.tar.gz --directory=src --strip-components=1 \
    && git -C src apply /tmp/libevent-lib64-install.patch \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DEVENT__DISABLE_BENCHMARK=ON \
        -DEVENT__DISABLE_REGRESS=ON \
        -DEVENT__DISABLE_SAMPLES=ON \
        -DEVENT__DISABLE_TESTS=ON \
        -DEVENT__LIBRARY_TYPE=STATIC \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src /tmp/libevent-lib64-install.patch

RUN --mount=type=bind,from=sources,source=zstd-v1.5.7.tar.gz,target=/tmp/zstd.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/zstd.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src/build/cmake -B build -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DZSTD_BUILD_CONTRIB=OFF \
        -DZSTD_BUILD_PROGRAMS=OFF \
        -DZSTD_BUILD_SHARED=OFF \
        -DZSTD_BUILD_STATIC=ON \
        -DZSTD_BUILD_TESTS=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=zlib-v1.3.1.tar.gz,target=/tmp/zlib.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/zlib.tar.gz --directory=src --strip-components=1 \
    && cd src \
    && CFLAGS=-fPIC ./configure --prefix=/usr/local --libdir=/usr/local/lib64 --static \
    && make --jobs="$(nproc)" \
    && make install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=protobuf-v3.21.12.tar.gz,target=/tmp/protobuf.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/protobuf.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -Dprotobuf_BUILD_TESTS=OFF \
        -Dprotobuf_BUILD_SHARED_LIBS=OFF \
        -Dprotobuf_WITH_ZLIB=ON \
        -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN git clone --branch=REL_2_0_5 --depth=1 https://github.com/log4cplus/log4cplus.git src \
    && git -C src submodule update --init --depth=1 threadpool \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DLOG4CPLUS_BUILD_TESTING=OFF \
        -DWITH_UNIT_TESTS=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=fmt-12.2.0.tar.gz,target=/tmp/fmt.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/fmt.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DFMT_DOC=OFF \
        -DFMT_TEST=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=spdlog-v1.17.0.tar.gz,target=/tmp/spdlog.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/spdlog.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DSPDLOG_BUILD_BENCH=OFF \
        -DSPDLOG_BUILD_EXAMPLE=OFF \
        -DSPDLOG_BUILD_TESTS=OFF \
        -DSPDLOG_FMT_EXTERNAL=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=magic_enum-v0.9.8.tar.gz,target=/tmp/magic_enum.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/magic_enum.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DMAGIC_ENUM_OPT_BUILD_EXAMPLES=OFF \
        -DMAGIC_ENUM_OPT_BUILD_TESTS=OFF \
        -DMAGIC_ENUM_OPT_INSTALL=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=fast_float-v8.2.10.tar.gz,target=/tmp/fast_float.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/fast_float.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DFASTFLOAT_BENCHMARKS=OFF \
        -DFASTFLOAT_INSTALL=ON \
        -DFASTFLOAT_TEST=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=sparse-map-v0.7.0.tar.gz,target=/tmp/sparse-map.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/sparse-map.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=gflags-v2.3.1.tar.gz,target=/tmp/gflags.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/gflags.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_STATIC_LIBS=ON \
        -DBUILD_TESTING=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DINSTALL_HEADERS=ON \
        -DINSTALL_SHARED_LIBS=OFF \
        -DINSTALL_STATIC_LIBS=ON \
        -DLIBRARY_INSTALL_DIR=/usr/local/lib64 \
        -DREGISTER_INSTALL_PREFIX=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=glog-v0.7.1.tar.gz,target=/tmp/glog.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/glog.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_TESTING=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DWITH_GFLAGS=ON \
        -DWITH_GTEST=OFF \
        -DWITH_PKGCONFIG=ON \
        -DWITH_UNWIND=none \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=liburing-liburing-2.15.tar.gz,target=/tmp/liburing.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/liburing.tar.gz --directory=src --strip-components=1 \
    && cd src \
    && CFLAGS=-fPIC ./configure --prefix=/usr/local --libdir=/usr/local/lib64 --libdevdir=/usr/local/lib64 \
    && make --jobs="$(nproc)" ENABLE_SHARED=0 library \
    && make ENABLE_SHARED=0 install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=libaio_0.3.113.orig.tar.gz,target=/tmp/libaio.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/libaio.tar.gz --directory=src --strip-components=1 \
    && make --directory=src --jobs="$(nproc)" ENABLE_SHARED=0 \
    && make --directory=src ENABLE_SHARED=0 prefix=/usr/local libdir=/usr/local/lib64 install \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=libdwarf-code-v2.3.2.tar.gz,target=/tmp/libdwarf-code.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/libdwarf-code.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_DWARFDUMP=OFF \
        -DBUILD_DWARFEXAMPLE=OFF \
        -DBUILD_DWARFGEN=OFF \
        -DBUILD_NON_SHARED=ON \
        -DBUILD_SHARED=OFF \
        -DDO_TESTING=OFF \
        -DENABLE_DECOMPRESSION=ON \
        -DPIC_ALWAYS=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=libsodium-1.0.20-RELEASE.tar.gz,target=/tmp/libsodium.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/libsodium.tar.gz --directory=src --strip-components=1 \
    && cd src \
    && ./autogen.sh \
    && ./configure --prefix=/usr/local --libdir=/usr/local/lib64 --disable-shared --enable-static --with-pic \
    && make --jobs="$(nproc)" \
    && make install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=xxHash-v0.8.3.tar.gz,target=/tmp/xxHash.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/xxHash.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src/cmake_unofficial -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DXXHASH_BUILD_XXHSUM=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=googletest-v1.17.0.tar.gz,target=/tmp/googletest.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/googletest.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_GMOCK=ON \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DINSTALL_GTEST=ON \
        -Dgtest_build_samples=OFF \
        -Dgtest_build_tests=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=numactl-v2.0.19.tar.gz,target=/tmp/numactl.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/numactl.tar.gz --directory=src --strip-components=1 \
    && cd src \
    && ./autogen.sh \
    && CFLAGS=-fPIC ./configure --prefix=/usr/local --libdir=/usr/local/lib64 --disable-shared --enable-static \
    && make --jobs="$(nproc)" \
    && make install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=folly-v2026.08.03.00.tar.gz,target=/tmp/folly.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/folly.tar.gz --directory=src --strip-components=1 \
    && CXXFLAGS="-DGLOG_USE_GLOG_EXPORT" \
        cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBOOST_LINK_STATIC=ON \
        -DBUILD_BENCHMARKS=OFF \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_TESTS=OFF \
        -DCMAKE_INSTALL_DIR=lib64/cmake/folly \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DLIB_INSTALL_DIR=lib64 \
        -DPYTHON_EXTENSIONS=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=fizz-v2026.08.03.00.tar.gz,target=/tmp/fizz.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/fizz.tar.gz --directory=src --strip-components=1 \
    && CXXFLAGS="-DGLOG_USE_GLOG_EXPORT" \
        cmake -G Ninja -S src/fizz -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_EXAMPLES=OFF \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_TESTS=OFF \
        -DCMAKE_INSTALL_DIR=lib64/cmake/fizz \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DLIB_INSTALL_DIR=lib64 \
        -Dsodium_USE_STATIC_LIBS=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=wangle-v2026.08.03.00.tar.gz,target=/tmp/wangle.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/wangle.tar.gz --directory=src --strip-components=1 \
    && CXXFLAGS="-DGLOG_USE_GLOG_EXPORT" \
        cmake -G Ninja -S src/wangle -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_EXAMPLES=OFF \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_TESTS=OFF \
        -DCMAKE_INSTALL_DIR=lib64/cmake/wangle \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DLIB_INSTALL_DIR=lib64 \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=mvfst-v2026.08.03.00.tar.gz,target=/tmp/mvfst.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/mvfst.tar.gz --directory=src --strip-components=1 \
    && CXXFLAGS="-DGLOG_USE_GLOG_EXPORT" \
        cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SAMPLES=OFF \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_TESTS=OFF \
        -DBUILD_TOOLS=OFF \
        -DCMAKE_INSTALL_LIBDIR=lib64 \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=fbthrift-v2026.08.03.00.tar.gz,target=/tmp/fbthrift.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/fbthrift.tar.gz --directory=src --strip-components=1 \
    && CXXFLAGS="-DGLOG_USE_GLOG_EXPORT" \
        cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_INSTALL_DIR=lib64/cmake/fbthrift \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DLIB_INSTALL_DIR=lib64 \
        -DTHRIFT_BENCHMARKS=OFF \
        -Denable_tests=OFF \
        -Dthrift_python=OFF \
        -Dthriftpy=OFF \
        -Dthriftpy3=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

COPY cachelib-optional-interface.patch /tmp/
RUN --mount=type=bind,from=sources,source=CacheLib-v2026.08.03.00.tar.gz,target=/tmp/CacheLib.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/CacheLib.tar.gz --directory=src --strip-components=1 \
    && git -C src apply /tmp/cachelib-optional-interface.patch \
    && CXXFLAGS="-DGLOG_USE_GLOG_EXPORT" \
        cmake -G Ninja -S src/cachelib -B build -DCMAKE_BUILD_TYPE=Release \
        -DBOOST_LINK_STATIC=ON \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_TESTS=OFF \
        -DCMAKE_INSTALL_DIR=lib64/cmake/cachelib \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DLIB_INSTALL_DIR=lib64 \
        -DBUILD_CACHELIB_INTERFACE=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src /tmp/cachelib-optional-interface.patch

RUN --mount=type=bind,from=sources,source=util-linux-2.42.2.tar.xz,target=/tmp/util-linux.tar.xz \
    mkdir src \
    && tar --extract --xz --file=/tmp/util-linux.tar.xz --directory=src --strip-components=1 \
    && cd src \
    && CFLAGS=-fPIC ./configure --prefix=/usr/local --libdir=/usr/local/lib64 \
        --disable-all-programs \
        --disable-bash-completion \
        --disable-makeinstall-chown \
        --disable-nls \
        --disable-shared \
        --enable-libuuid \
        --enable-static \
    && make --jobs="$(nproc)" \
    && make install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=libzmq-v4.3.5.tar.gz,target=/tmp/libzmq.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/libzmq.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED=OFF \
        -DBUILD_STATIC=ON \
        -DBUILD_TESTS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DENABLE_CPACK=OFF \
        -DENABLE_CURVE=ON \
        -DENABLE_DRAFTS=OFF \
        -DWITH_DOC=OFF \
        -DWITH_DOCS=OFF \
        -DWITH_LIBSODIUM=ON \
        -DWITH_LIBSODIUM_STATIC=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=czmq-v4.2.1.tar.gz,target=/tmp/czmq.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/czmq.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DCZMQ_BUILD_SHARED=OFF \
        -DCZMQ_BUILD_STATIC=ON \
        -DCZMQ_WITH_LZ4=OFF \
        -DCZMQ_WITH_LIBCURL=OFF \
        -DCZMQ_WITH_LIBMICROHTTPD=OFF \
        -DCZMQ_WITH_NSS=OFF \
        -DCZMQ_WITH_SYSTEMD=OFF \
        -DCZMQ_WITH_UUID=ON \
        -DENABLE_DRAFTS=OFF \
        -DLIB_SUFFIX=64 \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=jsoncpp-1.9.8.tar.gz,target=/tmp/jsoncpp.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/jsoncpp.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_OBJECT_LIBS=OFF \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_STATIC_LIBS=ON \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DJSONCPP_WITH_EXAMPLE=OFF \
        -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF \
        -DJSONCPP_WITH_TESTS=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=librdkafka-v2.15.0.tar.gz,target=/tmp/librdkafka.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/librdkafka.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DENABLE_LZ4_EXT=OFF \
        -DRDKAFKA_BUILD_EXAMPLES=OFF \
        -DRDKAFKA_BUILD_STATIC=ON \
        -DRDKAFKA_BUILD_TESTS=OFF \
        -DWITH_CURL=OFF \
        -DWITH_PLUGINS=OFF \
        -DWITH_SASL=OFF \
        -DWITH_SSL=ON \
        -DWITH_ZLIB=ON \
        -DWITH_ZSTD=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=json-c-json-c-0.19-20260627.tar.gz,target=/tmp/json-c.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/json-c.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_APPS=OFF \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_STATIC_LIBS=ON \
        -DBUILD_TESTING=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DDISABLE_EXTRA_LIBS=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

COPY rapidjson-generic-string-ref-assignment.patch /tmp/
RUN --mount=type=bind,from=sources,source=rapidjson-v1.1.0.tar.gz,target=/tmp/rapidjson.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/rapidjson.tar.gz --directory=src --strip-components=1 \
    && git -C src apply /tmp/rapidjson-generic-string-ref-assignment.patch \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DLIB_INSTALL_DIR=/usr/local/lib64 \
        -DRAPIDJSON_BUILD_DOC=OFF \
        -DRAPIDJSON_BUILD_EXAMPLES=OFF \
        -DRAPIDJSON_BUILD_TESTS=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src /tmp/rapidjson-generic-string-ref-assignment.patch

RUN --mount=type=bind,from=sources,source=curl-curl-8_21_0.tar.gz,target=/tmp/curl.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/curl.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_CURL_EXE=OFF \
        -DBUILD_EXAMPLES=OFF \
        -DBUILD_LIBCURL_DOCS=OFF \
        -DBUILD_MISC_DOCS=OFF \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_STATIC_LIBS=ON \
        -DBUILD_TESTING=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DCURL_BROTLI=OFF \
        -DCURL_USE_LIBPSL=OFF \
        -DCURL_USE_LIBSSH=OFF \
        -DCURL_USE_LIBSSH2=OFF \
        -DCURL_USE_OPENSSL=ON \
        -DENABLE_CURL_MANUAL=OFF \
        -DHTTP_ONLY=ON \
        -DUSE_LIBIDN2=OFF \
        -DUSE_NGHTTP2=OFF \
        -DUSE_NGTCP2=OFF \
        -DUSE_QUICHE=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=hiredis-v1.4.1.tar.gz,target=/tmp/hiredis.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/hiredis.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DENABLE_ASYNC_TESTS=OFF \
        -DENABLE_EXAMPLES=OFF \
        -DENABLE_NUGET=OFF \
        -DENABLE_SSL=OFF \
        -DENABLE_SSL_TESTS=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=gmp-6.3.0.tar.xz,target=/tmp/gmp.tar.xz \
    mkdir src \
    && tar --extract --xz --file=/tmp/gmp.tar.xz --directory=src --strip-components=1 \
    && cd src \
    && CFLAGS=-fPIC ./configure --prefix=/usr/local --libdir=/usr/local/lib64 --disable-shared --enable-static \
    && make --jobs="$(nproc)" \
    && make install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=nettle-3.10.2.tar.gz,target=/tmp/nettle.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/nettle.tar.gz --directory=src --strip-components=1 \
    && cd src \
    && CFLAGS=-fPIC ./configure --prefix=/usr/local --libdir=/usr/local/lib64 \
        --disable-documentation \
        --disable-shared \
        --enable-static \
    && make --jobs="$(nproc)" \
    && make install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=gnutls-3.8.13.tar.xz,target=/tmp/gnutls.tar.xz \
    mkdir src \
    && tar --extract --xz --file=/tmp/gnutls.tar.xz --directory=src --strip-components=1 \
    && cd src \
    && CFLAGS=-fPIC ./configure --prefix=/usr/local --libdir=/usr/local/lib64 \
        --with-included-libtasn1 \
        --with-included-unistring \
        --disable-cxx \
        --disable-doc \
        --disable-manpages \
        --disable-nls \
        --disable-shared \
        --disable-tests \
        --disable-tools \
        --enable-static \
        --without-brotli \
        --without-idn \
        --without-p11-kit \
        --without-tpm \
        --without-tpm2 \
        --without-zlib \
        --without-zstd \
    && make --jobs="$(nproc)" \
    && make install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=libmaxminddb-1.13.3.tar.gz,target=/tmp/libmaxminddb.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/libmaxminddb.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_TESTING=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DMAXMINDDB_BUILD_BINARIES=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=libyaml-0.2.5.tar.gz,target=/tmp/libyaml.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/libyaml.tar.gz --directory=src --strip-components=1 \
    && cd src \
    && ./bootstrap \
    && CFLAGS=-fPIC ./configure --prefix=/usr/local --libdir=/usr/local/lib64 --disable-shared --enable-static \
    && make --jobs="$(nproc)" \
    && make install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=libxml2-v2.15.3.tar.gz,target=/tmp/libxml2.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/libxml2.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DLIBXML2_WITH_DOCS=OFF \
        -DLIBXML2_WITH_ICU=OFF \
        -DLIBXML2_WITH_MODULES=OFF \
        -DLIBXML2_WITH_PROGRAMS=OFF \
        -DLIBXML2_WITH_PYTHON=OFF \
        -DLIBXML2_WITH_TESTS=OFF \
        -DLIBXML2_WITH_ZLIB=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=redis-plus-plus-1.3.15.tar.gz,target=/tmp/redis-plus-plus.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/redis-plus-plus.tar.gz --directory=src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DREDIS_PLUS_PLUS_BUILD_SHARED=OFF \
        -DREDIS_PLUS_PLUS_BUILD_STATIC=ON \
        -DREDIS_PLUS_PLUS_BUILD_STATIC_WITH_PIC=ON \
        -DREDIS_PLUS_PLUS_BUILD_TEST=OFF \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src

RUN --mount=type=bind,from=sources,source=libunwind-v1.8.3.tar.gz,target=/tmp/libunwind.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/libunwind.tar.gz --directory=src --strip-components=1 \
    && cd src \
    && autoreconf --install \
    && CFLAGS=-fPIC ./configure --prefix=/usr/local --libdir=/usr/local/lib64 \
        --disable-shared \
        --enable-static \
        --disable-tests \
        --disable-documentation \
        --disable-minidebuginfo \
        --disable-zlibdebuginfo \
    && make --jobs="$(nproc)" \
    && make install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=jemalloc-5.3.1.tar.gz,target=/tmp/jemalloc.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/jemalloc.tar.gz --directory=src --strip-components=1 \
    && cd src \
    && ./autogen.sh \
    && CFLAGS=-fPIC CXXFLAGS=-fPIC ./configure --prefix=/usr/local --libdir=/usr/local/lib64 \
        --disable-doc \
        --disable-shared \
        --enable-static \
        --enable-prof \
        --enable-prof-libunwind \
    && make --jobs="$(nproc)" \
    && make install \
    && cd .. \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=libproxyprotocol-v1.3.3.tar.gz,target=/tmp/libproxyprotocol.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/libproxyprotocol.tar.gz --directory=src --strip-components=1 \
    && gcc -fPIC -c -o src/src/proxy_protocol.o src/src/proxy_protocol.c \
    && ar rcs /usr/local/lib64/libproxyprotocol.a src/src/proxy_protocol.o \
    && cp src/src/proxy_protocol.h /usr/local/include/ \
    && rm -rf src

RUN --mount=type=bind,from=sources,source=duckdb-v1.5.6.tar.gz,target=/tmp/duckdb.tar.gz \
    --mount=type=bind,from=sources,source=duckdb-ui-0628932f74b1e2e9eaf68a05b22d737455541dca.tar.gz,target=/tmp/duckdb-ui.tar.gz \
    mkdir src \
    && tar --extract --gzip --file=/tmp/duckdb.tar.gz --directory=src --strip-components=1 \
    && mkdir ui-src \
    && tar --extract --gzip --file=/tmp/duckdb-ui.tar.gz --directory=ui-src --strip-components=1 \
    && cmake -G Ninja -S src -B build -DCMAKE_BUILD_TYPE=Release \
        -DDUCKDB_EXTENSION_CONFIGS="$PWD/ui-src/extension_config.cmake" \
        -DBUILD_SHARED_LIBS=OFF \
        -DBUILD_EXTENSIONS="core_functions;parquet;json" \
        -DBUILD_SHELL=ON \
        -DBUILD_UNITTESTS=OFF \
        -DBUILD_BENCHMARKS=OFF \
        -DENABLE_EXTENSION_AUTOLOADING=OFF \
        -DENABLE_EXTENSION_AUTOINSTALL=OFF \
        -DCMAKE_INSTALL_LIBDIR=lib64 \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
    && cmake --build build --parallel "$(nproc)" --target install \
    && rm -rf build src ui-src

CMD ["/bin/bash"]
