Skip to content

feat(pkg): 新增 compat.gmp —— GNU GMP 6.3.0 静态库(install() 驱动,linux/macOS) - #194

Merged
Sunrisepeak merged 3 commits into
mcpplibs:mainfrom
wellwei:codex/gmp
Aug 9, 2026
Merged

feat(pkg): 新增 compat.gmp —— GNU GMP 6.3.0 静态库(install() 驱动,linux/macOS)#194
Sunrisepeak merged 3 commits into
mcpplibs:mainfrom
wellwei:codex/gmp

Conversation

@wellwei

@wellwei wellwei commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Closes #171

变更内容

  • pkgs/c/compat.gmp.lua —— 新增 compat.gmp(GNU GMP 6.3.0):C 源码库走 xpkg install() 钩子模式(同 compat.openssl/compat.openblas),钩子内跑上游 configure && make && make install 产出静态 libgmp.a + include/gmp.h
  • tests/examples/gmp/ —— 消费成员:mpz(100! / 2^1000 mod 12345 / gcd)+ mpq(1/2+1/3)+ mpf(sqrt2)断言,参考值由 Python 独立预计算;cfg(linux)/cfg(macos) 门控,其他平台 no-op main。
  • mcpp.toml 注册成员;README(EN/ZH)参考示例表补充;设计文档 .agents/docs/2026-08-09-add-gmp-plan.md

关键决策

  • configure 参数:--disable-shared --enable-static --disable-assembly(可移植通用 C 内核);--libdir 为绝对路径(GMP configure 拒绝相对值)。
  • 编译器用宿主 cc:linux /usr/bin/gcc、macOS /usr/bin/cc。GMP 的 configure 会编译并运行 ABI 探针、make 要运行 gen-* 构建工具,链接到 xim glibc payload 的这类可执行文件无法在本钩子环境运行(linux CI 首轮实测 could not find a working compiler);静态库的 glibc/libm 符号由消费端工具链更新的 payload glibc 在最终链接时满足。
  • 平台:linux + macOS;Windows 推迟(GMP 无 MSVC 构建路径,与 compat.openssl 现状一致)。
  • 镜像:暂无 mcpp-res 写权限 → 纯字符串上游 url(ftp.gnu.org 权威 tarball),lint 合规,维护者后续可补 CN。
  • 许可证:LGPL-3.0-or-later(GMP 双许可取宽松侧)。

验证

wellwei added 3 commits August 9, 2026 14:30
- pkgs/c/compat.gmp.lua:xpkg install() 钩子跑上游 configure && make && make install,
  产出 libgmp.a + include/gmp.h(--disable-assembly 通用 C 内核,--libdir 绝对路径)。
- tests/examples/gmp/:mpz/mpq/mpf 三层算术断言,cfg(linux)/cfg(macos) 门控,其他平台 no-op。
- windows 推迟:GMP 无 MSVC 构建路径;镜像待 mcpp-res 权限后补,当前纯字符串上游 url。
- 本地验证:mcpp 2026.8.8.2 macOS arm64 冷启动全流程通过;lint 8 项全过。
- 关联 issue mcpplibs#171
linux default 腿 CI 实测失败:configure 报 could not find a working compiler。
GMP 的 configure 会编译并运行 ABI 探针、make 期运行 gen-* 工具,链接到 xim glibc
payload(--sysroot/-B/-L)的这类可执行文件在本钩子环境无法运行;openssl 的
Configure 只写 Makefile 所以无此问题。改 /usr/bin/gcc 后探针/工具跑宿主 glibc,
静态库符号由消费端工具链更新的 payload glibc 在最终链接时满足。
@wellwei
wellwei requested a review from Sunrisepeak August 9, 2026 06:35
@Sunrisepeak
Sunrisepeak merged commit 99e2202 into mcpplibs:main Aug 9, 2026
10 checks passed
FarnaHerry pushed a commit to FarnaHerry/mcpp-index that referenced this pull request Aug 10, 2026
`compat.gmp` 现在没有 install() 钩子、没有 autotools/cmake/make、没有任何构建期
依赖:mcpp 用消费端自己的工具链直接编译 GMP 的可移植 C 内核(516 TU),
linux / macOS / windows 同一条路径。

## 为什么不是"给 windows 补一条构建路径"

1. 合入版本在 gcc >= 15 上根本装不上。GMP 的 configure 会编译并运行探针,其中
   "long long reliability test 1" 用 6 个实参调用一个 `void g(){}` —— C23 下
   `()` 等价于 `(void)`,于是 configure 报
   `could not find a working compiler`。本机 gcc 16.1.0 实测复现;CI 之所以绿,
   只是 ubuntu-latest 还停在 gcc 13。
2. configure 要运行探针、make 要运行 gen-* 工具,所以钩子只能钉宿主 /usr/bin/gcc,
   产物由一个与消费端无关的编译器构建 —— 这也是 gmpxx 一直收不进来的原因。
3. 上游没有 MSVC 路径,windows 因此推迟。

把构建描述进 `mcpp = { }` 一次解决三条。唯一表达不出来的是 GMP 会"编译并运行"
七个表生成器 + 从 gmp-h.in substitute 出 gmp.h —— 而这些都只是
(limb=64, nail=0) 的纯函数,故用上游自己的生成器跑一次,产物内联进
`generated_files`(约 270 KB)。`tools/gmp/generate_descriptor.py` 可从零复现整份
描述符(`check` 模式对拍),与 tools/godot-cpp/repack.sh 同一形态。

## 与上游对拍(证据)

同一 tarball 的 --disable-assembly autotools 构建作参照:
  * 导出符号 598 个,集合完全一致(不多不少);
  * 上游自带 make check(178 个测试程序)对本产物:
    TOTAL=178 PASS=177 FAIL=0 ERROR=0 SKIP=1 —— gcc 与 clang 各一遍。
比该参照更快:--disable-assembly 会定义 NO_ASM,连 longlong.h 的
umul_ppmm/add_ssaaaa 一起关掉;本构建保留它们(由编译器预定义宏选通,够不着自动
退回 C)。

## 其它改动

* 新增 `gmpxx` feature —— GMP 的 C++ 绑定,由消费端工具链编译(符号名里带
  std::ostream/std::string,预编一份必然在 libc++ 腿上 undefined)。
  合并成单个 TU 以避开 basename 撞名,并在顶部先包含 <stdio.h>/<stdarg.h>
  (否则 gmp-impl.h 的 gmp_asprintf_t 在 libstdc++ 上是 incomplete type)。
* 每个源码目录一个一行转发头 → 整包编译零 `-I`,include_dirs 只暴露
  gmp.h + gmpxx.h,不再把 config.h 这种名字放进消费者搜索路径。
* linux/macOS 补 `-fPIC`(静态库会被链进 .so;clang++ 默认 PIE 时链接直接报
  relocation R_X86_64_32)。
* 去掉 linux 的 `-lm` —— 实测 libgmp.a 不引用任何 libm 符号(autotools 产物同样)。
* 测试成员去掉 cfg 门控与 no-op main,三平台真跑;按编译进来的每个目录各一组断言
  (mpz/mpq/mpf/printf/scanf/rand),并断言 GMP_LIMB_BITS 与 mp_bits_per_limb 一致。
* 新增 tests/examples/gmp-gmpxx 覆盖 feature 路径(负向:关掉 feature 有 4 处
  undefined reference)。

Refs mcpplibs#171, supersedes the install() design in mcpplibs#194
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

增加libgmp科学库

2 participants