All Projects → nh2 → Static Haskell Nix

nh2 / Static Haskell Nix

easily build most Haskell programs into fully static Linux executables

Programming Languages

haskell
3896 projects

Labels

Projects that are alternatives of or similar to Static Haskell Nix

hakyll-nix-template
Hakyll + Nix starter template
Stars: ✭ 20 (-93.55%)
Mutual labels:  nix
Node2nix
Generate Nix expressions to build NPM packages
Stars: ✭ 258 (-16.77%)
Mutual labels:  nix
Nix.dev
An opinionated guide for developers wanting to get things done with Nix.
Stars: ✭ 300 (-3.23%)
Mutual labels:  nix
bigdata-fun
A complete (distributed) BigData stack, running in containers
Stars: ✭ 14 (-95.48%)
Mutual labels:  nix
nixcfg
NixOS and Home-Manager configurations for all of my devices (desktop, Pinebook Pro, RPi4, cloud servers, etc). Like dotfiles, but way better. (née 'nixos-config')
Stars: ✭ 119 (-61.61%)
Mutual labels:  nix
Not Os
An operating system generator, based on NixOS, that, given a config, outputs a small (47 MB), read-only squashfs for a runit-based operating system, with support for iPXE and signed boot.
Stars: ✭ 280 (-9.68%)
Mutual labels:  nix
dotnix
Shackled within an elaborate prison of my own design.
Stars: ✭ 35 (-88.71%)
Mutual labels:  nix
Example Nix
a way to develop software with Nix
Stars: ✭ 306 (-1.29%)
Mutual labels:  nix
go2nix
Reproducible builds and development environment for Go
Stars: ✭ 88 (-71.61%)
Mutual labels:  nix
Mobile Nixos
Questions? #nixos-aarch64 (or #nixos) on Freenode!
Stars: ✭ 291 (-6.13%)
Mutual labels:  nix
nixpkgs
My Nix system configs!
Stars: ✭ 143 (-53.87%)
Mutual labels:  nix
tix
[WIP] A type system for nix
Stars: ✭ 59 (-80.97%)
Mutual labels:  nix
Haskell.nix
Alternative Haskell Infrastructure for Nixpkgs
Stars: ✭ 283 (-8.71%)
Mutual labels:  nix
nix-cookbook
A cookbook of snippets that show you how you can accomplish common tasks using the Nix expression language
Stars: ✭ 73 (-76.45%)
Mutual labels:  nix
Nix Bundle
Bundle Nix derivations to run anywhere!
Stars: ✭ 302 (-2.58%)
Mutual labels:  nix
system
Declarative NixOS system configuration for all my machines
Stars: ✭ 14 (-95.48%)
Mutual labels:  nix
Nix Docker
Provision Docker images using Nix
Stars: ✭ 274 (-11.61%)
Mutual labels:  nix
Nix Config
My local Nix configuration
Stars: ✭ 306 (-1.29%)
Mutual labels:  nix
Morph
NixOS deployment tool
Stars: ✭ 303 (-2.26%)
Mutual labels:  nix
Nixpkgs Mozilla
mozilla related nixpkgs (extends nixos/nixpkgs repo)
Stars: ✭ 288 (-7.1%)
Mutual labels:  nix

Funding button Buildkite build status

static-haskell-nix

With this repository you can easily build most Haskell programs into fully static Linux executables.

  • results are fully static executables (ldd says not a dynamic executable)
  • to make that possible, each exe and all dependencies (including ghc) are built against musl instead of glibc

static-haskell-nix can successfully build > 90% of Stackage executables, so chances are high it can build yours.

History

glibc encourages dynamic linking to the extent that correct functionality under static linking is somewhere between difficult and bug-ridden. For this reason, static linking, despite its many advantages (details here) has become less and less common.

Due to GHC's dependency on a libc, and many libraries depending on C libraries for which Linux distributions often do not include static library archive files, this situation has resulted in fully static Haskell programs being extremely hard to produce for the common Haskeller, even though the language is generally well-suited for static linking.

This project solves this.

It was inspired by a blog post by Vaibhav Sagar, and a comment by Will Dietz about musl.

Work on this so far was sponsored largely by my free time, FP Complete and their clients, and the contributors mentioned here.

By now we have a nixpkgs issue on Fully static Haskell executables (progress on which is currently this repo, with plans to later merge it into nixpkgs), and a merged nixpkgs overlay for static nixpkgs in general.

Funding

You can support this project financially on OpenCollective. Goals:

  • [x] Dedicated build server - Goal reached! Thanks to our awesome contributors!

    The first and main goal is to get to ~28 EUR/month to buy a cheap Hetzner dedicated build server for fast CI and pushing to Cachix. It will also allow anybody to download almost any executable on Stackage pre-built as a static binary, so that people can try out Haskell programs easily without having to install lots of dependencies.

    Because the server is so cheap, already 1 or 2 EUR/month will bring us to that goal quickly.

Hercules CI Logo The storage infrastructure (Cachix) for downloading pre-built packages is sponsored by the awesome guys from Hercules CI. They are building a nix-based CI service you can safely run on your own infrastructure. static-haskell-nix also uses it.
If your company or project needs that, check Hercules CI out!

Testing

We have multiple CIs:

  • HerculesCI: Builds with pinned nixpkgs. Publicly visible, but requires free sign-in. Click the most recent job to which 100s of binaries we build.
  • BuildKite:
    • Builds with pinned nixpkgs (submodule): Should always be green.
    • Builds with latest nixpkgs unstable, daily: Shows up as Scheduled build. May break when nixpkgs upstream changes.

Building a minimal example (don't use this in practice)

default.nix builds an example executable (originally from https://github.com/vaibhavsagar/experiments). Run:

NIX_PATH=nixpkgs=nixpkgs nix-build --no-link

This prints a path that contains the fully linked static executable in the bin subdirectory.

This example is so that you get the general idea. In practice, you probably want to use one of the approaches from the "Building arbitrary packages" or "Building stack projects" sections below.

Binary caches for faster building (optional)

Install cachix and run cachix use static-haskell-nix before your nix-build.

If you get a warning during cachix use, read this.

If you don't want to install cachix for some reason or cachix use doesn't work, you should also be able to manually set up your nix.conf (e.g. in $HOME/.config/nix/nix.conf; you may have to create the file) to have contents like this:

substituters = https://cache.nixos.org https://static-haskell-nix.cachix.org
trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= static-haskell-nix.cachix.org-1:Q17HawmAwaM1/BfIxaEDKAxwTOyRVhPG5Ji9K3+FvUU=

Note that you may not get cached results if you use a different nix version than I used to produce the cache (I used 2.0.4 as of writing, which you can get from here).

Building arbitrary packages

The survey directory maintains a select set of Haskell executables that are known and not known to work with this approach; contributions are welcome to grow the set of working executables. Run for example:

NIX_PATH=nixpkgs=nixpkgs nix-build --no-link survey/default.nix -A working

There are multiple package sets available in the survey (select via -A):

  • working -- build all exes known to be working
  • notWorking -- build all exes known to be not working (help welcome to make them work)
  • haskellPackages.somePackage -- build a specific package from our overridden package set

If you are a nix user, you can easily import this functionality and add an override to add your own packages.

Building stack projects

The static-stack2nix-builder-example directory shows how to build any stack-based project statically.

Until Stack 2.3, the official static build of stack itself was built using this method (Stack >= 2.3 static builds are built in an Alpine Docker image after GHC on Alpine started working again, see here). The static-stack directory shows how Stack itself can be built statically with static-haskell-nix. stack is a big package with many dependencies, demonstrating that it works also for large projects.

FAQ

  • I get cannot find section .dynamic. Is this an error?
    • No, this is an informational message printed by patchelf. If your final looks like
      ...
      cannot find section .dynamic
      /nix/store/dax3wjbjfrcwj6r3mafxj5fx6wcg5zbp-stack-2.3.0.1
      
      then /nix/store/dax3wjbjfrcwj6r3mafxj5fx6wcg5zbp-stack-2.3.0.1 is your final output store path whose /bin directory contains your static executable.
  • I get stack2nix: user error (No such package mypackage-1.2.3 in the cabal database. Did you run cabal update?).
    • You most likely have to bump the date like hackageSnapshot = "2019-05-08T00:00:00Z"; to a newer date (past the time that package-version was added to Hackage).
  • I get some other error. Can I just file an issue and have you help me with it?
    • Yes. If possible (especially if your project is open source), please push some code so that your issue can be easily reproduced.
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].