# 古曰：自举之材必验其印，成器后去其炉。
# 白话：固定连续自举包的 SHA-256，以双阶段镜像编译豫言服务，运行镜像不保留编译工具链。

FROM --platform=linux/amd64 debian:bookworm-slim AS builder

ARG YY_BOOTSTRAP_URL=https://github.com/yuyan-lang/yuyan/releases/download/historical-bootstrap/bootstrap-pair-903b242e8d4845ce99bafc467ed019c706d265f978dd90cf9c25a475487767be.tar.gz
ARG YY_BOOTSTRAP_SHA256=903b242e8d4845ce99bafc467ed019c706d265f978dd90cf9c25a475487767be

RUN apt-get update \
    && apt-get install --yes --no-install-recommends ca-certificates clang curl llvm make tar zlib1g-dev \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /构建
RUN curl --fail --location --retry 3 --retry-all-errors "$YY_BOOTSTRAP_URL" --output 自举包.tar.gz \
    && echo "$YY_BOOTSTRAP_SHA256  自举包.tar.gz" | sha256sum --check - \
    && mkdir 自举包 \
    && tar -xzf 自举包.tar.gz -C 自举包 --strip-components=1 \
    && find 自举包 -type f \( -name '._*' -o -name '.DS_Store' \) -delete \
    && test "$(cat 自举包/种子格式)" = "豫言双种子一" \
    && 自举包/构建.sh \
    && cp 自举包/yy_bs_stable yy稳定编译器 \
    && cp 自举包/yy豫构_stable yy稳定豫构 \
    && chmod 0755 yy稳定编译器

COPY Makefile /源码/Makefile
COPY 豫言编译器 /源码/豫言编译器
COPY 库 /源码/库
COPY 工具 /源码/工具
COPY 运行时支持库 /源码/运行时支持库
WORKDIR /源码
RUN make yy_runtime_lib \
    && find 运行时支持库 -maxdepth 1 -type f -name '*.a' -exec ranlib {} +
RUN cp /构建/yy稳定编译器 ./yy_bs_stable && cp /构建/yy稳定豫构 ./yy豫构_stable \
    && make yy2_bs \
    && ./yy豫构_stable 构建 豫构 --编译器 ./yy2_bs --输出 yy豫构 \
    && cp yy2_bs /构建/yy当前编译器
RUN ./yy豫构 构建 包管理服务 --编译器 ./yy2_bs --输出 /构建/yy包管理服务

FROM --platform=linux/amd64 debian:bookworm-slim AS runtime

RUN apt-get update \
    && apt-get install --yes --no-install-recommends ca-certificates coreutils openssl unzip zlib1g \
    && rm -rf /var/lib/apt/lists/*

# 古曰：器内行路用拉丁字，以避 OCI 宿主异同之患。
# 白话：镜像内入口路径使用 ASCII，避免不同容器运行时处理 Unicode argv 的差异。
COPY --from=builder /构建/yy包管理服务 /usr/local/bin/yy-package-registry

# 古曰：小室量入为出，栈堆之限刻于器中，不假外桥传令。
# 白话：镜像级 ENV 保证 OCI 入口必定取得内存限制；现行栈变量的 2 实际表示 32 MiB。
ENV YY_GC_INITIAL_STACK_SIZE_MB=2 \
    YY_GC_INITIAL_HEAP_SIZE_MB=128 \
    YY_GC_MAX_HEAP_SIZE_MB=128

USER 65532:65532
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/yy-package-registry"]
