Building with runtime flags using cabal and ghc
Asked Answered
O

2

35

I have a program written in Haskell and intended to be compiled with GHC. The program scales very well on multiple cores, so enabling multithreading is very important. In my .cabal file I've added ghc-options: -O3 -threaded to link with the threaded runtime. The problem is that with this approach the user would need to run the program with foo +RTS -N, which seems a bit cryptic and not very user friendly.

How can I tell cabal/ghc to enable those runtime flags invisibly to the user? I've read about --with-rtsopts, but GHC (7.0.3) just spits out unrecognized flag when I try to use it.

Onehorse answered 28/6, 2011 at 11:24 Comment(0)
K
35

The flag is -with-rtsopts, not --with-rtsopts, so you should add -with-rtsopts=-N to the ghc-options field. GHC Flag Reference.

Note that this will also require you to link with runtime support by adding -rtsopts to the ghc-options.

Krissie answered 28/6, 2011 at 14:15 Comment(5)
Thank you, this helped me! I also tried enabling the -g1 flag with -with-rtsopts="-N -g1" but then I get unrecognized flag: -g1. Both -N and -g1 work fine separately.Onehorse
@Viktor Dahl: I think the quotes are causing the problem. Try either using single quotes, or multiple -with-rtsopts lines. If that solves it, it's probably a ghc bug (or documentation error).Krissie
Single quotes didn't solve it, but using two -with-rtsopts did.Onehorse
Looks like a cabal bug: If you write -with-rtsopts="-flagA -flagB" it calls GHC with '-with-rtspots="-flagA' '-flagB"', simply putting single quotes in at every space.Slicer
@Viktor Dahl: It turns out we just used the wrong syntax. You have to write "-with-rtsopts=-N -g1", with the quotes on the very outside. This is the related discurrion on Github.Slicer
B
2

If you happen to use hpack to generate foo.cabal from package.yaml, this is the YAML syntax to use:

executables:
  foobar:
    main: Main.hs
    source-dirs: app
    ghc-options:
      - -threaded
      - -rtsopts
      - '"-with-rtsopts=-N -T"'
      - -Wall

    dependencies:
      […]

The string "-with-rtsopts=-N␣-T" should become one single argv item of the eventual ghc process.

Since YAML has quoted string literals too — both layers of escaping are necessary.

Boettcher answered 4/1, 2022 at 11:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.