From: Omar Polo <op@omarpolo.com>
To: Emanuel Berg <moasenwood@zoho.eu>
Cc: help-gnu-emacs@gnu.org
Subject: Re: C Hello World Emacs module
Date: Tue, 05 Oct 2021 13:26:21 +0200 [thread overview]
Message-ID: <87lf373dq3.fsf@omarpolo.com> (raw)
In-Reply-To: <871r4z204q.fsf@zoho.eu>
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 ;)
next prev parent reply other threads:[~2021-10-05 11:26 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-05 10:07 C Hello World Emacs module Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-05 10:37 ` Omar Polo
2021-10-05 11:15 ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-05 11:26 ` Omar Polo [this message]
2021-10-05 11:47 ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-10-06 7:35 ` Christian Barthel
2021-11-06 13:05 ` Emanuel Berg via Users list for the GNU Emacs text editor
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87lf373dq3.fsf@omarpolo.com \
--to=op@omarpolo.com \
--cc=help-gnu-emacs@gnu.org \
--cc=moasenwood@zoho.eu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).