ghcup-talk/GHCup.md
2024-05-24 23:31:24 +08:00

5.0 KiB
Raw Blame History

% GHCup % Julian Ospald % June 07, 2024

GHCup

What is GHCup?

State of 2019

::: incremental

  • stack is the only "Haskell Installer"
  • no unified alternative for cabal users
  • distro packages, nix, manual installs, ...
  • 🤮

:::

How it started

::: incremental

  • 🤹 small team at work (Capital Match), using different platforms
    • originally used stack
    • cabal distro packages constantly out of date
  • 🦾 first version was 165 LOC
    • Posix shell
  • {#id .class height=32px} only supported linux and mac
  • {#id .class height=32px} inspired by rustup

:::

GHCup today

::: incremental

  • over 17k LOC Haskell
  • supports all platforms: Linux, Windows, macOS, FreeBSD

:::

GHCup and haskell.org

::: incremental

  • the default installer
  • provides infrastructure (home page, downloads)

:::

GHCup and the Haskell Foundation

::: incremental

:::

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

::: incremental

  • ☮️ unification
  • unix principles
    • 🛠️ do one thing and do it well
    • ⚗️ pipes, compose stdout and stdin (re-usable)
  • 🎁 good re-distribution
  • 🛣️ user experience

:::

What is GHCup (simplified)?

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/

What is GHCup really?

::: incremental

  • {#id .class width=32 height=32px} installer
  • {#id .class width=32 height=32px} distribution channel
  • {#id .class width=32 height=32px} feedback channel
  • {#id .class width=32 height=32px} testing/QA gateway
  • {#id .class width=32 height=32px} provider of sane defaults (e.g. "recommended" GHC version)
  • {#id .class width=32 height=32px} glue for holistic toolchain experience
    • VSCode, stack, cabal-install integration
  • {#id .class width=32 height=32px} CI provisioning (e.g. github actions)

:::

Upstream

Supported tools/dependencies:

::: incremental

  • GHC
  • Cabal
  • HLS
  • Stack

:::

Downstream

Users:

::: incremental

  • {#id .class height=32px} Haskell developers
    • beginners, advanced, students, companies
  • {#id .class width=32 height=32px} end users (e.g. compiling pandoc from source)
  • {#id .class width=32 height=32px} GitHub CI
    • GitHub images, Haskell repos
  • 🪞 mirrors
  • 🧰 tools

:::

How does it work?

::: incremental

  • Architectural components
    • {#id .class height=32px} bootstrap scripts
    • {#id .class height=32px} ghcup binary (compiled)
    • {#id .class height=32px} ghcup-metadata (configuration files)
  • Logical components
    • {#id .class height=32px} cli interface
    • {#id .class height=32px} file layout / installation destination
    • {#id .class height=32px} bindist selection
    • {#id .class height=32px} tui interface

:::

Basic CLI

::: incremental

  • show all available tools / versions
    ghcup list
    
  • install a tool
    ghcup install ghc latest
    
  • make a tool version the default
    ghcup set ghc latest
    
  • remove a tool version
    ghcup rm ghc 9.10.1
    

:::

Where does it install?

::: incremental

  • root dir

    $ ls ~/.ghcup
    📁bin 📁ghc 📁hls
    📁cache 📁db 📁logs 📁tmp 🗑trash 📄config.yaml 📄env
    
  • GHC and HLS are installed into sub-directories

    $ ls ~/.ghcup/ghc
    📁8.10.7 📁9.0.2 📁9.2.8
    
  • bin directory is mostly symbolic links (compare with update-alternatives)

    $ ls ~/.ghcup/bin
    📄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
    

:::

Bindist selection

  • TODO