[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 ;)