How do I add packages to a flake conditional on the architecture?

I’d like to add a package after gcc/boost that only works on x86-64. This is from the determinate tutorial.

{
  description = "Example C++ development environment for Zero to Nix";

  # Flake inputs
  inputs = {
    nixpkgs.url = https://flakehub.com/f/NixOS/nixpkgs/0.2405.*.tar.gz;
  };

  # Flake outputs
  outputs = { self, nixpkgs }:
    let
      # Systems supported
      allSystems = [
        "x86_64-linux" # 64-bit Intel/AMD Linux
        "aarch64-linux" # 64-bit ARM Linux
        "x86_64-darwin" # 64-bit Intel macOS
        "aarch64-darwin" # 64-bit ARM macOS
      ];

      # Helper to provide system-specific attributes
      forAllSystems = f: nixpkgs.lib.genAttrs allSystems (system: f {
        pkgs = import nixpkgs { inherit system; };
      });
    in
    {
      # Development environment output
      devShells = forAllSystems ({ pkgs }: {
        default = pkgs.mkShell {
          # The Nix packages provided in the environment
          packages = with pkgs; [
            boost # The Boost libraries
            gcc # The GNU Compiler Collection
          ];
        };
      });
    };
}

Remove gcc from the shell, a c compiler is already part of the shell.

packages = [ pkgs.boost ] ++ lib.optionals (pkgs.stdenv.hostPlatform.system == "x86_64-linux") [ FOOBAR ];

Also this should be pkgs = nixpkgs.legacyPackages.${system}; if you don’t need to pass config/overlays in.

1 Like

Is it always part of any shell? Or just this one because of the input flake? It’s surprising to me that a C compiler would already be there, usually you need to opt in on e.g. Ubuntu.

Also lib.optionals is a little strange syntactically, is there not just if?

Could you elaborate on this? I’m very new to nix, I’m not familiar with what the difference is.

https://nixos.org/manual/nixpkgs/unstable/#sec-tools-of-stdenv

It’s functional programming style.
Actually I realised lib isn’t in scope, it’d be pkgs.lib… but anyway, you can write the if out if you want.

Consider it a best practice to reduce the number of nixpkgs instances that are created (reducing memory usage and time spent).

1 Like