I've just come across a subtle build issue (as haskell-platform just got updated, I thought I might give it a try) The scenario is

  • OSX 10.7 (everything is up to date with xcode etc... the usual)
  • The 32bit version of Haskell Platform 2012.2

The issue is when libdiskfree.c is compiled and linked to git-annex, OSX defaults to a 64bit binary, thus...

    Linking git-annex ...
    ld: warning: ignoring file Utility/libdiskfree.o, file was built for unsupported file format which is not the architecture being linked (i386)
    Undefined symbols for architecture i386:
      "_diskfree", referenced from:
          _UtilityziDiskFree_zdwa_info in DiskFree.o
    ld: symbol(s) not found for architecture i386
    collect2: ld returned 1 exit status
    make: *** [git-annex] Error 1

You can either compile up the c library in a 32bit mode if you have the 32bit version of Haskell Platform installed as in the following example

    laplace:git-annex jtang$ cc  -m32  -c -o Utility/libdiskfree.o Utility/libdiskfree.c
    Utility/libdiskfree.c: In function ‘diskfree’:
    Utility/libdiskfree.c:61: warning: ‘statfs64’ is deprecated (declared at /usr/include/sys/mount.h:379)
    laplace:git-annex jtang$ make
    ghc -O2 -Wall -ignore-package monads-fd -outputdir tmp -IUtility -DWITH_S3 --make git-annex Utility/libdiskfree.o

    Utility/Touch.hs:1:12:
        Warning: -#include and INCLUDE pragmas are deprecated: They no longer have any effect

    Utility/Touch.hs:2:12:
        Warning: -#include and INCLUDE pragmas are deprecated: They no longer have any effect

    Utility/Touch.hs:3:12:
        Warning: -#include and INCLUDE pragmas are deprecated: They no longer have any effect

    Utility/Touch.hs:4:12:
        Warning: -#include and INCLUDE pragmas are deprecated: They no longer have any effect
    Linking git-annex ...

Or else just install the 64bit haskell platform. I'm not too sure where you would but the intelligence to detect 32 or 64 outputs from the different compilers. I suspect checking what ghc outputs then putting in the appropriate -m32 or -m64 for the c compiler is the right thing to do. Or just telling users to use the 64bit version of the haskell platform? It may also be possible to get osx's c compiler to output a universal binary to give you everything, but that be going down the being too platform specific route.

done, it'll detect this and force -m32. --Joey

Seems you built it using make .. could you try instead building with cabal, ie run cabal install git-annex or cabal build in the source tree. I think cabal will probably do the right thing.

I could fix the Makefile, I suppose. What does this say: `ghc -e 'print System.Info.arch'

Comment by http://joeyh.name/ Mon Jun 4 20:02:23 2012

FYI, (the follow is on OSX 10.7 on two different machines)

On my 64bit install of haskell platform...

laplace:~ jtang$ ghc -e 'print System.Info.arch'
"x86_64"

On my 32bit install of haskell platform...

 x00:git-annex jtang$ ghc -e 'print System.Info.arch'
"i386"

Running cabal build or cabal install git-annex as you suggest with the 32bit install does do the right thing.

Comments on this page are closed.