Crystal language... How does Debian compile it?
Crystal language... How does Debian compile it?
I'm trying to figure out how to bootstrap the Crystal language.
There's a bootstrap script on the upstream org, but it's unmaintained and after a few hours of fiddling and solving some basic problems, I'm not sure I'm going to get anywhere with this approach. (EDIT: I've since posted my findings trying to use the crystal bootstrap-script over on this upstream thread, where someone else attempted something similar a year ago).
Now I notice Debian bookworm (which I use as my main OS) has crystal 1.6.0 in apt. I have done some vague reading over the years on Debian's principles, how Debian packages things etc., though so far I've not had the experience of packaging something myself. But I get the impression that Debian only distributes software which they can compile from source with no binary blobs required, so this implies Debian has found a way to bootstrap Crystal already.
I looked up the Debian source for crystal, but it seems the only added files are in the "debian" directory, and the only one of interest seems to be the "rules" file. That is a very small file though and it's not really shedding any light for me on how this manages to build Crystal.
Can anyone give me some pointers? Am I right that somewhere in the world there is a machine that is, or has been, somehow bootstrapping and compiling Crystal purely from source, and pushing out crystal packages to apt, and if so how can I replicate this? Or am I missing something fundamental here?
Thanks in advance to anyone who can help.
There's a bootstrap script on the upstream org, but it's unmaintained and after a few hours of fiddling and solving some basic problems, I'm not sure I'm going to get anywhere with this approach. (EDIT: I've since posted my findings trying to use the crystal bootstrap-script over on this upstream thread, where someone else attempted something similar a year ago).
Now I notice Debian bookworm (which I use as my main OS) has crystal 1.6.0 in apt. I have done some vague reading over the years on Debian's principles, how Debian packages things etc., though so far I've not had the experience of packaging something myself. But I get the impression that Debian only distributes software which they can compile from source with no binary blobs required, so this implies Debian has found a way to bootstrap Crystal already.
I looked up the Debian source for crystal, but it seems the only added files are in the "debian" directory, and the only one of interest seems to be the "rules" file. That is a very small file though and it's not really shedding any light for me on how this manages to build Crystal.
Can anyone give me some pointers? Am I right that somewhere in the world there is a machine that is, or has been, somehow bootstrapping and compiling Crystal purely from source, and pushing out crystal packages to apt, and if so how can I replicate this? Or am I missing something fundamental here?
Thanks in advance to anyone who can help.
- stevepusser
- Posts: 13023
- Joined: 2009-10-06 05:53
- Has thanked: 45 times
- Been thanked: 91 times
Re: Crystal language... How does Debian compile it?
The changelog says it's building it with LLVM/clang in Bookworm.
Slightly related, apparently thunderbird-esr 128 builds in Bookworm for i386 fail when using the default llvm-14 toolchain, and are succeeding in Bullseye using llvm-16. Probably someone needs to file a bug report. I'm gonna try and build an i386 package for MX repo using llvm-16 in the meantime.
Code: Select all
crystal (1.6.0+dfsg-1) unstable; urgency=medium
* New upstream version.
* d/patches:
- Refresh patch 'remove-check-in-random-failing-test'.
- Add patch 'fix-sbuild-pkgbuilddir-filtering-in-unix-spec'
(Closes: #1017565).
* Switch to llvm-toolchain-14 (Closes: #1017662).
MX Linux packager and developer
-
- Global Moderator
- Posts: 3949
- Joined: 2014-07-20 18:12
- Location: Europe
- Has thanked: 109 times
- Been thanked: 518 times
Re: Crystal language... How does Debian compile it?
Hello,
The upstream source code is here: The source code available in Debian is here:
The upstream source code is here: The source code available in Debian is here:
- sources / crystal / 1.12.1%2Bdfsg-1 (Debian Unstable)
- sources / crystal / 1.6.0%2Bdfsg-3 (Debian Bookworm)
- fabien
- Forum Helper
- Posts: 1156
- Joined: 2019-12-03 12:51
- Location: Anarres (Toulouse, France actually)
- Has thanked: 101 times
- Been thanked: 264 times
Re: Crystal language... How does Debian compile it?
You might also find some clues in the Build log for crystal.
Share your Debian SCRIPTS
There will be neither barrier nor walls, neither official nor guard, there will be no more desert and the entire world will become a garden. — Anacharsis Cloots
There will be neither barrier nor walls, neither official nor guard, there will be no more desert and the entire world will become a garden. — Anacharsis Cloots
- stevepusser
- Posts: 13023
- Joined: 2009-10-06 05:53
- Has thanked: 45 times
- Been thanked: 91 times
Re: Crystal language... How does Debian compile it?
I think the OP's question is that they thought that Crystal had to be compiled with the Crystal compiler, which is not the case. Debian uses the llvm compiler toolchain.
llvm is in turn compiled with gcc.
Gcc is compiled with a previous version of gcc.
Somewhere there's a gcc bootstrap, but it had to be a long time ago.
llvm is in turn compiled with gcc.
Gcc is compiled with a previous version of gcc.
Somewhere there's a gcc bootstrap, but it had to be a long time ago.
MX Linux packager and developer
- donald
- Debian Developer, Site Admin
- Posts: 1358
- Joined: 2021-03-30 20:08
- Has thanked: 242 times
- Been thanked: 296 times
Re: Crystal language... How does Debian compile it?
Very interesting.
@Best_Threads
@Best_Threads
Typo perfectionish.
"The advice given above is all good, and just because a new message has appeared it does not mean that a problem has arisen, just that a new gremlin hiding in the hardware has been exposed." - FreewheelinFrank
"The advice given above is all good, and just because a new message has appeared it does not mean that a problem has arisen, just that a new gremlin hiding in the hardware has been exposed." - FreewheelinFrank
Re: Crystal language... How does Debian compile it?
Is it sure LLVM can compile Crystal code? Maybe the change log just says that the LLVM backend from Crystal is updated to a new version. Looking at the build log that fabian provided, it seems like Debian compiles Crystal with an existing Crystal compiler from the Debian repositories.
The Travis config could also provide some hints - https://salsa.debian.org/deiv/crystal/- ... type=heads.
There the default compiler is a blob from Github:
The Travis config could also provide some hints - https://salsa.debian.org/deiv/crystal/- ... type=heads.
There the default compiler is a blob from Github:
Code: Select all
previous_crystal_base_url:
description: "Prefix for URLs to Crystal bootstrap compiler"
type: string
default: "https://github.com/crystal-lang/crystal/releases/download/1.11.2/crystal-1.11.2-1"
Re: Crystal language... How does Debian compile it?
Thanks for all the replies, everyone. I haven't yet had a chance to have another deep dive into this but this is already really helpful.
I took a quick glance at that log, and it does show it's installing crystal @ 1.6.0+dfsg-2 and building crystal @ 1.6.0+dfsg-3. It doesn't explain how crystal @ 1.6.0+dfsg-2 was built. Are build logs kept for all eternity? If they are, I might be able to reconstruct the history of how this was done by looking at the build logs of every version since when it was originally added to Debian.
One of my experiments yesterday was to start with just crystal @ 1.6.0 from apt, then clone the upstream repo ( https://github.com/crystal-lang/crystal/ ), check out various different tags (starting with 1.6.0 itself, then the latest patch of that and each minor since) and run make on each one. But this seems to do some black magic, as it leaves 2 files inside the repo dir ( .build/crystal and src/llvm/ext/llvm_ext.o ) and also affects the contents of $HOME/.cache/crystal, and the existence and contents of these files seem to affect future builds: when I deleted them all between each make, then it would only build up to a certain version and give errors on future versions (I'd have to re-test to find out which, it was all a bit confusing at the time), whereas when I left the files there and only ran git checkout and make commands, it was quite happy to keep building newer and newer versions, up to wherever I stopped, which was around 1.11 I think. This suggested to me that the build process is figuring out by itself where to find the previous just-built version, but giving me no info on what files affect this.
This is what I was thinking, too. Particularly as this blog post from the authors of Crystal indicates that Crystal has required itself to build since 2013.blackbird wrote: ↑2024-11-19 10:27 Is it sure LLVM can compile Crystal code? Maybe the change log just says that the LLVM backend from Crystal is updated to a new version. Looking at the build log that fabian provided, it seems like Debian compiles Crystal with an existing Crystal compiler from the Debian repositories.
I took a quick glance at that log, and it does show it's installing crystal @ 1.6.0+dfsg-2 and building crystal @ 1.6.0+dfsg-3. It doesn't explain how crystal @ 1.6.0+dfsg-2 was built. Are build logs kept for all eternity? If they are, I might be able to reconstruct the history of how this was done by looking at the build logs of every version since when it was originally added to Debian.
One of my experiments yesterday was to start with just crystal @ 1.6.0 from apt, then clone the upstream repo ( https://github.com/crystal-lang/crystal/ ), check out various different tags (starting with 1.6.0 itself, then the latest patch of that and each minor since) and run make on each one. But this seems to do some black magic, as it leaves 2 files inside the repo dir ( .build/crystal and src/llvm/ext/llvm_ext.o ) and also affects the contents of $HOME/.cache/crystal, and the existence and contents of these files seem to affect future builds: when I deleted them all between each make, then it would only build up to a certain version and give errors on future versions (I'd have to re-test to find out which, it was all a bit confusing at the time), whereas when I left the files there and only ran git checkout and make commands, it was quite happy to keep building newer and newer versions, up to wherever I stopped, which was around 1.11 I think. This suggested to me that the build process is figuring out by itself where to find the previous just-built version, but giving me no info on what files affect this.
Re: Crystal language... How does Debian compile it?
I think it takes the last version to be used for compilation from here: https://github.com/crystal-lang/crystal ... /shell.nix.
For Debian, the intuitive way would be also to use the latest former version of Crystal to compile the next, just using the Debian package instead of the blob from Github.
- stevepusser
- Posts: 13023
- Joined: 2009-10-06 05:53
- Has thanked: 45 times
- Been thanked: 91 times
Re: Crystal language... How does Debian compile it?
Interesting:
Wikipedia states:
Wikipedia states:
andThe Crystal compiler was first written in Ruby, but later rewritten in Crystal, thus becoming self-hosting, as of November 2013.[10]
Although resembling the Ruby language in syntax, Crystal compiles to much more efficient native code using an LLVM backend, at the cost of precluding the dynamic aspects of Ruby.
MX Linux packager and developer
- stevepusser
- Posts: 13023
- Joined: 2009-10-06 05:53
- Has thanked: 45 times
- Been thanked: 91 times
Re: Crystal language... How does Debian compile it?
If you go back to the very first 0.34.0 version to appear in Debian, you would ask how did they do it without already having crystal packages available.
They just used llvm. Here are what the build-depends were:
This is when it depended on itself:
They just used llvm. Here are what the build-depends were:
Code: Select all
Build-Depends: debhelper-compat (= 12),
git,
libbsd-dev,
libedit-dev,
libevent-dev,
libgc-dev (>= 1:7.6.0),
libgc1c2,
libgmp-dev,
libgmpxx4ldbl,
libllvm9 | libllvm8,
libpcre3-dev,
libssl-dev,
libtool,
libxml2-dev,
libyaml-dev,
libz-dev,
lld-9 | lld-8,
llvm-9-dev | llvm-8-dev,
pkg-config
Code: Select all
crystal (1.2.1+dfsg-2) unstable; urgency=medium
* d/control:
- Update standars version (no changes needed).
- Point Vcs-* fields to the updated git repository.
- Update maintainer to debian account.
- Update LLVM version.
- Rename packages to crystal (remove -lang).
- Add build depend on itself.
* Update d/copyright.
-- David Suárez <deiv@debian.org> Sat, 30 Oct 2021 15:03:25 +0200
Last edited by stevepusser on 2024-11-20 15:43, edited 1 time in total.
MX Linux packager and developer
Re: Crystal language... How does Debian compile it?
Interesting.
I downloaded the sources from here: https://snapshot.debian.org/package/cry ... %2Bdfsg-1/
and again, didn't find anything that would successfully bootstrap this.
debian/changelog says:
So I looked up bug822275, and there is this commentary:
Looking in the source dir of this 0.34.0 version, there is only one C/C++ file, that is the llvm_ext.cc, which doesn't contain very much at all, everything else is Crystal.
Again debian/rules doesn't seem to shed any light on how this is compiled so I assume it just is just running make inside the source dir.
Doing so gives me an error that it can't find llvm-config. Running LLVM_CONFIG=/usr/bin/llvm-config-14 make instead gives me a bunch of errors compiling llvm_ext.cc, indicating I'd probably need an older LLVM.
So I just quickly hacked the Makefile to prevent it trying to build llvm_ext.cc to see what would happen.
It invoked bin/crystal, which is a shell script that tries to find crystal, which found my system-installed crystal-1.6.0.
After doing apt remove crystal, trying the make again results in the message "You need to have a crystal executable in your path!"
So it would seem to me that in order to build this 0.34.0 version, they had to do some bootstrapping manually (perhaps following the bootstrap-script I originally mentioned, which no longer works), and maybe the details of how this was done have been lost.
I might try installing some old Debian versions in VMs, and see if the bootstrap-script works anywhere there.
I downloaded the sources from here: https://snapshot.debian.org/package/cry ... %2Bdfsg-1/
and again, didn't find anything that would successfully bootstrap this.
debian/changelog says:
Code: Select all
crystal (0.34.0+dfsg-1) unstable; urgency=medium
* Initial release (Closes: #822275).
-- David Suárez <david.sephirot@gmail.com> Fri, 10 Apr 2020 17:26:40 +0200
[1] just links to https://github.com/olbat/crystal which doesn't seem to have any additional commits beyond upstream.From: Luc Sarzyniec <debian@olbat.net>
To: submit@bugs.debian.org
Subject: RFP: crystal -- Compiler of the Crystal object-oriented programming language
Date: Fri, 22 Apr 2016 23:46:18 +0200
Package: wnpp
Severity: wishlist
* Package name : crystal
Version : 0.15.0
Upstream Author : Manas Technology Solutions <info@manas.com.ar>
* URL : http://crystal-lang.org/
* License : Apache-2.0
Programming Lang: Crystal
Description : Compiler of the Crystal object-oriented programming language
The Crystal's language syntax is inspired by Ruby, the language is statically
type-checked but does not require that the type of variables or method
arguments be specified.
The project's sources are hosted on GitHub [0].
I started to work on the Debian packaging of the project [1], but I still have
some issues to address. The first one: the compiler is written in Crystal so
crystal has to be specified in the package's build dependencies - I don't
really know how to handle it. This work may be used as a base to build
something cleaner.
Looking in the source dir of this 0.34.0 version, there is only one C/C++ file, that is the llvm_ext.cc, which doesn't contain very much at all, everything else is Crystal.
Again debian/rules doesn't seem to shed any light on how this is compiled so I assume it just is just running make inside the source dir.
Doing so gives me an error that it can't find llvm-config. Running LLVM_CONFIG=/usr/bin/llvm-config-14 make instead gives me a bunch of errors compiling llvm_ext.cc, indicating I'd probably need an older LLVM.
So I just quickly hacked the Makefile to prevent it trying to build llvm_ext.cc to see what would happen.
It invoked bin/crystal, which is a shell script that tries to find crystal, which found my system-installed crystal-1.6.0.
After doing apt remove crystal, trying the make again results in the message "You need to have a crystal executable in your path!"
So it would seem to me that in order to build this 0.34.0 version, they had to do some bootstrapping manually (perhaps following the bootstrap-script I originally mentioned, which no longer works), and maybe the details of how this was done have been lost.
I might try installing some old Debian versions in VMs, and see if the bootstrap-script works anywhere there.