Subject: Re: [bug#46231] Add emilua

From: Vinícius dos Santos Oliveira <[email-masked]>
Date: Thu, 25 Feb 2021 11:11:22 -0300

Em qua., 24 de fev. de 2021 às 12:49, Nicolas Goaziou
<[email-masked]> escreveu:
> > I'll let you do the update then.
> Done.

Thanks.

> I applied the patch. We can now proceed with emilua.

You may find the updated patch (using git format) attached in this email.

Btw, if you don't mind, I'd like to use the space to also make a few
questions guix-related. Emilua is a software similar to NodeJS, but it
doesn't have its own npm, pip, gem, or anything alike. I'd like to use
guix as the package manager in emilua. I don't want to create another
npm. Therefore all the code I'm writing for the emilua's next version
was done with guix in mind.

I've learned about native-search-paths and how it can be used to fill
environment variables such as GST_PLUGIN_PATH. I've learned about the
approach to "merge" directories from each package to fill the guix
environment/profile and how crucial it is for such environment
variables to guide the software running inside it (e.g. python and
PYTHONPATH). That's pretty much solved for me (unless there are other
approaches in guix that I'm missing and they would fit better).

Next step for me is to better understand what's the proper take when
dealing with GStreamer native-search-paths and pkg-config. I'm talking
about GStreamer here because it faces a similar problem and I believe
it's easier to talk on issues from existing and packaged software.

GStreamer defines native-search-paths to
GST_PLUGIN_SYSTEM_PATH=lib/gstreamer-1.0. As far as I tested, if a
package gstreamer-foobar depends on gstreamer and install files to
${prefix}/lib/gstreamer-1.0, then GST_PLUGIN_SYSTEM_PATH will be
automatically updated to also contain gstreamer-foobar's
/gnu/store/*/lib/gstreamer-1.0.

My question here is: how should the software packaged in
gstreamer-foobar find out the proper directory to install its plugins?
Should it be ${prefix}/lib/gstreamer-1.0? Should it be
${prefix}/lib/gstreamer-1.1? That's something that shouldn't be
hardcoded. As far as I see, it can just use the pluginsdir from
GStreamer's pkg-config definition. Like so:

$ pkg-config --variable=pluginsdir gstreamer-1.0

However this command will print the wrong dir in guix. It'll print
something like:

/gnu/store/9if71w58d5mkxfxyc7fpz289qssnkqsv-gstreamer-1.18.2/lib/gstreamer-1.0

But that's the "namespace" for the gstreamer package, not for the
gstreamer-foobar package. A solution would be to invoke pkg-config as
follows:

$ pkg-config --define-variable="prefix=${prefix}"
--variable=pluginsdir gstreamer-1.0

This will actually print the proper ${prefix}/lib/gstreamer-1.0. But
that's my question here. How should pkg-config be invoked properly? I
could just as well invoke it as:

$ pkg-config --define-variable="prefix=${prefix}"
--define-variable=libdir='${prefix}/lib' --variable=pluginsdir
gstreamer-1.0

-- 
Vinícius dos Santos Oliveira
https://vinipsmaker.github.io/
From 10c04b9b70886b14377c8a80165978601c8617ce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vin=C3=ADcius=20dos=20Santos=20Oliveira?=
 <[email-masked]>
Date: Thu, 25 Feb 2021 10:22:20 -0300
Subject: [PATCH] Add emilua

---
 gnu/packages/lua.scm | 60 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/gnu/packages/lua.scm b/gnu/packages/lua.scm
index c03eea3c70..b98427cbde 100644
--- a/gnu/packages/lua.scm
+++ b/gnu/packages/lua.scm
@@ -37,8 +37,11 @@
   #:use-module (guix utils)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system cmake)
+  #:use-module (guix build-system meson)
   #:use-module (guix build-system trivial)
   #:use-module (gnu packages)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages build-tools)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages m4)
   #:use-module (gnu packages tls)
@@ -47,6 +50,11 @@
   #:use-module (gnu packages libevent)
   #:use-module (gnu packages libffi)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages boost)
+  #:use-module (gnu packages tls)
+  #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages vim)
+  #:use-module (gnu packages re2c)
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages gtk))
 
@@ -1151,3 +1159,55 @@ shell command executions.")
 simplicity, and reach of Lua with the flexibility of a Lisp syntax and macro
 system.")
     (license license:expat)))
+
+(define-public emilua
+  (package
+   (name "emilua")
+   (version "0.2.1")
+   (source (origin
+            (method git-fetch)
+            (uri (git-reference
+                  (url "https://gitlab.com/emilua/emilua.git")
+                  (commit (string-append "v" version))
+                  ; Current version requires bundled CLI11 and fmt, but at some
+                  ; future release the ones found in the system could be used
+                  ; instead. Current version also requires Trial.Protocol and
+                  ; the HTTP lib developed as part of GSoC 2014 for Boost, but
+                  ; these are dependencies unlikely to be "unbundled" in future
+                  ; releases.
+                  (recursive? #t)))
+            (sha256
+             (base32
+              "1d6k5v6x85fbvz2ijq1imnfdwvqmsav4xp021a5v3ah4mgy7yann"))))
+   (build-system meson-build-system)
+   (arguments
+    `(#:meson ,meson-0.55
+      ; Tests are disabled for now due to an issue that affecs guix:
+      ; <https://gitlab.com/emilua/emilua/-/issues/22>
+      #:configure-flags '("-Denable_http=false" "-Denable_tests=false")))
+   (inputs
+    `(("boost" ,boost)
+      ("boost-static" ,boost-static)
+      ; LuaJIT has a 2GiB addressing limit[1] that has been fixed on OpenResty
+      ; fork. Emilua is severely affected by this limit, so the upstream package
+      ; is avoided. Emilua also depends on the -DLUAJIT_ENABLE_LUA52COMPAT
+      ; configure flag[2] for some features to work (e.g. __pairs on HTTP
+      ; headers).
+      ;
+      ; [1] <http://hacksoflife.blogspot.com/2012/12/integrating-luajit-with-x-plane-64-bit.html>
+      ; [2] <http://luajit.org/extensions.html#lua52>
+      ("luajit-lua52-openresty" ,luajit-lua52-openresty)
+      ("openssl" ,openssl)
+      ("ncurses" ,ncurses)))
+   (native-inputs
+    `(("pkg-config" ,pkg-config)
+      ("gcc" ,gcc-10) ; gcc-7 is too old for our C++17 needs
+      ("luajit-lua52-openresty" ,luajit-lua52-openresty)
+      ("xxd" ,xxd)
+      ("re2c" ,re2c)))
+   (synopsis "Lua execution engine")
+   (description
+    "A LuaJIT-based Lua execution engine that supports async IO, fibers and
+actor-inspired threading. The experimental builtin HTTP module is enabled.")
+   (home-page "https://gitlab.com/emilua/emilua")
+   (license license:boost1.0)))
-- 
2.30.1