diff --git a/flake.nix b/flake.nix index b3d853a..4dff26c 100644 --- a/flake.nix +++ b/flake.nix @@ -38,6 +38,8 @@ }; }; + nixosModules.nix-ld = import ./modules/nix-ld.nix {}; + devShells.default = pkgs.mkShell ({ nativeBuildInputs = [ pkgs.rustc diff --git a/modules/nix-ld.nix b/modules/nix-ld.nix new file mode 100644 index 0000000..2bc7ce6 --- /dev/null +++ b/modules/nix-ld.nix @@ -0,0 +1,77 @@ +{ pkgs, lib, config, ... }: +let + cfg = config.programs.nix-ld.dev; + + nix-ld-libraries = pkgs.buildEnv { + name = "lb-library-path"; + pathsToLink = [ "/lib" ]; + paths = map lib.getLib cfg.libraries; + # TODO make glibc here configurable? + postBuild = '' + ln -s ${pkgs.stdenv.cc.bintools.dynamicLinker} $out/share/nix-ld/lib/ld.so + ''; + extraPrefix = "/share/nix-ld"; + ignoreCollisions = true; + }; + + # We currently take all libraries from systemd and nix as the default. + # Is there a better list? + baseLibraries = with pkgs; [ + zlib + zstd + stdenv.cc.cc + curl + openssl + attr + libssh + bzip2 + libxml2 + acl + libsodium + util-linux + xz + systemd + ]; +in +{ + meta.maintainers = [ lib.maintainers.mic92 ]; + + + options.programs.nix-ld.dev = { + enable = lib.mkEnableOption (lib.mdDoc ''nix-ld, Documentation: '') // { + default = true; + }; + package = lib.mkOption { + type = lib.types.package; + description = lib.mdDoc "The package to be used for nix-ld."; + default = pkgs.callPackage ../package.nix {}; + }; + libraries = lib.mkOption { + type = lib.types.listOf lib.types.package; + description = lib.mdDoc "Libraries that automatically become available to all programs. The default set includes common libraries."; + default = baseLibraries; + defaultText = lib.literalExpression "baseLibraries derived from systemd and nix dependencies."; + }; + }; + + config = lib.mkIf config.programs.nix-ld.dev.enable { + assertions = [{ + assertion = !config.programs.nix-ld.enable; + message = '' + nix-ld.dev cannot be enabled at the same time as nix-ld. + ''; + }]; + + systemd.tmpfiles.packages = [ cfg.package ]; + + environment.systemPackages = [ nix-ld-libraries ]; + + environment.pathsToLink = [ "/share/nix-ld" ]; + + environment.variables = { + NIX_LD = "/run/current-system/sw/share/nix-ld/lib/ld.so"; + NIX_LD_LIBRARY_PATH = "/run/current-system/sw/share/nix-ld/lib"; + }; + }; +} +