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.

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.