unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
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 ;)



  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).