diff mbox series

[bug#44191] gnu: Add kristall

Message ID 87o8knn6rm.fsf@guixSD.i-did-not-set--mail-host-address--so-tickle-me
State Accepted
Headers show
Series [bug#44191] gnu: Add kristall | expand

Checks

Context Check Description
cbaines/issue success View issue
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch fail View Laminar job

Commit Message

Nicolò Balzarotti Oct. 27, 2020, 1:22 p.m. UTC
Hi!
The PR has been merged (so now I can link to cmark just fine).

Find attached the new patches.

I'm unsure about BreezeStyleSheets, as the install instructions
specifically say:

#+begin_quote
Copy breeze.qrc, dark.qss, light.qss and the dark and light folders into
your project directory and add the qrc file to your project file.
#+end_quote


Note on fonts: I'm using pre-built ttf as I'm not able to build them
(lot of javascript required)


Let me know!
Nicolò
Nicolò Balzarotti <anothersms@gmail.com> writes:

> Just linking to it would be easier.  However, the file markdownrenderer
> requires access to implementation details of the struct cmark_node
> (it includes the file node.h, which is not installed by cmark, and fails
> with: ../src/renderers/markdownrenderer.cpp:83:23: error: invalid use of incomplete type ‘const cmark_node {aka const struct cmark_node}’)
>
> I replaced references such as `node.as.heading.level` to
> `cmark_node_get_heading_level(node)` and so on.  I could compile it (by
> also adding -I/gnu/store and -lcmark to the build process), and markdown
> seems to be working (tested here
> gemini://tilde.team/~supernova/blog/this-is-a-test-of-using-markdown.md).
>
> I'm going to send a patch to the author, linking to this mail exchange.
>
> I'll let you know.
>
> Christopher Baines <mail@cbaines.net> writes:
>
>> Nicolò Balzarotti <anothersms@gmail.com> writes:
>>
>>> Hi Chris!
>>>
>>> Thanks for the review.
>>>
>>> I tried, but:
>>> 1. breeze is a different package from the ones in the repo (url is
>>> https://github.com/Alexhuszagh/BreezeStyleSheets).  It does not seems to
>>> be compiled, I can try to package it.
>>> 2. there are files in lib/cmark that are not present in the cmark
>>> distribution (thei are .h files generated by their .h.in), so I cannot
>>> extract our cmark source directly
>>>    - I tried keeping those files, but build fails [[failed-build]].  Not sure if it's
>>>    a patched version or if it's an older one.  But I can investigate
>>>    probably
>>
>> I think you might be overcomplicating this. kristall shouldn't be trying
>> to build cmark, as it's a library, it should just be linking against
>> it. Therefore, you shouldn't need to keep the .h.in files.
>>
>> Making kristall use cmark, rather than the copy in the kristall source
>> probably requires adapting/fixing src/kristall.pro.
>>
>> It hopefully isn't that difficult, but I don't know what this .pro file
>> is, it also looks pretty odd in parts, especially the references to
>> /home/felix/... !
>>
>> It doesn't look like the copy of cmark in the kristall source has been
>> modified much, which also raises the question of why there is a copy of
>> the cmark source inside kristall?

Comments

Christopher Baines Oct. 31, 2020, 8:26 p.m. UTC | #1
Nicolò Balzarotti <anothersms@gmail.com> writes:

> The PR has been merged (so now I can link to cmark just fine).

Great, that's good news :)

> Find attached the new patches.

I've gone ahead and pushed the font-openmoji package. I tweaked the
synopsis and description a bit to try and make them more objective, and
removed the comment about building the font, as that could (hopefully)
get out of date.

> I'm unsure about BreezeStyleSheets, as the install instructions
> specifically say:
>
> #+begin_quote
> Copy breeze.qrc, dark.qss, light.qss and the dark and light folders into
> your project directory and add the qrc file to your project file.
> #+end_quote

Given this is a stylesheet, rather than cmark, I don't think it's a
blocker, although I do think it would be neater to have a package for
it.

I've made some more comments below, and I wanted to enquire about
exactly how the fonts are used, but I think this is pretty much ready to
merge.


+(define-public kristall
+  ;; Fixes to the build system applied after the latest tag
+  ;; Use tagged release when updating
+  (let ((commit "b684f94f1af9a19c1a6fd70d72097a13b75e1ca6")
+        (revision "1"))
+    (package
+      (name "kristall")
+      (version (string-append "0.3-" revision "." (string-take commit 7)))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/MasterQ32/kristall")
+               (commit "bf5b2ecd0fde117d550adeadee48d74034ed2cdb")))

You can use the commit here, so (commit commit)))

+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1zakhxr30n7dawig7c8mizaqxwnqn3a7pz0yi7hc55nn7n7iyr6l"))
+         (modules '((guix build utils)))
+         (snippet
+          '(begin
+             ;; Remove bundled programs.
+             (with-directory-excursion "lib"
+               ;; Delete extra (bundled) files
+               (map (lambda (dir) (delete-file-recursively dir))
+                    ;; "BreezeStyleSheets"
+                    '("cmark")))
+             ;; Contains executable of 7z and pscp
+             (delete-file-recursively "ci/tools")
+             ;; Remove bundled fonts
+             (delete-file-recursively "src/fonts")
+             #t)))

I'd rework this so that rather than saying what's deleted, it says
what's kept, as that's the important thing. So something like:

         (modules '((srfi srfi-1)
                    (ice-9 ftw)
                    (guix build utils)))
         (snippet
          '(let ((preserved-lib-files
                  '("BreezeStyleSheets"
                    "luis-l-gist")))
             (with-directory-excursion "lib"
               (for-each
                (lambda (directory)
                  (simple-format #t "deleting: ~A\n" directory)
                  (delete-file-recursively directory))
                (lset-difference string=?
                                 (scandir ".")
                                 (cons* "." ".." preserved-lib-files))))
             ;; Contains executable of 7z and pscp
             (delete-file-recursively "ci/tools")
             ;; Remove bundled fonts
             (delete-file-recursively "src/fonts")
             #t))))

+      (build-system gnu-build-system)
+      (arguments
+       `(#:modules ((guix build gnu-build-system)
+                    (guix build qt-utils)
+                    (guix build utils))
+         #:imported-modules (,@%gnu-build-system-modules
+                             (guix build qt-utils))
+         #:make-flags
+         (list (string-append "PREFIX=" %output))
+         #:phases
+         (modify-phases %standard-phases
+           (delete 'configure)          ; no ./configure script
+           (delete 'check)              ; no check target
+           (add-before 'build 'set-program-version
+             ;; runs git describe --tags by default

This comment above is probably unnecessary, the one below is better.

+             (lambda _
+               ;; configure.ac relies on ‘git --describe’ to get the version.
+               ;; Patch it to just return the real version number directly.
+               (substitute* "src/kristall.pro"
+                 (("(KRISTALL_VERSION=).*" _ match)
+                  (string-append match ,version "\n")))))

I think it's still practice to have #t at the end of phases, so I'd add
that in here.

+           (add-before 'build 'replace-bundled-cmark

This doesn't really replace the bundled cmark, it's stripped out by the
source snippet. I'd say something like dont-use-bundled-cmark.

+             (lambda _
+               (substitute* "src/kristall.pro"
+                 (("(^include\\(.*cmark.*)" _ match)
+                  (string-append
+                   "LIBS += -I" (assoc-ref %build-inputs "cmark") " -lcmark")))
+               (substitute* "src/renderers/markdownrenderer.cpp"
+                 (("(include.*node.*)" _ match)
+                  (string-append "// " match)))))

As above with #t at the end.

+           (add-before 'build 'replace-bundled-fonts
+             (lambda _
+               (let ((noto (assoc-ref %build-inputs "font-google-noto"))
+                     (openmoji (assoc-ref %build-inputs "font-openmoji"))
+                     (srcdir "/share/fonts/truetype/")
+                     (outdir "src/fonts/"))
+                 (mkdir-p outdir)
+                 (copy-file
+                  (string-append noto srcdir "NotoColorEmoji.ttf")
+                  (string-append outdir "NotoColorEmoji.ttf"))
+                 (copy-file
+                  (string-append openmoji srcdir "OpenMoji-Color.ttf")
+                  (string-append outdir "OpenMoji-Color.ttf")))
+               #t))

I'd maybe use symlink rather than copy file, since you want the fonts to
be used from the respective packages in the store, however, is this just
to satisfy the build system? It looks to me like the XDG_DATA_DIRS
wrapping is probably what'll make the fonts work at runtime (if
anything)?

+           (add-after 'install 'wrap-program
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let ((out (assoc-ref outputs "out")))
+                 (wrap-qt-program out "kristall"))
+               #t)))))
+      (inputs
+       `(("cmark" ,cmark)
+         ("font-google-noto" ,font-google-noto)
+         ("font-openmoji" ,font-openmoji)
+         ("openssl" ,openssl)
+         ("qtbase" ,qtbase)
+         ("qtmultimedia" ,qtmultimedia)
+         ("qtsvg" ,qtsvg)))
+      (home-page "https://github.com/MasterQ32/kristall")
+      (synopsis "Small-internet graphical client")
+      (description "Graphical small-internet client with with many features
+including multi-protocol support (gemini, http, https, gopher, finger),
+bookmarks, TSL certificates management, outline generation, tabbed interface
+and more.")

I think this is good, but I'd change the end to "outline generation and
tabbed interface.", "and more" is a bit too unnecessary/unobjective for
me.

+      (license license:gpl3))))

The README suggests the intention is gpl3+, additionally, with the
bundled copy of BreezeStyleSheets it would be good to mention expat here
as well, so something like:

  (license (list license:gpl3+
                 license:expat)) ; for BreezeStyleSheets
Nicolò Balzarotti Nov. 3, 2020, 10:14 a.m. UTC | #2
Hi!
Christopher Baines <mail@cbaines.net> writes:
>
> Given this is a stylesheet, rather than cmark, I don't think it's a
> blocker, although I do think it would be neater to have a package for
> it.
>
Would it be better to at least pass it's origin as an input?

#+begin_src scheme
  ("breeze-stylesheet"
   ,(origin
      (method git-fetch)
      (uri
       (git-reference
	(url "https://github.com/Alexhuszagh/BreezeStyleSheets")
	(commit "2d595a956f8a5f493aa51139a470b768a6d82cce")))
      (file-name (git-file-name name version))
      (sha256
       (base32
	"1kvkxkisi3czldnb43ig60l55pi4a3m2a4ixp7krhpf9fc5wp294"))))
#+end_src

I'm ok with making a package for it, but in that case I'm not sure what
to do.  I think I'd use the copy-build-system, right? Should the package
be hidden?

> I've made some more comments below, and I wanted to enquire about
> exactly how the fonts are used, but I think this is pretty much ready to
> merge.
>
> I'd maybe use symlink rather than copy file, since you want the fonts to
> be used from the respective packages in the store, however, is this just
> to satisfy the build system? It looks to me like the XDG_DATA_DIRS
> wrapping is probably what'll make the fonts work at runtime (if
> anything)?

Regarding fonts,
I tried removing both from the inputs, and emojis at this page [1]
rendered just fine.
Should I just remove them from the inputs and let the user install them?
The code tries to load them with the relative path:

#+begin_src cpp
// Provide OpenMoji font for a safe fallback
QFontDatabase::addApplicationFont(":/fonts/OpenMoji-Color.ttf");
QFontDatabase::addApplicationFont(":/fonts/NotoColorEmoji.ttf");
#+end_src

This function fails silently (The function returns -1 if the font could
not be loaded.) and the error code is not checked, so we don't even need
to patch kristall source for this.

Let me know and thanks again,
Nicolò

[1] https://unicode.org/Public/emoji/1.0/emoji-data.txt
Christopher Baines Nov. 10, 2020, 7:57 p.m. UTC | #3
Nicolò Balzarotti <anothersms@gmail.com> writes:

> Christopher Baines <mail@cbaines.net> writes:
>>
>> Given this is a stylesheet, rather than cmark, I don't think it's a
>> blocker, although I do think it would be neater to have a package for
>> it.
>>
> Would it be better to at least pass it's origin as an input?
>
> #+begin_src scheme
>   ("breeze-stylesheet"
>    ,(origin
>       (method git-fetch)
>       (uri
>        (git-reference
> 	(url "https://github.com/Alexhuszagh/BreezeStyleSheets")
> 	(commit "2d595a956f8a5f493aa51139a470b768a6d82cce")))
>       (file-name (git-file-name name version))
>       (sha256
>        (base32
> 	"1kvkxkisi3czldnb43ig60l55pi4a3m2a4ixp7krhpf9fc5wp294"))))
> #+end_src
>
> I'm ok with making a package for it, but in that case I'm not sure what
> to do.  I think I'd use the copy-build-system, right? Should the package
> be hidden?

I don't mind, I think it's OK as is.

>> I've made some more comments below, and I wanted to enquire about
>> exactly how the fonts are used, but I think this is pretty much ready to
>> merge.
>>
>> I'd maybe use symlink rather than copy file, since you want the fonts to
>> be used from the respective packages in the store, however, is this just
>> to satisfy the build system? It looks to me like the XDG_DATA_DIRS
>> wrapping is probably what'll make the fonts work at runtime (if
>> anything)?
>
> Regarding fonts,
> I tried removing both from the inputs, and emojis at this page [1]
> rendered just fine.
> Should I just remove them from the inputs and let the user install them?
> The code tries to load them with the relative path:
>
> #+begin_src cpp
> // Provide OpenMoji font for a safe fallback
> QFontDatabase::addApplicationFont(":/fonts/OpenMoji-Color.ttf");
> QFontDatabase::addApplicationFont(":/fonts/NotoColorEmoji.ttf");
> #+end_src
>
> This function fails silently (The function returns -1 if the font could
> not be loaded.) and the error code is not checked, so we don't even need
> to patch kristall source for this.

If there's an expectation or a use in making sure these fonts are
available, it would be good to patch the relative paths to be the
absolute paths within the font-openmoji package.
diff mbox series

Patch

From 23527b87e86dbbf92c37718dc449d8ad0a8d3758 Mon Sep 17 00:00:00 2001
From: nixo <nicolo@nixo.xyz>
Date: Tue, 27 Oct 2020 14:18:23 +0100
Subject: [PATCH 2/2] gnu: Add kristall.

* gnu/packages/web-browsers.scm (kristall): New variable.
---
 gnu/packages/web-browsers.scm | 99 +++++++++++++++++++++++++++++++++++
 1 file changed, 99 insertions(+)

diff --git a/gnu/packages/web-browsers.scm b/gnu/packages/web-browsers.scm
index eb49a8fdea..30bc9ca9cf 100644
--- a/gnu/packages/web-browsers.scm
+++ b/gnu/packages/web-browsers.scm
@@ -46,6 +46,7 @@ 
   #:use-module (gnu packages documentation)
   #:use-module (gnu packages fltk)
   #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages fonts)
   #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages glib)
@@ -60,6 +61,7 @@ 
   #:use-module (gnu packages lisp)
   #:use-module (gnu packages lisp-xyz)
   #:use-module (gnu packages lua)
+  #:use-module (gnu packages markup)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
@@ -341,6 +343,103 @@  access.")
     (properties `((lint-hidden-cve . ("CVE-2016-9179"))))
     (license license:gpl2)))
 
+(define-public kristall
+  ;; Fixes to the build system applied after the latest tag
+  ;; Use tagged release when updating
+  (let ((commit "b684f94f1af9a19c1a6fd70d72097a13b75e1ca6")
+        (revision "1"))
+    (package
+      (name "kristall")
+      (version (string-append "0.3-" revision "." (string-take commit 7)))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/MasterQ32/kristall")
+               (commit "bf5b2ecd0fde117d550adeadee48d74034ed2cdb")))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1zakhxr30n7dawig7c8mizaqxwnqn3a7pz0yi7hc55nn7n7iyr6l"))
+         (modules '((guix build utils)))
+         (snippet
+          '(begin
+             ;; Remove bundled programs.
+             (with-directory-excursion "lib"
+               ;; Delete extra (bundled) files
+               (map (lambda (dir) (delete-file-recursively dir))
+                    ;; "BreezeStyleSheets"
+                    '("cmark")))
+             ;; Contains executable of 7z and pscp
+             (delete-file-recursively "ci/tools")
+             ;; Remove bundled fonts
+             (delete-file-recursively "src/fonts")
+             #t))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:modules ((guix build gnu-build-system)
+                    (guix build qt-utils)
+                    (guix build utils))
+         #:imported-modules (,@%gnu-build-system-modules
+                             (guix build qt-utils))
+         #:make-flags
+         (list (string-append "PREFIX=" %output))
+         #:phases
+         (modify-phases %standard-phases
+           (delete 'configure)          ; no ./configure script
+           (delete 'check)              ; no check target
+           (add-before 'build 'set-program-version
+             ;; runs git describe --tags by default
+             (lambda _
+               ;; configure.ac relies on ‘git --describe’ to get the version.
+               ;; Patch it to just return the real version number directly.
+               (substitute* "src/kristall.pro"
+                 (("(KRISTALL_VERSION=).*" _ match)
+                  (string-append match ,version "\n")))))
+           (add-before 'build 'replace-bundled-cmark
+             (lambda _
+               (substitute* "src/kristall.pro"
+                 (("(^include\\(.*cmark.*)" _ match)
+                  (string-append
+                   "LIBS += -I" (assoc-ref %build-inputs "cmark") " -lcmark")))
+               (substitute* "src/renderers/markdownrenderer.cpp"
+                 (("(include.*node.*)" _ match)
+                  (string-append "// " match)))))
+           (add-before 'build 'replace-bundled-fonts
+             (lambda _
+               (let ((noto (assoc-ref %build-inputs "font-google-noto"))
+                     (openmoji (assoc-ref %build-inputs "font-openmoji"))
+                     (srcdir "/share/fonts/truetype/")
+                     (outdir "src/fonts/"))
+                 (mkdir-p outdir)
+                 (copy-file
+                  (string-append noto srcdir "NotoColorEmoji.ttf")
+                  (string-append outdir "NotoColorEmoji.ttf"))
+                 (copy-file
+                  (string-append openmoji srcdir "OpenMoji-Color.ttf")
+                  (string-append outdir "OpenMoji-Color.ttf")))
+               #t))
+           (add-after 'install 'wrap-program
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let ((out (assoc-ref outputs "out")))
+                 (wrap-qt-program out "kristall"))
+               #t)))))
+      (inputs
+       `(("cmark" ,cmark)
+         ("font-google-noto" ,font-google-noto)
+         ("font-openmoji" ,font-openmoji)
+         ("openssl" ,openssl)
+         ("qtbase" ,qtbase)
+         ("qtmultimedia" ,qtmultimedia)
+         ("qtsvg" ,qtsvg)))
+      (home-page "https://github.com/MasterQ32/kristall")
+      (synopsis "Small-internet graphical client")
+      (description "Graphical small-internet client with with many features
+including multi-protocol support (gemini, http, https, gopher, finger),
+bookmarks, TSL certificates management, outline generation, tabbed interface
+and more.")
+      (license license:gpl3))))
+
 (define-public qutebrowser
   (package
     (name "qutebrowser")
-- 
2.28.0