[Unison-hackers] Compiling under Mac OS X

Jerome Vouillon Jerome.Vouillon at pps.jussieu.fr
Tue Jul 21 07:39:49 EDT 2009


First thing, I think you can remove the dependency on unison-blob.o
from target macexecutable in Makefile.OCaml.  At the moment, the Caml
files are compiled twice!  Replace the line:

        macexecutable: $(NAME)-blob.o

by just

        macexecutable:

Then, the patch had zero chance of working: the problem seems to
happen at an earlier stage, when the Caml code is linked, not when the
GUI is built.  Can you try this, then:

        > make clean
        > export ZERO_LINK=NO
        > make

If this still does not work, we have to investigate a bit more.  The
compilation process fails at the final step when linking everything
together.  The reason is that the two symbols below are not found:

> Undefined symbols:
>    "_caml_apply2", referenced from:
>        _caml_callback2_exn in libasmrun.a(i386.o)
>    "_caml_apply3", referenced from:
>        _caml_callback3_exn in libasmrun.a(i386.o)

These symbols should come from file unison-blob.o .  You can check
they are indeed defined there with the following command:

        > nm unison-blob.o | grep caml_apply2
        0000000000005000 T caml_apply2
        0000000000003ef0 T caml_apply21
        0000000000003b70 T caml_apply23
        00000000000037c0 T caml_apply24

If the symbols are not defined, we need to find out at which point
they disappear.  You need to change this rule:

        $(NAME)-blob.o: $(CAMLOBJS) $(COBJS)
                @echo Linking $@
                $(CAMLC) -output-obj -verbose $(CAMLFLAGS) ...
                $(LD) -r -o $@ u-b.o $(COBJS)
                $(RM) u-b.o

into:

        $(NAME)-blob.o: $(CAMLOBJS) $(COBJS)
                @echo Linking $@
                $(CAMLC) -dstartup -output-obj -verbose $(CAMLFLAGS) ...
                $(LD) -r -o $@ u-b.o $(COBJS)

(Add a "-dstartup" option to ocamlopt and remove the "rm" command.)

Then, if you recompile, you should get two files u-b.o.startup.s and
u-b.o in the build directory.  Then, again, you can use "nm u-b.o" to
find out whether caml_apply2 is defined in u-b.o.  In the assembly
file, there should be some lines that look like this:

        [...]
                .text
                .align  16
                .globl  caml_apply2
        caml_apply2:
                subq    $8, %rsp
        [...]

Tell me the last point where you could find caml_apply2 defined (the
corresponding output could be useful too).

Now, if the symbols are actually defined in unison-blob.o, this may be
a problem with the order in which the files are given to gcc for
linking.  So, in the following command (that should be a single line),
you can try to move unison-blob.o before -lasmrun.  (Under Linux, I
have to put it before all the -lxxx, but this may different under
Mac OS X.)

>      /Developer/usr/bin/gcc-4.0 -arch i386 -isysroot /Developer/SDKs/ 
> MacOSX10.5.sdk -L/Users/bcpierce/current/unison/trunk/src/uimacnew/ 
> build/Default -F/Users/bcpierce/current/unison/trunk/src/uimacnew/ 
> build/Default -F/Users/bcpierce/current/unison/trunk/src/uimacnew - 
> filelist /Users/bcpierce/current/unison/trunk/src/uimacnew/build/ 
> uimacnew.build/Default/uimac.build/Objects-normal/i386/ 
> Unison.LinkFileList -mmacosx-version-min=10.5 -L/usr/local/lib/ocaml - 
> lunix -lthreadsnat -lstr -lbigarray -lasmrun -framework Cocoa - 
> framework Security -framework Growl -framework ExceptionHandling / 
> Users/bcpierce/current/unison/trunk/src/uimacnew/../unison-blob.o -o / 
> Users/bcpierce/current/unison/trunk/src/uimacnew/build/Default/ 
> Unison.app/Contents/MacOS/Unison

-- Jerome


More information about the Unison-hackers mailing list