Haskell GHC如何创建不依赖GMP的可执行文件?

3

我有一个简单的程序,似乎根本没有使用libgmp。

-- Sample.hs
main = putStrLn "hi"

如果我在Linux上使用默认选项编译它

$ ghc Sample.hs

这将生成一个名为Sample的可执行文件。我想查看一个不使用任意精度整数的简单程序所需的库。
$ ldd Sample | sed -e 's/[(].*[)]/(0x000...)/'
        linux-vdso.so.1 (0x000...)
        libgmp.so.10 => /usr/lib64/libgmp.so.10 (0x000...)
        libm.so.6 => /lib64/libm.so.6 (0x000...)
        librt.so.1 => /lib64/librt.so.1 (0x000...)
        libdl.so.2 => /lib64/libdl.so.2 (0x000...)
        libc.so.6 => /lib64/libc.so.6 (0x000...)
        /lib64/ld-linux-x86-64.so.2 (0x000...)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x000...)

有没有一些标志我可以传递给GHC,告诉它不要生成依赖于libgmp.so库的可执行文件。我不想静态链接libgmp,理想情况下,我希望配置GHC以根本不发出依赖于该库的代码。如果我尝试使用Integer之类的内容,我可以接受一些功能减少,例如错误提示。


1
如果你担心LGPL许可证,请注意,为了遵守该许可证,你只需要做到以下两点之一即可:A: 不要分发二进制文件(例如运行Web服务器的常见情况)或B: 仅随二进制文件分发目标代码。遵守LGPL的全部要求就是允许用户链接到与LGPL库不同但兼容的版本。 - Cubic
1个回答

3

我不是很确定,但似乎您可以通过告诉GHC在构建时使用 integer-simple 而不是 integer-gmp 来完成此操作。具体来说,配置 INTEGER_LIBRARY=integer-simple 。请参阅GHC源树中的 mk/config.mk.in


2
是的,我以前做过这个,而且它很好用...除了一些依赖于integer-gmp库的东西。其中一个就是在我修补它之前的文本(然后有人修复了我的补丁)。不幸的是,似乎有越来越多的软件包在这样做了(http://packdeps.haskellers.com/reverse/integer-gmp)。 - Thomas M. DuBuisson
@ThomasMDuBuisson,该列表包括bytestring,这是非常关键的。如果它确实依赖于integer-gmp,那么将会阻塞很多其他库。 - dfeuer
1
它和其他一些都有一个整数简单标志。 - Thomas M. DuBuisson
也许有点跑题,但我认为ghc正在迁移到shake。基于shake的构建系统是否会遵守相同的环境变量? - Greg Nisbet
1
@GregoryNisbet,GHC正在迁移到Shake(我认为这在8.4版本中会发生)。我不知道配置选项将如何工作,但我相信您可以以某种方式设置它们!我不知道是否仍然可以使用“configure”完成。 - dfeuer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接