help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: C Hello World Emacs module


From: Omar Polo
Subject: Re: C Hello World Emacs module
Date: Tue, 05 Oct 2021 13:26:21 +0200
User-agent: mu4e 1.6.6; emacs 28.0.50

Emanuel Berg via Users list for the GNU Emacs text editor 
<help-gnu-emacs@gnu.org> writes:

> Omar Polo wrote:
>
>>> Is there a minimal working example, in the LaTeX lingo, for
>>> C modules in Emacs?
>>
>> Other than in the manual, I've found this article by skeeto
>> to be really helpful in understanding how modules works:
>>
>> https://nullprogram.com/blog/2016/11/05/
>>
>> The first bit of code is how to call `message' with "Hello,
>> world!" as argument.
>
> OK, thanks, that one step closer, there's this
>
>   #include "emacs-module.h"
>
>   int plugin_is_GPL_compatible;
>
>   int emacs_module_init(struct emacs_runtime *ert) {
>     emacs_env *env = ert->get_environment(ert);
>     emacs_value message = env->intern(env, "message");
>     const char hi[] = "Hello, world!";
>     emacs_value string = env->make_string(env, hi, sizeof(hi) - 1);
>     env->funcall(env, message, 1, &string);
>     return 0;
>   }
>
>   In a real module, it’s common to create function objects for
>   native functions, then fetch the fset symbol and make a Lisp
>   call on it to bind the newly-created function object to
>   a name. You’ll see this in action later.
>
> But still missing is the command(s) and options to compile and
> instructions how to make it visible from Emacs ...
>
> Also I'd like to have the example as it would look "[i]n
> a real module" ... so it shouldn't just be a MWE, it should be
> a MCAWE (Minimal Correct and Applicable Working Example)
>
> :)

There's a Makefile linked in the article, which even if it has a .POSIX
target is just a GNU Makefile, but anyway.

https://github.com/skeeto/joymacs/blob/master/Makefile

Assuming you're on some UNIX flavors, you need to create a shared
library.  This means that you need to compile every object file with
-fPIC and then bundle 'em together with something like

        cc -shared -fPIC -o your-module.so obj1.o obj2.o obj3.o ...

(where obj1.o, obj2.o etc are your compiled C files, for e.g.
        cc -fPIC -c obj1.c -o obj1.o
)

To load it, IIRC is mentioned in the manual, you just drop the .so file
inside `load-path' and `require' it like it were a .el/.elc file.

How structure it heavily depends on what you want to do.  Usually one
wants to export some functions from C to elisp, but you may want to do
something else.

In the linked article the first snippet (the one you quoted) shows how
to translate (message "Hello, world!") in a C module, later examples
shows how to make functions callable from elisp.

Another example is emacs-libpq, the bindings for the postgresql
library.  It is of course CAWE (correct and applicable working example),
don't know if I would consider it minimal thought.

https://github.com/anse1/emacs-libpq/blob/master/pq-core.c#L354

They define a handy DEFUN macro to prettify the process of registering
functions.

In the end, how to do it heavily depends how what you want to do ;)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]