[racket] Using raco exe

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Sat Jun 12 08:53:17 EDT 2010

The problem may be that you are compiling the extension for CGC, but
you're linking and running for 3m. As a result, some local pointers in
the implementation of the extension are invisible to the GC.

Along those lines, my guess is that requiring `web-server/servlet'
changes the timing of a GC so that one occurs during the initialization
of the extension. Pointers then get lost in a way that drops the
instantiation of the extension-implemented module.

At Fri, 11 Jun 2010 14:43:40 +0100, Norman Gray wrote:
> 
> Greetings.
> 
> I'm having difficulty using raco to build a standalone executable which 
> requires both web-server/servlet and an extension.  The raco documentation 
> seems to suggest that I'm doing the right thing, but I'm getting an error I 
> can't really parse.  Can anyone help?
> 
> The players:
> 
>     A web server application (which we'll call) s.ss
>     And a librdf-extn_rkt.dylib C extension, installed in my user collections 
> path, required by s.ss.
>     Racket 5.0, and OS X 10.6
> 
> Things don't go as smoothly as I'd expect.  Viz:
> 
> % cat s.ss      
> #lang racket
> (require web-server/servlet)
> (require rdf/librdf-extn)  # provides librdf:new-world amongst various others
> (printf "server: world ~s~%" (librdf:new-world))
> % racket -v -t s.ss  # running it with racket works
> Welcome to Racket v5.0.
> server: world #<cpointer:librdf-world>
> % raco exe -o build/s s.ss
> % build/s  # ...but a standalone version doesn't
> link: reference (phase 0) to a variable in module 
> '#%embedded:g3708:librdf-extn that is uninitialized (phase level 0); reference 
> appears in module: '#%mzc:s in: librdf:new-world
> 
>  === context ===
> #%mzc:s: [running body]
> loop
> 
> % ls -l 
> ~/Library/Racket/5.0/collects/rdf/compiled/native/i386-macosx/3m/librdf-extn_rk
> t.dylib
> -rwxr-xr-x  1 norman  staff  97068 11 Jun 11:37 
> /Users/norman/Library/Racket/5.0/collects/rdf/compiled/native/i386-macosx/3m/li
> brdf-extn_rkt.dylib
> % 
> 
> Hmm: what is it you're telling me, racket dear?
> 
> The module librdf-extn is a C extension, providing an interface to an 
> underlying C library.  It works OK if I remove the (require 
> web-server/servlet).  Note that I don't call anything from web-server/servlet 
> -- it mere presence seems to be enough to sow untold confusion.
> 
> 
> Excerpts from the output of raco exe --vv -o build/s s.ss:
> 
> Copying to #<path:build/s>
> Getting #<path:/checkouts/me/projects/simbad-lod/src/s.rkt>
> Getting #<path:/Data/LocalApplications/Racket/Racket 
> v5.0/collects/racket/main.rkt>
> Getting #<path:/Data/LocalApplications/Racket/Racket 
> v5.0/collects/racket/base.rkt>
> [...]
> Getting #<path:/Data/LocalApplications/Racket/Racket 
> v5.0/collects/web-server/dispatch/coercion.rkt>
> Getting #<path:/Users/norman/Library/Racket/5.0/collects/rdf/librdf-extn.rkt>
>  using extension: 
> #<path:/Users/norman/Library/Racket/5.0/collects/rdf/compiled/native/i386-macos
> x/3m/librdf-extn_rkt.dylib>
> Getting #<path:/Data/LocalApplications/Racket/Racket 
> v5.0/collects/racket/runtime-config.rkt>
> Recording extension at 
> #<path:/Users/norman/Library/Racket/5.0/collects/rdf/compiled/native/i386-macos
> x/3m/librdf-extn_rkt.dylib>
> Writing module from #<path:/Data/LocalApplications/Racket/Racket 
> v5.0/collects/racket/private/stx.rkt>
> [...]
> Writing module from #<path:/Data/LocalApplications/Racket/Racket 
> v5.0/collects/web-server/servlet.rkt>
> Writing module from #<path:/checkouts/me/projects/simbad-lod/src/s.rkt>
> Writing module from #<path:/Data/LocalApplications/Racket/Racket 
> v5.0/collects/racket/runtime-config.rkt>
> Setting command line
> 
> 
> 
> The way that the extension is built is:
> 
> make install
> "/Data/LocalApplications/Racket/Racket v5.0/bin/raco" ctool --cc ++ccf -g 
> ++ccf -I/Data/tools/librdf-2010-01-20/32bit/include --cgc  librdf_bindings.c
> mv librdf_bindings.o build
> "/Data/LocalApplications/Racket/Racket v5.0/bin/raco" ctool ++ldf 
> -L/Data/tools/librdf-2010-01-20/32bit/lib ++ldf -lrdf --ld 
> build/compiled/native/i386-macosx/3m/librdf-extn_rkt.dylib  
> build/librdf_bindings.o
> cp -R build/compiled "/Users/norman/Library/Racket/5.0/collects"/rdf
> 
> 
> 
> 
> I'm afraid I'm stumped.  Can anyone suggest what I've missed?
> 
> Best wishes,
> 
> Norman
> 
> 
> -- 
> Norman Gray  :  http://nxg.me.uk
> 
> _________________________________________________
>   For list-related administrative tasks:
>   http://lists.racket-lang.org/listinfo/users


Posted on the users mailing list.