ghcup-talk/GHCup.md

225 lines
5.0 KiB
Markdown
Raw Normal View History

2024-05-18 17:05:23 +00:00
% GHCup
% Julian Ospald
% June 07, 2024
# GHCup
2024-05-24 15:31:24 +00:00
## What is GHCup?
2024-05-18 17:05:23 +00:00
2024-05-24 15:31:24 +00:00
![](what.jpg)
2024-05-18 17:05:23 +00:00
2024-05-24 15:31:24 +00:00
## State of 2019
2024-05-18 17:05:23 +00:00
2024-05-24 15:31:24 +00:00
::: incremental
2024-05-19 11:59:02 +00:00
2024-05-24 15:31:24 +00:00
* stack is the only "Haskell Installer"
* no unified alternative for cabal users
* distro packages, nix, manual installs, ...
* 🤮
2024-05-18 17:05:23 +00:00
2024-05-24 15:31:24 +00:00
:::
2024-05-18 17:05:23 +00:00
## How it started
2024-05-19 11:59:02 +00:00
::: incremental
2024-05-24 15:31:24 +00:00
* 🤹 small team at work (Capital Match), using different platforms
- originally used stack
- cabal distro packages constantly out of date
2024-05-18 17:05:23 +00:00
* 🦾 first version was 165 LOC
2024-05-24 15:31:24 +00:00
- Posix shell
* ![](linux.png){#id .class height=32px} only supported linux and mac
* ![](rust.png){#id .class height=32px} inspired by **rustup**
2024-05-18 17:05:23 +00:00
2024-05-19 11:59:02 +00:00
:::
2024-05-24 15:31:24 +00:00
## GHCup today
::: incremental
* [Haskell Survey 2022](https://taylor.fausak.me/2022/11/18/haskell-survey-results/#s2q1)
* ![](survey.png)
- over **17k** LOC Haskell
- supports all platforms: Linux, Windows, macOS, FreeBSD
:::
## GHCup and haskell.org
::: incremental
* the default installer
- ![](downloads.png)
* provides infrastructure (home page, downloads)
:::
## GHCup and the Haskell Foundation
::: incremental
* affiliation: [https://haskell.foundation/affiliates/](https://haskell.foundation/affiliates/)
* pays for CI
* pays consultants to assist the project
:::
## What is a good installer?
::: incremental
* it installs (just that)
- everywhere
* intuitive interface
- `ghcup install ghc`
* good documentation
- but you shouldn't have to read it
* get out of the way
- has no self-fulfilling purpose
:::
## Goals and principles
2024-05-18 17:05:23 +00:00
2024-05-19 11:59:02 +00:00
::: incremental
2024-05-18 17:05:23 +00:00
- ☮️ unification
- unix principles
- 🛠️ do one thing and do it well
2024-05-24 15:31:24 +00:00
- ⚗️ pipes, compose stdout and stdin (re-usable)
2024-05-18 17:05:23 +00:00
- 🎁 good re-distribution
2024-05-24 15:31:24 +00:00
- 🛣️ user experience
2024-05-18 17:05:23 +00:00
2024-05-19 11:59:02 +00:00
:::
2024-05-24 15:31:24 +00:00
## What is GHCup (simplified)?
```sh
curl -s -L 'https://downloads.haskell.org/~ghc/9.6.5/ghc-9.6.5-x86_64-fedora33-linux.tar.xz' |
tar -xJ -C /tmp &&
cd /tmp/ghc-9.6.5-x86_64-unknown-linux/ &&
./configure --prefix="$HOME/.local" &&
make install &&
rm -rf /tmp/ghc-9.6.5-x86_64-unknown-linux/
```
2024-05-19 11:59:02 +00:00
## What is GHCup really?
2024-05-18 17:05:23 +00:00
* [https://hasufell.github.io/posts/2023-11-14-ghcup-is-not-an-installer.html](https://hasufell.github.io/posts/2023-11-14-ghcup-is-not-an-installer.html)
2024-05-19 11:59:02 +00:00
::: incremental
2024-05-18 17:05:23 +00:00
* ![](open-box.png){#id .class width=32 height=32px} installer
2024-05-24 15:31:24 +00:00
* ![](debian.png){#id .class width=32 height=32px} distribution channel
2024-05-18 17:05:23 +00:00
* ![](feedback.png){#id .class width=32 height=32px} feedback channel
2024-05-19 11:59:02 +00:00
* ![](qa.png){#id .class width=32 height=32px} testing/QA gateway
* ![](user.png){#id .class width=32 height=32px} provider of sane defaults (e.g. "recommended" GHC version)
* ![](chain-saw.png){#id .class width=32 height=32px} glue for holistic toolchain experience
2024-05-24 15:31:24 +00:00
- VSCode, stack, cabal-install integration
2024-05-19 11:59:02 +00:00
* ![](ghaction.png){#id .class width=32 height=32px} CI provisioning (e.g. github actions)
:::
## Upstream
Supported tools/dependencies:
::: incremental
- GHC
- Cabal
- HLS
- Stack
:::
## Downstream
Users:
::: incremental
- ![](haskell_logo.png){#id .class height=32px} Haskell developers
2024-05-24 15:31:24 +00:00
- beginners, advanced, students, companies
- ![](person.png){#id .class width=32 height=32px} end users (e.g. compiling pandoc from source)
2024-05-19 11:59:02 +00:00
- ![](ghaction.png){#id .class width=32 height=32px} GitHub CI
2024-05-24 15:31:24 +00:00
- GitHub images, Haskell repos
2024-05-19 11:59:02 +00:00
- 🪞 mirrors
- [sjtug](https://mirror.sjtu.edu.cn/docs/ghcup)
- 🧰 tools
2024-05-24 15:31:24 +00:00
- [vscode-haskell](https://github.com/haskell/vscode-haskell), [Haskell playground](https://play.haskell.org/), [nvim-lsp-installer](https://github.com/williamboman/nvim-lsp-installer)
2024-05-19 11:59:02 +00:00
:::
## How does it work?
::: incremental
2024-05-24 15:31:24 +00:00
* **Architectural components**
- ![](sh-file.png){#id .class height=32px} bootstrap scripts
- ![](exe-file.png){#id .class height=32px} ghcup binary (compiled)
- ![](config-file.png){#id .class height=32px} ghcup-metadata (configuration files)
* **Logical components**
- ![](terminal.png){#id .class height=32px} cli interface
- ![](file.png){#id .class height=32px} file layout / installation destination
- ![](tar.png){#id .class height=32px} bindist selection
- ![](brick-final-clearbg.png){#id .class height=32px} tui interface
2024-05-19 11:59:02 +00:00
:::
## Basic CLI
::: incremental
* show all available tools / versions
```sh
ghcup list
```
* install a tool
```sh
ghcup install ghc latest
```
* make a tool version the default
```sh
ghcup set ghc latest
```
* remove a tool version
```sh
ghcup rm ghc 9.10.1
```
:::
## Where does it install?
::: incremental
* root dir
```sh
$ ls ~/.ghcup
2024-05-24 15:31:24 +00:00
📁bin 📁ghc 📁hls
📁cache 📁db 📁logs 📁tmp 🗑trash 📄config.yaml 📄env
2024-05-19 11:59:02 +00:00
```
* GHC and HLS are installed into sub-directories
```sh
$ ls ~/.ghcup/ghc
2024-05-24 15:31:24 +00:00
📁8.10.7 📁9.0.2 📁9.2.8
2024-05-19 11:59:02 +00:00
```
2024-05-24 15:31:24 +00:00
* bin directory is mostly symbolic links (compare with [update-alternatives](https://man7.org/linux/man-pages/man1/update-alternatives.1.html))
2024-05-19 11:59:02 +00:00
```sh
$ ls ~/.ghcup/bin
2024-05-24 15:31:24 +00:00
📄ghcup
🔗cabal 📄cabal-3.10.3.0
🔗ghc 🔗ghc-8.10 🔗ghc-8.10.7 🔗ghc-9.0 🔗ghc-9.0.2 🔗ghc-9.2 🔗ghc-9.2.8
2024-05-19 11:59:02 +00:00
```
:::
## Bindist selection
2024-05-24 15:31:24 +00:00
* TODO
2024-05-18 17:05:23 +00:00