[Haskell-cafe] Ghc / cgi static linking
Don Stewart
dons at galois.com
Sun Jun 1 18:26:00 EDT 2008
pieter:
> Hello,
>
> I'm researching the use of Haskell to replace some perl scripts (in a web app).
> The app is deployed with a webhosting provider.
>
> CGI scripts can be executed => I can use Haskell. I've tried some
> hello world cgi scripts, compiled them on the same linux
> the hosting company uses and deployed them. It worked!
>
> But I would like to implement a search feature for the website. For
> Java/php/perl there 's lucene.
> For haskell there 's holumbus. Unfortunately, sqlite is a requirement
> for holumbus. It is not installed at the server of the
> hosting company.
>
> Is it possible to staticly link the sqlite3 library using ghc ?
Yes, it is entirely possible to statically link entire CGI apps.
For example, this simple program,
import Database.SQLite
main = print "hey, test this"
when compiled as $ ghc A.hs --make is dynamically linked against:
$ ldd A
A:
Start End Type Open Ref GrpRef Name
0000000000000000 0000000000000000 exe 1 0 0 A
0000000041a85000 0000000041ee5000 rlib 0 1 0 /usr/local/lib/libsqlite3.so.9.0
0000000049b04000 0000000049f1d000 rlib 0 1 0 /usr/lib/libm.so.2.3
0000000042213000 000000004264f000 rlib 0 1 0 /usr/local/lib/libgmp.so.7.0
0000000047d0e000 00000000481e0000 rlib 0 1 0 /usr/lib/libc.so.42.0
0000000047900000 0000000047900000 rtld 0 1 0 /usr/libexec/ld.so
Now, we can just pass some linker flags through to statically link this lot,
$ ghc A.hs --make -optl-static -no-recomp
$ ldd A
ldd: A: not a dynamic executable
$ file A
A: ELF 64-bit LSB executable, AMD64, version 1, for OpenBSD, statically linked, not stripped
I've added this information to the web programming FAQ,
haskell.org/haskellwiki/Practical_web_programming_in_Haskell#Deploying_statically_linked_applications
Note it also works for fastcgi, which when combined with Haskell's lightweight
threads, makes a good option for performance-oriented web apps.
-- Don
More information about the Haskell-Cafe
mailing list