Subject: bug#52230: 'guild compile' and C(++) extensions (in the context of LilyPond)

From: Olivier Dion <[email-masked]>
Date: Sat, 19 Feb 2022 16:25:41 -0500

On Sat, 19 Feb 2022, Jean Abou Samra <[email-masked]> wrote:

I had similar problem with Jami.  I added C++ primitives to Guile, but
these were not load using the foreign function interface.  Note, I'm
using Guile 3.0.8, but I think the same could be done for Guile 2.0.

Basically what I do is to add a `compile` command to my program so to
speak.

So usually the program does this:
        main -> install_scheme_primitives() -> Run the program

And for compilation
        main -> compile_in_guile() -> install_scheme_primitives() -> compile-file

To be clear here's what install_scheme_primitives() does:
--------------------------------------------------------------------------------
void
install_scheme_primitives()
{
    /* Define modules here */
    auto load_module = [](auto name, auto init){
        scm_c_define_module(name, init, NULL);
    };

    load_module("jami account", install_account_primitives);
    load_module("jami call", install_call_primitives);
    load_module("jami conversation", install_conversation_primitives);
    load_module("jami logger bindings", install_logger_primitives);
    load_module("jami signal bindings", install_signal_primitives);
}
--------------------------------------------------------------------------------

and here's what compile_in_guile() does:
--------------------------------------------------------------------------------
void*
compile_in_guile(void* args_raw)
{
    // ...
    install_scheme_primitives();

    // This string is usually formatted
    scm_c_eval_string("(use-modules (system base compile))"
                      "(compile-file \"foo.scm\" #:output-file \"foo.go\")")

   // ..
}
--------------------------------------------------------------------------------

so now I can correctly compile any file in the project.  I just add this
to Makefile.am:
--------------------------------------------------------------------------------
MODULES  = foo.scm
GOBJECTS = $(MODULES:%=%.go)

%.go: %.scm | program
        @echo GUILD; ./program compile $< $@
--------------------------------------------------------------------------------

Hope that can help.

-- 
Olivier Dion
Polymtl