diff --git a/.github/run-ghcjs-tests.sh b/.github/run-ghcjs-tests.sh new file mode 100755 index 00000000..19e0d9b7 --- /dev/null +++ b/.github/run-ghcjs-tests.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +# +# cabal v2-test does not work with GHCJS +# See: https://github.com/haskell/cabal/issues/6175 +# +# This invokes cabal-plan to figure out test binaries, and invokes them with node. + +cabal-plan list-bins '*:test:*' | while read -r line +do + testpkg=$(echo "$line" | perl -pe 's/:.*//') + testexe=$(echo "$line" | awk '{ print $2 }') + echo "testing $textexe in package $textpkg" + (cd "$testpkg" && node "$testexe".jsexe/all.js) +done diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 2eea692c..642b4e30 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -172,8 +172,40 @@ jobs: - name: Run tests run: | - # cabal v2-test does not work with GHCJS - # See: https://github.com/haskell/cabal/issues/6175 - # - # This invokes cabal-plan to figure out test binaries, and invokes them with node. cabal-plan list-bins '*:test:*' | while read -r line; do testpkg=$(echo "$line" | perl -pe 's/:.*//'); testexe=$(echo "$line" | awk '{ print $2 }'); echo "testing $textexe in package $textpkg"; (cd "$(pkgdir $testpkg)" && nodejs "$testexe".jsexe/all.js); done + + ghcjs-test: + name: ghcjs-test + runs-on: "ubuntu-latest" + + steps: + - uses: actions/checkout@v2 + - uses: cachix/install-nix-action@v13 + with: + extra_nix_config: | + trusted-public-keys = ryantrinkle.com-1:JJiAKaRv9mWgpVAz8dwewnZe0AzzEAzPkagE9SP5NWI=1aba6f367982bd6dd78ec2fda75ab246a62d32c5 cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= + substituters = https://nixcache.reflex-frp.org https://cache.nixos.org/ + - name: Setup + run: | + # Override cabal.project with the lightweight GHCJS one + cp cabal.ghcjs.project cabal.project + cat cabal.project + nix-shell ghcjs.nix --run "cabal v2-update && cabal v2-freeze" + + - uses: actions/cache@v2.1.3 + name: Cache ~/.cabal/store and dist-newstyle + with: + path: | + ~/.cabal/store + dist-newstyle + key: ${{ runner.os }}-ghcjs8.6-${{ hashFiles('cabal.project.freeze') }} + restore-keys: | + ${{ runner.os }}-ghcjs8.6- + + - name: Build + run: | + nix-shell ghcjs.nix --run "cabal v2-build --ghcjs --enable-tests --enable-benchmarks all" + + - name: Tests + run: | + nix-shell ghcjs.nix --run ".github/run-ghcjs-tests.sh" diff --git a/cabal.ghcjs.project b/cabal.ghcjs.project index 72902332..db1ef33a 100644 --- a/cabal.ghcjs.project +++ b/cabal.ghcjs.project @@ -8,4 +8,6 @@ packages: compiler: ghcjs tests: True -constraints: hashable <=1.3.3.0 +-- Constraints so that reflex-platform provided packages are selected. +constraints: attoparsec == 0.13.2.2 +constraints: hashable == 1.3.0.0 diff --git a/ghcjs.nix b/ghcjs.nix new file mode 100644 index 00000000..274d007c --- /dev/null +++ b/ghcjs.nix @@ -0,0 +1,22 @@ +let reflex-platform = import (builtins.fetchTarball + { name = "reflex-platform"; + url = "https://github.com/reflex-frp/reflex-platform/archive/1aba6f367982bd6dd78ec2fda75ab246a62d32c5.tar.gz"; + }) {}; + pkgs = import ./nix/nixpkgs.nix; in + +pkgs.stdenv.mkDerivation { + name = "ghcjs-shell"; + buildInputs = + [ (reflex-platform.ghcjs.ghcWithPackages (p: with p; [ + attoparsec + hashable + ])) + pkgs.cabal-install + pkgs.gmp + pkgs.haskellPackages.cabal-plan + pkgs.haskellPackages.hspec-discover + pkgs.nodejs + pkgs.perl + pkgs.zlib + ]; +} diff --git a/nix/nixpkgs.nix b/nix/nixpkgs.nix new file mode 100644 index 00000000..744f982c --- /dev/null +++ b/nix/nixpkgs.nix @@ -0,0 +1,4 @@ +import (builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/refs/tags/21.05.tar.gz"; + sha256 = "sha256:1ckzhh24mgz6jd1xhfgx0i9mijk6xjqxwsshnvq789xsavrmsc36"; +}) {} diff --git a/nix/shell.nix b/nix/shell.nix index 715004f6..d178b60e 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,10 +1,6 @@ -let nixos = fetchTarball { url = "https://github.com/NixOS/nixpkgs/archive/refs/tags/21.05.tar.gz"; - sha256 = "sha256:1ckzhh24mgz6jd1xhfgx0i9mijk6xjqxwsshnvq789xsavrmsc36"; -}; in - { compiler ? "ghc8104" , tutorial ? false -, pkgs ? import nixos { config = {}; } +, pkgs ? import ./nixpkgs.nix }: with pkgs;