I'm trying to solve an algorithm puzzle in Haskell, and to do so I need quite a big data structure. However the problem solving site I submit my solution to, doesn't use any run time options to allow bigger stack, but I've heard that I can use compiler options as pragma. I've tried using following pragma in my code:
{-# OPTIONS_GHC -O2 -rtsopts -with-rtsopts=-K32m #-}
Then I compile with ghc --make algo.hs
. However, when I run on my machine on some big tests, program crashes with stack overflow, and reports that current stack size is 8MB. On the other hand, when I compile like that:
ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp
The program works just fine on the same data, without adding any +RTS
arguments. I use GHC 7.0.2, but the problem solving site is using 6.12.3, so preferably I'm looking for solution that could work with that old version too.
Remember that the compilation of almost any kind of native binary consists of at least two steps: Actual object compilation (.hs
-> .o
), and linking (.o
, .a
, .lib
-> executable/.exe
/.so
/.dll
etc)
When you compile with this:
ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp
... what's actually happening behind the scenes is basically:
# object compilation - creates algo.o
ghc -c algo.hs -fforce-recomp
# linking - links together algo.o and libHSsomepackage.a into the "algo" binary
# (we assume that `algo.hs` included some module from the package `somepackage`
# e.g. `Data.Package.Some`)
ghc -rtsopts -with-rtsopts=-K32M -o algo -package somepackage algo.o
I.e. the --make
option tells GHC to compile object files automatically before linking the result, and it fills in a ton of blanks for you. Take note of where the individual command-line flags end up.
When you specify that pragma at the top of the file, this is instead what happens (with ghc --make algo.hs
):
ghc -c algo.hs -rtsopts -with-rtsopts=-K32M
ghc -o algo -package somepackage algo.o
The OPTIONS_GHC
pragma tells the compiler about options to add when compiling that specific module into an object file. Because -rtsopts
is a linker option (it tells GHC to link in a different set of command-line handling stuff), you can't specify it when compiling an object file. You must specify it when linking, and such options cannot be specified in a module header.
There are two solutions:
.cabal
file what GHC options you wantIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With