APKBUILD 示例:Haskell

来自 Alpine Linux

封装 Haskell 软件可能需要特定版本的依赖项,而 Alpine 软件包系统并不适合这种情况。Alpine 没有像 Gentoo 那样精细的插槽系统,允许安装多个次要版本和主要版本,而是假定软件包是 Alpine 或 Edge 版本的最新版本。Alpine 可以实现插槽系统,但需要单独的软件包,就像 llvm (llvm5- llvm4-) 和 python (python3- 和 python2-) 的处理方式一样。每个软件包的依赖项以及主程序都将放置在沙箱中。我们将描述可用于创建依赖 Haskell 的软件包的样板模板。Haskell 使用名为 Cabal 的软件包管理器,它将内容转储到当前目录的 .cabal 文件夹中。Alpine 使用 ghc (Glasgow Haskell Compiler) 来支持 Haskell。

使用此方法,无需为 Haskell 库创建单独的软件包。

目前,没有站点目录用于存放所有 Haskell 程序。

你需要有这些 make 依赖项

makedepends="ghc cabal"

你的 prepare() 语句应该像这样

prepare() {
 cd "$builddir"
 cabal sandbox init
 cabal configure --prefix=/usr
}

你的 build() 语句应该像这样

build() {
 # the cabal install will automatically fetch all dependencies and compile all dependencies and the main program
 cabal install $pkgname-$pkgver --enable-relocatable
}

`cabal install` 完成后,它会将所有文件放在 `"$builddir"/.cabal` 的隐藏文件夹中。将该文件夹的内容转储到 `"$pkgdir"/usr/lib/$pkgname` 中。然后,从 $pkgname/usr/lib/$pkgname/bin/$pkgname 创建一个符号链接到 /usr/bin/$pkgname

你的 package() 语句应该像这样

 package() {
  mkdir -p "$pkgdir/usr/lib"
  mv "$builddir"/.cabal "$builddir"/$pkgname
  mv "$builddir"/$pkgname "$pkgdir"/usr/lib/

  mkdir -p "$pkgdir/usr/bin"
  cd "$pkgdir/usr/bin"
  ln -s /usr/lib/$pkgname/$bin/$pkgname $pkgname
 }

关于许可,请确保将 cabal 拉取的依赖项的许可证也放在 license= 字段中。

查找软件包

如果你是软件包创建者,你可以在 Hackage 软件包存档中找到其他软件包。

你也可以在 GitHub 上搜索,但本指南尚未告诉你如何将 GitHub Haskell 项目与 Cabal 沙箱集成。