How can I update `nix-shell` development environment to work on systems other than NixOS?

337 views Asked by At

I've got a working nix-shell for my NixOS machine that provides the necessary dependencies for the repository I'm working on. I'm trying to diversify it so that other machines can use it as well. I've tested it on an M1 MBP, my NixOS machine and a live boot of Pop!_OS on the same machine (HP Dev One).

Here is the shell.nix file itself:

{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-22.11.tar.gz") {} }:

pkgs.mkShell {
  name = "vrrb-dev";

  nativeBuildInputs = with pkgs; [
    pkg-config
  ];

  buildInputs = with pkgs; [
    # dev tools
    which
    htop
    zlib

    # build dependencies
    clang
    libclang.lib
    rocksdb
    openssl.dev
    rustup
  ] ++ lib.optionals stdenv.isDarwin [
    libiconv
    darwin.apple_sdk.frameworks.Security
    ];

  RUSTC_VERSION = pkgs.lib.readFile ./rust-toolchain.toml;

  shellHook = ''
    export PATH=$PATH:''${CARGO_HOME:-~/.cargo}/bin
    export PATH=$PATH:''${RUSTUP_HOME:-~/.rustup}/toolchains/$RUSTC_VERSION-x86_64-unknown-linux-gnu/bin/
    export LIBCLANG_PATH="${pkgs.libclang.lib}/lib";
    export ROCKSDB_LIB_DIR="${pkgs.rocksdb}/lib";
  '';
}

I have a branch where I've added libiconv in the buildInputs, and tested it on the M1, as described here. This seems to at least allow cargo clippy to complete, but cargo build still gives this error on the M1 & Pop!_OS live boot:

EDIT: The M1 is no longer getting this error after adding ++ lib.optionals stdenv.isDarwin [ libiconv darwin.apple_sdk.frameworks.Security ];

M1 MBP:

error: linking with `cc` failed: exit status: 1
  |
  = note: LC_ALL="C" PATH="/Users/eureka/.rustup/toolchains/1.69.0-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/bin:/nix/store/...

<shortened to meet max character count but it was all paths>

..."/Users/eureka/.rustup/toolchains/1.69.0-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libcompiler_builtins-90099c6af476d811.rlib" "-lrocksdb" "-lc++" "-framework" "Security" "-lssl" "-lcrypto" "-framework" "Security" "-framework" "Security" "-framework" "CoreFoundation" "-liconv" "-lSystem" "-lc" "-lm" "-L" "/Users/eureka/.rustup/toolchains/1.69.0-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib" "-o" "/Users/eureka/Code/vrrb/target/debug/deps/vrrb-cbf8e0f56f41c123" "-Wl,-dead_strip" "-nodefaultlibs" "-undefined" "dynamic_lookup"
  = note: ld: framework not found Security
          clang-11: error: linker command failed with exit code 1 (use -v to see invocation)

On Pop!_OS:

error: linking with `cc` failed: exit status: 1
  |
  = note: LC_ALL="C" PATH="/home/pop-os/.rustup/toolchains/1.69.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:/nix/store...

<Same as above>

..."/home/pop-os/.rustup/toolchains/1.69.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-957b4aff41f8cd46.rlib" "-Wl,-Bdynamic" "-lrocksdb" "-lstdc++" "-lssl" "-lcrypto" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-z,noexecstack" "-L" "/home/pop-os/.rustup/toolchains/1.69.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/home/pop-os/vrrb/target/debug/deps/vrrb-b58fba9b599b43a6" "-Wl,--gc-sections" "-pie" "-Wl,-z,relro,-z,now" "-nodefaultlibs"

I also have a discussion about this going on at https://discourse.nixos.org/t/how-to-update-a-shell-nix-development-environment-to-work-with-other-systems/28727 and I'm updating both as the discussion grows.

0

There are 0 answers