学习目标

  • 学会创建自定义包
  • 理解 Flakes
  • 掌握跨平台开发

10.1 创建自定义包

简单的包定义

创建 default.nix

{ pkgs ? import <nixpkgs> {} }:

pkgs.stdenv.mkDerivation {
  pname = "myapp";
  version = "1.0";

  src = ./.;

  buildInputs = [ pkgs.gcc ];

  buildPhase = ''
    gcc -o myapp main.c
  '';

  installPhase = ''
    mkdir -p $out/bin
    cp myapp $out/bin/
  '';
}

构建:

nix-build
./result/bin/myapp

10.2 Nix Flakes

Flakes 是 Nix 的新特性,提供更好的可复现性。

启用 Flakes

mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf

创建 flake.nix

{
  description = "XUPTArch development environment";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  };

  outputs = { self, nixpkgs }: {
    devShells.x86_64-linux.default =
      let pkgs = nixpkgs.legacyPackages.x86_64-linux;
      in pkgs.mkShell {
        buildInputs = [ pkgs.gcc pkgs.gnumake ];
      };
  };
}

使用:

nix develop

10.3 跨平台支持

{
  outputs = { self, nixpkgs }:
    let
      systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" ];
      forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
    in {
      devShells = forAllSystems (system:
        let pkgs = nixpkgs.legacyPackages.${system};
        in {
          default = pkgs.mkShell {
            buildInputs = [ pkgs.gcc ];
          };
        }
      );
    };
}

实践练习

  1. 创建一个自定义包
  2. 使用 Flakes 管理项目
  3. 添加跨平台支持

下一步

第 11 章:Bazel 构建系统 - 入门

更新时间: