Skip to main content

Nix vs. Cabal Conditionals

I am almost ready to merge my PhatSort changes to the develop branch and push to GitHub. The only thing that does not work is the Nix configuration. The current configuration makes use of cabal2nix, which does not seem to work well with conditional compilation.

The package includes two conditionals. The library uses a conditional to only build a module on non-Windows platforms, as described in the FFI Sync blog entry.

if !os(windows)
  other-modules:
      PhatSort.Monad.Sync.Unistd

The test suite uses a conditional to only depend on HMock and build tests that use HMock when using GHC 8.6 or newer. This is required because I test PhatSort on older versions of GHC than are supported by HMock.

if impl(ghc >= 8.6.1)
  other-modules:
    PhatSort.Cmd.PhatSort.HMock
  build-depends:
    HMock

The package builds and all tests pass using all of the supported GHC versions when using Stack or Cabal, but Nix builds fail. It appears that the above conditionals are not being parsed (correctly). Searching for information about this problem, I found an OS conditionals and flags in general issue that links to some documentation titled “Map Cabal Files To Nix Without Information Loss” that confirms my suspicions.

The issue suggests using the callHackage function instead, but I am not sure how to use callHackage to do what I want. I unfortunately do not have time to really dig into the problem at this time, especially with the incredibly slow build times. I would like to move forward with PhatSort, so I am considering removing the Nix configuration from the project until I can find a way to make it work with conditional compilation.

Author

Travis Cardwell

Published

Tags