ezyang's blog

the arc of software bends towards understanding

2016/08

cabal new-build is a package manager

An old article I occasionally see cited today is Repeat after me: “Cabal is not a Package Manager”. Many of the complaints don’t apply to cabal-install 1.24’s new Nix-style local builds. Let’s set the record straight.

Fact: cabal new-build doesn’t handle non-Haskell dependenciesΒΆ

OK, so this is one thing that hasn’t changed since Ivan’s article. Unlike Stack, cabal new-build will not handle downloading and installing GHC for you, and like Stack, it won’t download and install system libraries or compiler toolchains: you have to do that yourself. This is definitely a case where you should lean on your system package manager to bootstrap a working installation of Cabal and GHC.

Read more...

Optimizing incremental compilation

When you run make to build software, you expect a build on software that has been previously built to take less time than software we are building from scratch. The reason for this is incremental compilation: by caching the intermediate results of ahead-of-time compilation, the only parts of a program that must be recompiled are those that depend on the changed portions of the dependency graph.

The term incremental compilation doesn’t say much about how the dependency graph is set up, which can lead to some confusion about the performance characteristics of “incremental compilers.” For example, the Wikipedia article on incremental compilation claims that incremental compilers cannot easily optimize the code that it compiles. This is wrong: it depends entirely on how your dependency graph is set up.

Read more...