[arch-haskell] devtools version problem
Fabien Dubosson
fabien.dubosson at gmail.com
Thu Oct 31 16:49:27 UTC 2013
> Look at the generated PKGBUILD for a tool such as `cblrepo` and you'll
> see what I mean.
Hum, I looked again but they seem to use already `depends`. There is 233
packages in habs, and 218 have empty `makedepends`:
$ cd habs
$ cblrepo pkgbuild $(cblrepo build base|tail -n +2)
$ ls */PKGBUILD | wc -l
233
$ grep -R "makedepends=()" */PKGBUILD | wc -l
218
$ grep -R "makedepends=()" */PKGBUILD
haskell-abstract-deque/PKGBUILD:makedepends=()
haskell-abstract-par/PKGBUILD:makedepends=()
haskell-aeson/PKGBUILD:makedepends=()
haskell-anansi/PKGBUILD:makedepends=()
[[...]]
haskell-xmonad/PKGBUILD:makedepends=()
haskell-yaml/PKGBUILD:makedepends=()
haskell-zip-archive/PKGBUILD:makedepends=()
haskell-zlib/PKGBUILD:makedepends=()
> The default for GHC has always been to link statically, so that's
> where we started. Then we added building of shared libs at one point,
> but there was never any push to actually use them.
>
> After reading the page you point to above (in the GHC 7.6.3 docs) I'm
> also wondering what flags to give at build time to make an executable
> use dynamic libs. I had a look at pandoc, which is a package
> providing both a lib and an exe. It is configured with
> `--enable-shared` but the executable isn't dynamically linked against
> the libs it uses:
>
> % ldd /usr/bin/pandoc
> linux-vdso.so.1 (0x00007fffbbb93000)
> libz.so.1 => /usr/lib/libz.so.1 (0x00007f23e993a000)
> libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007f23e96d4000)
> libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f23e94d0000)
> libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f23e92b2000)
> libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f23e903b000)
> libm.so.6 => /usr/lib/libm.so.6 (0x00007f23e8d38000)
> librt.so.1 => /usr/lib/librt.so.1 (0x00007f23e8b30000)
> libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f23e891a000)
> libc.so.6 => /usr/lib/libc.so.6 (0x00007f23e856f000)
> /lib64/ld-linux-x86-64.so.2 (0x00007f23e9b50000)
The flag "--enable-shared" generates the shared libraries. The flag
"-dynamic" builds executable against these libraries. I managed to build
pandoc with shared libraries (and it worked, with a small hack, see problem
at the end of the message):
$ ldd /usr/bin/pandoc
linux-vdso.so.1 (0x00007fff819fe000)
libHSpandoc-1.12.1-ghc7.6.3.so => /usr/lib/ghc-7.6.3/shared/
libHSpandoc-1.12.1-ghc7.6.3.so (0x00007fd3929ec000)
libHSzip-archive-0.1.4-ghc7.6.3.so => /usr/lib/ghc-7.6.3/shared/
libHSzip-archive-0.1.4-ghc7.6.3.so (0x00007fd39279c000)
libHSzlib-0.5.4.1-ghc7.6.3.so => /usr/lib/ghc-7.6.3/shared/
libHSzlib-0.5.4.1-ghc7.6.3.so (0x00007fd392577000)
[[...]]
libHStransformers-0.3.0.0-ghc7.6.3.so => /usr/lib/ghc-7.6.3/shared/
libHStransformers-0.3.0.0-ghc7.6.3.so (0x00007fd3869d6000)
libHSinteger-gmp-0.5.0.0-ghc7.6.3.so => /usr/lib/ghc-7.6.3/shared/
libHSinteger-gmp-0.5.0.0-ghc7.6.3.so (0x00007fd3867c5000)
libHSmtl-2.1.2-ghc7.6.3.so => /usr/lib/ghc-7.6.3/site-local/mtl-2.1.2/
libHSmtl-2.1.2-ghc7.6.3.so (0x00007fd386598000)
librt.so.1 => /usr/lib/librt.so.1 (0x00007fd386390000)
libutil.so.1 => /usr/lib/libutil.so.1 (0x00007fd38618d000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fd385f89000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fd385d6b000)
libHSdeepseq-1.3.0.1-ghc7.6.3.so => /usr/lib/ghc-7.6.3/deepseq-1.3.0.1/
libHSdeepseq-1.3.0.1-ghc7.6.3.so (0x00007fd385b62000)
libHSarray-0.4.0.1-ghc7.6.3.so => /usr/lib/ghc-7.6.3/array-0.4.0.1/
libHSarray-0.4.0.1-ghc7.6.3.so (0x00007fd3858c1000)
libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fd38564a000)
libffi.so.6 => /usr/lib/libffi.so.6 (0x00007fd385442000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007fd38513f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd3937a3000)
I have modified cblrepo to add a flag "--dynamic" to the "pkgbuild" command
to generate a PKGBUILD with dynamic linking:
$ cblrepo pkgbuild --dynamic pandoc
See:
https://github.com/StreakyCobra/cblrepo/commit/677fe94c311c9e71f0ad99c1f7ee3ca93a02dff4
I'll propose that as a pull request when all will be working.
The current problem
-----------------------------
There is still a small problem: Referencing the shared libraries. As stated
at the bottom of [1], there is two ways:
1. By embedding a RPATH into the executable.
2. Using LD_LIBRARY_PATH (or equivalently and better /etc/ld.so.conf.d/*)
to specify libraries paths.
The first solution is system dependent, and also less elegant from my point
of view. So I focused on the second. Sadly the current hierarchy of Haskell
packages doesn't place all shared libraries in the same folder, but in
separate folders of the form:
/usr/lib/ghc-<version>/[site-local]/<package>-<version>/<sharedLibraryName>.so
It is unfeasible to reference all these folders (even more with the version
in the folder name).
So I actually just made a small hack: a "/usr/lib/ghc-7.6.3/shared" folder
and soft-links of all "*.so" inside. Then I added a new
"/etc/ld.so.conf.d/haskell.conf" file containing the line:
/usr/lib/ghc-7.6.3/shared
and run `ldconfig` to update the libraries paths.
Do you see any better way to reference these libraries?
If no I suggest to put (or link) all "*.so" libraries either in "/usr/lib"
or in another folder on a specific place on the system. It is also possible
to add, if it is needed, a "/etc/ld.so.conf.d/haskell.conf" file to a new
package like "haskell-runtime" and make all Haskell package depends on.
[1]
http://www.haskell.org/ghc/docs/7.6.3/html/users_guide/using-shared-libs.html
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/arch-haskell/attachments/20131031/4b8e7221/attachment.html>
More information about the arch-haskell
mailing list