From: Steve George <steve@futurile.net>
To: alexis.simon@runbox.com
Cc: guix-devel@gnu.org
Subject: Re: packaging Typst
Date: Thu, 2 Nov 2023 20:21:24 +0000 [thread overview]
Message-ID: <20231102202124.GA835027@t25sg> (raw)
[-- Attachment #1: Type: text/plain, Size: 3811 bytes --]
Hi Alexis,
I've been doing some Rust packaging recently, so maybe this will help you to get started. Here's how I would approach it.
Explore the software
====================
The first thing I did was explore whether Typst builds in a current Guix environment. If we don't have the right version of Rust, for example, there's little point continuing:
- clone it into an appropriate place
- start a shell:
$ guix shell --container --network rust rust-cargo coreutils openssl nss-certs gcc-toolchain
We need 'openssl' and 'nss-certs' so that cargo will work.
- build it:
[env]$ env CC=gcc cargo build
Kept failing on ring v0.17.5 which is looking for 'cc'. It builds with 296 crates, so we might have our hands full here! Eventually outputs a /target/debug/typst command which seems to work.
Import using Guix import
=========================
Normally, we'd be able to use the `crates` importer. But, the Typst crates are just place-holders with no details.
AFAIK the importer only works with crates-io, we can't feed it Cargo.toml file directly. We'll need to manually create a package and check for any dependencies.
Manually create a top-level package
====================================
To manually create the package we have to go through the projects Cargo.toml.
- create an intial typst.scm file in some project directory.
- create a minimal typst package by looking in Cargo.lock at 'typst'
- for each dependency look at what the Cargo.lock used to build it - check whether we have it in Guix
- in some cases we will have the crate, but not the right version
Import the dependencies
=============================
The first crate that I found which we don't have in the Guix archive is 'comemo' [0]. We can import this with:
$ guix shell --development guix --container --nesting --network nss-certs
[env]$ guix import crate --recursive comemo@0.3.0 > comemo-import.scm
Move these package definitions into your main `typst.scm` file. Check them to add any missing development dependencies.
The first one in the dependency stack is `rust-comemo-0.3` which we reference at the bottom of the file. We try and build it as the importer has pulled it in:
$ guix shell --development guix --container --nesting
[env]$ guix build --load-path=./ --file=typst.scm
<successfully builds>
The next one `rust-comemo-macros` which has been set to `skip-build: #t`, we'll try building it that way initially:
- add rust-comemo-macros-0.3 to the bottom of the typst.scm file
- comment out the rust-comemo-0.3 line
- try and build with: guix build --load-path=./ --file=typst.scm
- If it builds successfully, change the `skip-build: #t` part of the definition to be #f.
- error[E0433]: failed to resolve: use of undeclared crate or module `comemo`
- tried adding comemo as a dependency which didn't work
- set it to #:tests? #f - for now
There's some more things that have to be done to 'contribute' these packages, but for now I would move onto the next dependency. And that's all there is to this part - finding the dependencies and importing them.
Building a dependent package that's not a crate
===============================================
The cargo-build-system expects to build everything from Crates AFAIK. I believe it will take some messing around with the phases to add the typst-lib which seems to be a dependency. It looks like librsvg (in gnome.scm) does a lot of messing with phases, and greetd (in admin.scm) does some as well - these might be good examples to look at.
Hopefully this is enough to get you started!
Steve
[0] https://crates.io/crates/comemo
[-- Attachment #2: typst.scm --]
[-- Type: text/plain, Size: 5249 bytes --]
(define-module (typst)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix packages)
#:use-module (guix gexp)
#:use-module (guix download)
#:use-module (guix git-download)
#:use-module (guix utils)
#:use-module (guix build-system gnu)
#:use-module (guix build-system cargo)
#:use-module (gnu packages crates-io))
;; guix shell --development guix --container --nesting
;; guix build --load-path=./ --file=typst.scm
; librsvg in gnome.scm mixes build systems
; greetd in admin.scm does some minor changes
(define-public rust-comemo-0.3
(package
(name "rust-comemo")
(version "0.3.0")
(source
(origin
(method url-fetch)
(uri (crate-uri "comemo" version))
(file-name (string-append name "-" version ".tar.gz"))
(sha256
(base32 "14ng6gqklsy8m9wn6radragn8pazsmn5759mywxb1ddf8bqrg818"))))
(build-system cargo-build-system)
(arguments
`(#:cargo-inputs (("rust-comemo-macros" ,rust-comemo-macros-0.3)
("rust-siphasher" ,rust-siphasher-0.3))))
(home-page "https://github.com/typst/comemo")
(synopsis "Incremental computation through constrained memoization.")
(description "Incremental computation through constrained memoization.")
(license (list license:expat license:asl2.0))))
(define-public rust-comemo-macros-0.3
(package
(name "rust-comemo-macros")
(version "0.3.0")
(source
(origin
(method url-fetch)
(uri (crate-uri "comemo-macros" version))
(file-name (string-append name "-" version ".tar.gz"))
(sha256
(base32 "0h1967l3w815iwscryb0iiv0m8j1np8ndlbfryj1987n2ycw130n"))))
(build-system cargo-build-system)
(arguments
`(#:skip-build? #f
#:tests? #f
#:cargo-inputs (("rust-proc-macro2" ,rust-proc-macro2-1)
("rust-quote" ,rust-quote-1)
("rust-syn" ,rust-syn-1)
)))
(home-page "https://github.com/typst/comemo")
(synopsis "Procedural macros for comemo.")
(description "Procedural macros for comemo.")
(license (list license:expat license:asl2.0))))
(define-public typst
(package
(name "typst")
(version "0.9.0")
(source
(origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/typst/typst")
(commit (string-append "v" version))))
(sha256
(base32 "04aq2v1ima87sap6yjb7jrm1ss63ax7v5kg7rpkj44887kfybkvv"))))
(build-system cargo-build-system)
(arguments
`(#:cargo-inputs
(("rust-chrono" ,rust-chrono-0.4) ;Cargo.lock: 0.4.31 - Guix: 0.4.24
("rust-clap" ,rust-clap-4) ;Cargo.lock: 4.4.7 - Guix: 4.3.19 - hmm
("rust-clap-complete" ,rust-clap-complete-4) ;Cargo.lock: 4.47 - Guix: 4.3.2
("rust-codespan-reporting" ,rust-codespan-reporting-0.11) ;Cargo.lock: 0.11.1 - Guix: 0.11.1
("rust-comemo" ,rust-comemo-xx) ;Cargo.lock: 0.3.0a Guix: nope - new package
("rust-dirs" ,rust-dirs-xx)
("rust-ecow" ,rust-ecow-xx)
("rust-env-proxy" ,rust-env-proxy-xx)
("rust-filetime" ,rust-filetime-xx)
("rust-flate2" ,rust-flate2-xx)
("rust-fontdb" ,rust-fontdb-xx)
("rust-inferno" ,rust-inferno-xx)
("rust-notify" ,rust-notify-xx)
("rust-once-cell" ,rust-once-cell-xx)
("rust-open" ,rust-open-xx)
("rust-pathdiff" ,rust-pathdiff-xx)
("rust-rustls" ,rust-rustls-xx)
("rustls-pemfile" ,rust-pemfile-xx)
("rust-same-file" ,rust-same-file-xx)
("rust-self-replace" ,rust-self-replace-xx)
("rust-semver" ,rust-semver-xx)
("rust-serde" ,rust-serde-xx)
("rust-serde-json" ,rust-serde-json-xx)
("rust-serde-yaml" ,rust-serde-yaml-0.9) ; =0.9.27?
("rust-siphasher" ,rust-siphasher-xx) ;Cargo.lock: 0.3.11 - Guix: 0.3.2 - update existing package
("rust-tar" ,rust-tar-xx) ; Cargo.lock: 0.4.40 - Guix: 0.4.38
("rust-tempfile" ,rust-tempfile-xx) ;Cargo.lock: 3.8.1 - Guix 3.8.0
("rust-tracing" ,rust-tracing-xx) ;Cargo.lock: 0.1.40 - Guix: 0.1.38 - update existing package
("rust-tracing-error" ,rust-tracing-error-xx) ; Cargo.lock: 0.2.0 - Guix: n/a - new package
("rust-tracing-flame" ,rust-tracing-flame-xx) ;Cargo.lock: 0.2.0 - Guix: n/a - new package
("rust-tracing-subscriber" ,rust-tracing-subscriber-xx) ;Cargo.lock: 0.3.17 Guix: 0.3.17
("rust-typst" ,rust-typst-xx)
("rust-typst-library" ,rust-typst-library-xx) ;=0.9.0 - new package
("rust-ureq" ,rust-ureq-xx) ;Cargo.lock: 2.8.0 - Guix: 2.6.2 - new version required?
("rust-xz2" ,rust-xz2-xx) ;Cargo.lock: 0.1.7 - Guix: 0.1.6 - update existing package
("rust-zip" ,rust-zip-xx) ;Cargo.lock: 0.6.6 - Guix: 0.6.4
)))
(home-page "tbd")
(synopsis "tbd")
(description "tbd")
(license license:asl2.0)))
;typst
rust-comemo-macros-0.3
;rust-comemo-0.3
next reply other threads:[~2023-11-03 19:53 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-02 20:21 Steve George [this message]
2023-11-02 20:32 ` packaging Typst Alexis Simon
2023-11-03 21:41 ` Alexis Simon
-- strict thread matches above, loose matches on Subject: below --
2024-07-11 6:21 Packaging Typst Ethan Reece
2024-07-12 1:34 ` kiasoc5
2024-07-13 13:40 ` jbranso
2024-07-14 19:52 ` Ethan Reece
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://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231102202124.GA835027@t25sg \
--to=steve@futurile.net \
--cc=alexis.simon@runbox.com \
--cc=de4f8986-1da8-4fcc-a921-b0155ebc7277@runbox.com \
--cc=guix-devel@gnu.org \
/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.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
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).