4 ms·
Okay, sorry to hijack, but I keep trying it, and keep getting stuck. Most recently, how do I install a Rust binary from Github? They have a releases page, or I
by pkulak 5y ago
Okay, sorry to hijack, but I keep trying it, and keep getting stuck. Most recently, how do I install a Rust binary from Github? They have a releases page, or I can just do a cargo build. Either way, I would just drop the resulting binary in /usr/bin and it's done. With Nix... I'm totally stumped. Do I have to package it myself somehow?
- assbuttbuttass 5y agoYes, you will have to package it if it's not already in nixpkgs. The good news is once you learn how, it's basically trivial with crate2nix[0], which can autogenerate nix derivations from rust crates [0] https://github.com/kolloch/crate2nix https://github.com/kolloch/crate2nix
- lilyball 5y agoYou can also use naersk¹ if you want to avoid a two-step process. It's especially convenient when using nix flakes. ¹https://github.com/nix-community/naersk https://github.com/nix-community/naersk
- JamesSwift 5y agoIf you just want to take a precompiled binary and install it, you just have to write a derivation wrapper around the binary which will declare the expected hash and take care of e.g. unzipping and moving to $out/bin. Here is a more involved example of downloading a release and then extracting the binary from a .pkg file: https://gist.github.com/J-Swift/364a8b158bf0b603f6e784e454ca6e53 https://gist.github.com/J-Swift/364a8b158bf0b603f6e784e454ca... Here is a more simplified example: https://gist.github.com/mitchellh/c47e3333bb78f57836ba2aa8064ad993#file-hashicorp-generic-nix-L32-L47 https://gist.github.com/mitchellh/c47e3333bb78f57836ba2aa806... EDIT: to get the sha, unfortunately you have to perform some esoteric command line incantations: https://github.com/NixOS/nix/issues/1880#issuecomment-366615204 https://github.com/NixOS/nix/issues/1880#issuecomment-366615... and https://gist.github.com/boxofrox/d8a3080fbb03f84b7d7a31e102b35f09 https://gist.github.com/boxofrox/d8a3080fbb03f84b7d7a31e102b...
- codingkoi 5y agoOnce I discovered `lib.fakeSha256`, I just put that in the derivation, try to build it and then use the error message to find the correct hash to put into it. Probably not the fastest way to do it, but it's easier for me to remember.
- JamesSwift 5y agoyeah that seems way easier, thanks for the tip!
- chriswarbo 5y ago> Either way, I would just drop the resulting binary in /usr/bin and it's done. With Nix... I'm totally stumped. If you don't care about Nixpkgs conventions ("build phases", etc.) then you can use `runCommand` to run arbitrary bash code. It's a function which takes three arguments: a name for the output, a key/value mapping for the environment variables (plus a few some special names), and a string of bash code (usually written between ''two single quotes''). with import <nixpkgs> {}; runCommand "my-favourite-program" # A name for the output { # A key/value mapping of env vars myVar = "myValue"; # The 'buildInputs' name is special: for each element 'x', the directory '${x}/bin' # will be appended to the PATH env var buildInputs = [ jq gcc ]; } '' # This is a multi-line string containing arbitrary bash code. # The output path will be provided via the env var $out so we # just need to create a file or folder with that path mkdir -p "$out/bin" echo "$myVar" > "$out/bin/my-executable" chmod +x "$out/bin/my-executable" '' One complication is that (by default) the script will be run in a sandbox, with no network access. We should fetch anything it depends on up-front, using e.g. fetchurl, fetchGit, etc. Here's a more realistic example: with import <nixpkgs> {}; runCommand "foo" { release = fetchurl { url = "http://example.com/foo/foo-1.0.zip"; hash = "sha256-iqZDwWkQA9XMTICEMCt5xDlmfmiIwzpeE3HJLbgbDXs="; }; buildInputs = [ unzip ]; } '' unzip "$release" mkdir -p "$out/bin" mv foo-1.0/binary "$out/bin/foo" ''