如何从源代码构建 Nix 包?

ric*_*cky 5 nixos nix

我认为 NixOS 很棒,但无法弄清楚如何从源代码构建包。理解Nix 表达式语言不是问题,而是知道要default.nix构建一个包要放入什么内容。

以 Nix 表达式为例gedit

{ stdenv, intltool, fetchurl, enchant, isocodes
, pkgconfig, gtk3, glib
, bash, wrapGAppsHook, itstool, libsoup, libxml2
, gnome3, librsvg, gdk_pixbuf, file, gspell }:

stdenv.mkDerivation rec {
  inherit (import ./src.nix fetchurl) name src;

  propagatedUserEnvPkgs = [ gnome3.gnome_themes_standard ];

  nativeBuildInputs = [ pkgconfig wrapGAppsHook ];

  buildInputs = [ gtk3 glib intltool itstool enchant isocodes
                  gdk_pixbuf gnome3.defaultIconTheme librsvg libsoup
                  gnome3.libpeas gnome3.gtksourceview libxml2
                  gnome3.gsettings_desktop_schemas gnome3.dconf file gspell ];

  enableParallelBuilding = true;

  preFixup = ''
    gappsWrapperArgs+=(--prefix LD_LIBRARY_PATH : "${stdenv.lib.makeLibraryPath [ gnome3.libpeas gnome3.gtksourceview ]}")
  '';

  meta = with stdenv.lib; {
    homepage = https://wiki.gnome.org/Apps/Gedit;
    description = "Official text editor of the GNOME desktop environment";
    maintainers = gnome3.maintainers;
    license = licenses.gpl2;
    platforms = platforms.linux;
  };
}
Run Code Online (Sandbox Code Playgroud)

有人如何得出这个解决方案?我肯定错过了什么。

Rob*_*ing 4

毫不奇怪,这样的包定义对任何人来说都有点难以承受。当您了解各种属性的作用时,您的示例包就会变得非常简单。

根据我的经验,您会得到如下这样的包定义。我假设您现在没有从特定于语言的存储库中打包某些内容。make例如,您可以使用 来构建的东西。

  1. 从mkDerivation开始
  2. 观察构建失败
  3. 通过添加依赖项、额外命令、配置标志、补丁等来修复错误。
  4. 重复

现在你已经知道了,这就是反复试验。使用所需构建工具的经验会很有帮助。

一些提示: