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
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

Reply via email to