[MacRuby-devel] A path to linking rbo files into one executable in Xcode
Laurent Sansonetti
lsansonetti at apple.com
Fri Nov 27 12:11:20 PST 2009
Hi Dylan,
Sorry for the late response.
On Nov 25, 2009, at 10:21 AM, Dylan Bruzenak wrote:
> Hi all,
>
> First, great work with the 0.5b2 release. I'm starting to use this
> for more serious development and it does most of the things I need
> very well. After a brief struggle last night I managed to get the
> code for one of my projects compiling using the new macruby_deploy
> method and it works like a charm.
>
> However, I would like to include the .rbo files in the same
> executable inside the .app bundle as my objc files, rather than as
> separate files in the resources directory.
>
> To that end I defined a build rule that picks up .rb files and uses
> macrubyc to compile them. I moved the .rb files into the 'compile
> sources' build step, which causes the output .o files to be included
> in the excutable.
>
> I then ran into an obvious snag: the ruby environment isn't
> intialized and the classes are not being pulled in. After some
> investigation of the rubyc file I can see that you're creating a
> custom .mm file that calls a number of set up methods for the
> runtime and an MREP_UUID function for each class. A few questions:
>
> 1.) Is there a way that I can find these MREP function names and
> call them dynamically ? I was considering modifying the generator to
> output a .m file with a class that just has an init method that
> calls these, but it isn't compatible with the build rule approach
> above.
You can use the nm(1) tool against every .o file to locate the MREP_
symbol name.
> 2.) Is there an easier way to set up this environment than the code
> below ?
>
> ruby_sysinit(&argc, &argv);
> if (argc > 0) {
> argc--;
> argv++;
> }
>
> ruby_init();
> ruby_set_argv(argc, argv);
> rb_vm_init_compiler();
> try {
> void *self = rb_vm_top_self();
> //MREP FUNCTION CALLS GO HERE :)
> }
> catch (...) {
> rb_vm_print_current_exception();
> rb_exit(1);
> }
> rb_exit(0);
>
> 3.) Am I nuts ? If there's a much easier way to do this, please let
> me know :)
You're not nuts :) Having the ability to compile all the source code
of an application into the same executable is something we definitely
want to feature. Your approach should work but I would like to offer a
solution that doesn't require any change in MacRuby or the application
code. I also want a solution that works on non-Xcode projects (command-
line tools).
Basically, my plan is to add a global table in MacRuby core that would
be filled by macrubyc once you produce an executable based on .o Ruby
files. The table would be a simple "Ruby file path" to "MREP_ function
name" mapping. Then, at runtime, #require would look into that table
and appropriately run the initializers.
I haven't had the time to implement this idea yet. I may do it for the
final 0.5. Hopefully this can be done in macruby_deploy. Any help
would be greatly appreciated :)
Laurent
More information about the MacRuby-devel
mailing list