nix-community / bundix

Generates a Nix expression for your Bundler-managed application. [maintainer=@manveru]
163 stars 55 forks source link

jemallocSupport with gems #114

Open emptyflask opened 5 months ago

emptyflask commented 5 months ago

I opened an issue at https://github.com/bobvanderlinden/nixpkgs-ruby/issues/118 for this as well, but wasn't sure if the bundix repo was a better place to ask.


I'm attempting to enable jemalloc with ruby, which appears to work fine, but it isn't available to gems. I thought that maybe since it was in ruby's propagatedBuildInputs, the gems would have it, but no.

        pkgs = import nixpkgs {
          inherit system;
          overlays = [ bob-ruby.overlays.default ];
        };
        rubyNix = ruby-nix.lib pkgs;
        gemset = if builtins.pathExists ./gemset.nix then import ./gemset.nix else { };
        rubyVersion = nixpkgs.lib.fileContents ./.ruby-version;

        ruby = pkgs."${rubyVersion}".override {
          jemallocSupport = true;
          yjitSupport = true;
        };

I wrote a function to add it to each gem's buildInputs, but merging that with defaultGemConfig replaces the existing builtInputs, so perhaps a "deep merge" is needed instead:

        jemallocGemConfig = builtins.listToAttrs (map (name: {
          inherit name;
          value = attrs: attrs // { buildInputs = (attrs.buildInputs or []) ++ [ pkgs.jemalloc ]; };
        }) (builtins.attrNames gemset));
      in rec {
        inherit (rubyNix {
          inherit gemset ruby;
          name = "chronos";
          gemConfig = pkgs.defaultGemConfig // jemallocGemConfig;
        }) env;
        devShells = rec {
          dev = pkgs.mkShell { buildInputs = [ env ] };
          default = dev;
        };
      };

But I'm probably thinking about this the wrong way. Surely there's some better/simpler way to use jemalloc with gems.