Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/utdemir/ghc-musl
Docker image with GHC+musl for static executables
https://github.com/utdemir/ghc-musl
docker hacktoberfest haskell musl static-binaries
Last synced: 3 months ago
JSON representation
Docker image with GHC+musl for static executables
- Host: GitHub
- URL: https://github.com/utdemir/ghc-musl
- Owner: utdemir
- Created: 2019-12-01T07:19:25.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2024-02-03T00:07:25.000Z (12 months ago)
- Last Synced: 2024-10-11T23:42:36.714Z (4 months ago)
- Topics: docker, hacktoberfest, haskell, musl, static-binaries
- Language: Shell
- Homepage:
- Size: 114 KB
- Stars: 136
- Watchers: 9
- Forks: 9
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
- awesome-cabal - `ghc-musl`
README
# ghc-musl
This repository provides Docker images with GHC compiled with `musl`;
therefore can be used to create fully static Haskell binaries without
`glibc` dependency on any platform which can run Docker (x86_64). Powered
by [ghcup](https://www.haskell.org/ghcup/).Images come with `ghc` and `cabal` executables alongside with commonly
used libraries and build tools. They can also be used with the `stack`
build tool using its Docker integration.Here are the latest images currently [published in Docker Hub](https://hub.docker.com/r/utdemir/ghc-musl/tags):
* utdemir/ghc-musl:v25-ghc944
* utdemir/ghc-musl:v25-ghc925
* utdemir/ghc-musl:v25-ghc902
* utdemir/ghc-musl:v25-ghc8107
* utdemir/ghc-musl:v25-ghc884## Usage
### cabal-install
Mount the project directory to the container, and use `cabal-install`
with `--enable-executable-static` flag inside the container:```
$ cd myproject/
$ docker run -itv $PWD:/mnt utdemir/ghc-musl:v25-ghc944
sh$ cd /mnt
sh$ cabal new-update
sh$ cabal new-build --enable-executable-static
```You can also set `executable-static` [option](https://cabal.readthedocs.io/en/latest/cabal-project.html#cfg-field-executable-static) on your `cabal.project` file.
### stack
Use below arguments, or set the relevant options on your `stack.yaml`:
```
stack build \
--ghc-options ' -static -optl-static -optl-pthread -fPIC' \
--docker --docker-image "utdemir/ghc-musl:v25-ghc944" \
--no-nix
```Make sure to pick an image with the GHC version compatible with the
Stackage resolver you are using.Follow https://github.com/commercialhaskell/stack/issues/3420 for
more details on static compilation using the Stack build tool.### Example session with GHC
Below shell session shows how to start a pre-compiled docker container
and compile a simple `Hello.hs` as a static executable:```
$ docker run -itv $PWD:/mnt utdemir/ghc-musl:v25-ghc944
bash-4.4# cd /mnt/
bash-4.4# cat Hello.hs
main = putStrLn "Hello"
bash-4.4# ghc --make -optl-static -optl-pthread Hello.hs
[1 of 1] Compiling Main ( Hello.hs, Hello.o )
Linking Hello ...
bash-4.4# ls -al Hello
-rwxr-xr-x 1 root root 1185056 Aug 11 16:55 Hello
bash-4.4# file Hello
Hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, with debug_info, not stripped
bash-4.4# ldd ./Hello
ldd: ./Hello: Not a valid dynamic program
```The result can be executed on different Linux systems:
```
$ docker run -itv $PWD:/mnt alpine
# /mnt/Hello
Hello
``````
$ docker run -itv $PWD:/mnt centos
[root@94eb29dcdfe6 /]# /mnt/Hello
Hello
```## Development
Feel free to open an issue or send a PR to add a library or support a
newer compiler version.The build process is orchestrated using [Earthly][]. Once it is installed
(or obtained via "nix-shell -p earthly"), you can use below command to build
and test all images:```
earthly --allow-privileged +all
```Note: `--allow-privileged` is only necessary because we use Docker-in-Docker
project to test if the generated images work with `stack`'s Docker support.
You can use the following command to disable Stack tests so that
`--allow-privileged` is not necessary:```
earthly --build-arg TEST_STACK=0 +all
```The following command updates `README.md`:
```
earthly --artifact +readme/README.md
```[Earthly]: https://earthly.dev
## Related
* Multi-arch:
* `os/arch`'s: `linux/amd64`, `linux/arm64/v8`
* Built using Hadrian, from source, without docs
*
* Using Nix:
* Not maintained: