From b9ea39ffa3e1c4b1d1a4a33abf8dd968b45a2d0d Mon Sep 17 00:00:00 2001 From: goolord Date: Mon, 1 Oct 2018 09:37:33 -0400 Subject: [PATCH] nix --- colonnade/default.nix | 8 +++ colonnade/shell.nix | 1 + nix/default.nix | 106 +++++++++++++++++++------------ nix/gtk2hs-buildtools.nix | 20 ++++++ nix/jsaddle.json | 6 ++ reflex-dom-colonnade/default.nix | 11 ++-- reflex-dom-colonnade/shell.nix | 1 + 7 files changed, 109 insertions(+), 44 deletions(-) create mode 100644 colonnade/default.nix create mode 100644 colonnade/shell.nix create mode 100644 nix/gtk2hs-buildtools.nix create mode 100644 nix/jsaddle.json create mode 100644 reflex-dom-colonnade/shell.nix diff --git a/colonnade/default.nix b/colonnade/default.nix new file mode 100644 index 0000000..b73a8e3 --- /dev/null +++ b/colonnade/default.nix @@ -0,0 +1,8 @@ +{ frontend ? false }: +let + pname = "colonnade"; + main = (import ../nix/default.nix { + inherit frontend; + }); +in + main.${pname} diff --git a/colonnade/shell.nix b/colonnade/shell.nix new file mode 100644 index 0000000..910b922 --- /dev/null +++ b/colonnade/shell.nix @@ -0,0 +1 @@ +(import ./. {}).env diff --git a/nix/default.nix b/nix/default.nix index d66e05c..b21c746 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -1,47 +1,73 @@ -{ package, test ? true, frontend ? false }: -let bootstrap = import {}; +{ frontend ? false }: + +let _nixpkgs = import {}; + nixpkgs = _nixpkgs.fetchFromGitHub { + owner = "NixOS"; + repo = "nixpkgs"; + rev = "5c4a404b0d0e5125070dde5c1787210149157e83"; + sha256 = "0a478l0dxzy5hglavkilxjkh45zfg31q50hgkv1npninc4lpv5f7"; + }; + pkgs = import nixpkgs { config = {}; overlays = []; }; + fetch-github-json = owner: repo: path: let commit = builtins.fromJSON (builtins.readFile path); - in bootstrap.fetchFromGitHub { - inherit owner repo; - inherit (commit) rev sha256; + in pkgs.fetchFromGitHub { + name = "${repo}-${commit.rev}"; + inherit owner repo; + inherit (commit) rev sha256; }; - reflex-platform = import (fetch-github-json "reflex-frp" "reflex-platform" ./reflex-platform.json) {}; - compiler = if frontend then "ghcjs" else "ghc"; - overrides = (builtins.getAttr compiler reflex-platform).override { + + reflex-platform = import (fetch-github-json "layer-3-communications" "reflex-platform" ./reflex-platform.json) {}; + jsaddle-src = fetch-github-json "ghcjs" "jsaddle" ./jsaddle.json; + compiler = "ghc8_2_1"; + + filterPredicate = p: type: + let path = baseNameOf p; in !( + (type == "directory" && pkgs.lib.hasPrefix "dist" path) + || (type == "symlink" && pkgs.lib.hasPrefix "result" path) + || pkgs.lib.hasPrefix ".ghc" path + || pkgs.lib.hasPrefix ".git" path + || pkgs.lib.hasSuffix "~" path + || pkgs.lib.hasSuffix ".o" path + || pkgs.lib.hasSuffix ".so" path + || pkgs.lib.hasSuffix ".nix" path); + + overrides = reflex-platform.${compiler}.override { overrides = self: super: with reflex-platform; - let options = pkg: lib.overrideCabal pkg (drv: { doCheck = test; }); - filterPredicate = p: type: - let path = baseNameOf p; in - !builtins.any (x: x) - [(type == "directory" && path == "dist") - (type == "symlink" && path == "result") - (type == "directory" && path == ".git")]; - in { - mkDerivation = args: super.mkDerivation (args // - (if nixpkgs.stdenv.isDarwin && !frontend then { - postCompileBuildDriver = '' - echo "Patching dynamic library dependencies" - # 1. Link all dylibs from 'dynamic-library-dirs's in package confs to $out/lib/links - mkdir -p $out/lib/links - for d in $(grep dynamic-library-dirs $packageConfDir/*|awk '{print $2}'); do - ln -s $d/*.dylib $out/lib/links - done + with reflex-platform.lib; + with reflex-platform.nixpkgs.haskell.lib; + with reflex-platform.nixpkgs.haskellPackages; + let + cp = file: (self.callPackage (./deps + "/${file}.nix") {}); + build-from-json = name: str: self.callCabal2nix name str {}; + build = name: path: self.callCabal2nix name (builtins.filterSource filterPredicate path) {}; + in + { + gtk2hs-buildtools = self.callPackage ./gtk2hs-buildtools.nix {}; + colonnade = build "colonnade" ../colonnade; + siphon = build "siphon" ../siphon; + reflex-dom-colonnade = build "reflex-dom-colonnade" ../reflex-dom-colonnade; + lucid-colonnade = build "lucid-colonnade" ../lucid-colonnade; + blaze-colonnade = build "blaze-colonnade" ../blaze-colonnade; + yesod-colonnade = build "yesod-colonnade" ../yesod-colonnade; + } // + { + jsaddle = doJailbreak (build-from-json "jsaddle" "${jsaddle-src}/jsaddle"); + jsaddle-webkitgtk = doJailbreak (build-from-json "jsaddle-webkitgtk" "${jsaddle-src}/jsaddle-webkitgtk"); + jsaddle-webkit2gtk = doJailbreak (build-from-json "jsaddle-webkit2gtk" "${jsaddle-src}/jsaddle-webkit2gtk"); + jsaddle-wkwebview = doJailbreak (build-from-json "jsaddle-wkwebview" "${jsaddle-src}/jsaddle-wkwebview"); + jsaddle-clib = doJailbreak (build-from-json "jsaddle-clib" "${jsaddle-src}/jsaddle-clib"); + jsaddle-warp = dontCheck (doJailbreak (build-from-json "jsaddle-warp" "${jsaddle-src}/jsaddle-warp")); + }; - # 2. Patch 'dynamic-library-dirs' in package confs to point to the symlink dir - for f in $packageConfDir/*.conf; do - sed -i "s,dynamic-library-dirs: .*,dynamic-library-dirs: $out/lib/links," $f - done - - # 3. Recache package database - ghc-pkg --package-db="$packageConfDir" recache - ''; - } else {})); - } // import ./overrides.nix { inherit options filterPredicate lib cabal2nixResult self super; }; }; - drv = builtins.getAttr package overrides; -in if reflex-platform.nixpkgs.lib.inNixShell then - reflex-platform.workOn overrides drv -else - drv +in rec { + inherit reflex-platform fetch-github-json overrides nixpkgs pkgs; + colonnade = overrides.colonnade; + siphon = overrides.siphon; + reflex-dom-colonnade = overrides.reflex-dom-colonnade; + lucid-colonnade = overrides.lucid-colonnade; + blaze-colonnade = overrides.blaze-colonnade; + yesod-colonnade = overrides.yesod-colonnade; +} diff --git a/nix/gtk2hs-buildtools.nix b/nix/gtk2hs-buildtools.nix new file mode 100644 index 0000000..725ef00 --- /dev/null +++ b/nix/gtk2hs-buildtools.nix @@ -0,0 +1,20 @@ +{ mkDerivation, alex, array, base, Cabal, containers, directory +, filepath, happy, hashtables, pretty, process, random, stdenv +}: +mkDerivation { + pname = "gtk2hs-buildtools"; + version = "0.13.4.0"; + sha256 = "0f3e6ba90839efd43efe8cecbddb6478a55e2ce7788c57a0add4df477dede679"; + isLibrary = true; + isExecutable = true; + enableSeparateDataOutput = true; + libraryHaskellDepends = [ + array base Cabal containers directory filepath hashtables pretty + process random + ]; + libraryToolDepends = [ alex happy ]; + executableHaskellDepends = [ base ]; + homepage = "http://projects.haskell.org/gtk2hs/"; + description = "Tools to build the Gtk2Hs suite of User Interface libraries"; + license = stdenv.lib.licenses.gpl2; +} diff --git a/nix/jsaddle.json b/nix/jsaddle.json new file mode 100644 index 0000000..c71a65f --- /dev/null +++ b/nix/jsaddle.json @@ -0,0 +1,6 @@ +{ + "owner": "ghcjs", + "repo": "jsaddle", + "rev": "b423436565fce7f69a65d843c71fc52dc455bf54", + "sha256": "09plndkh5wnbqi34x3jpaz0kjdjgyf074faf5xk97rsm81vhz8kk" +} diff --git a/reflex-dom-colonnade/default.nix b/reflex-dom-colonnade/default.nix index 457863f..07b1c13 100644 --- a/reflex-dom-colonnade/default.nix +++ b/reflex-dom-colonnade/default.nix @@ -1,5 +1,8 @@ -{ test ? "true" }: -let parseBool = str: with builtins; - let json = fromJSON str; in if isBool json then json else throw "nix parseBool: ${str} is not a bool."; +{ frontend ? false }: +let + pname = "reflex-dom-colonnade"; + main = (import ../nix/default.nix { + inherit frontend; + }); in -import ../nix/default.nix { package = "reflex-dom-colonnade"; frontend = false; test = parseBool test; } + main.${pname} diff --git a/reflex-dom-colonnade/shell.nix b/reflex-dom-colonnade/shell.nix new file mode 100644 index 0000000..910b922 --- /dev/null +++ b/reflex-dom-colonnade/shell.nix @@ -0,0 +1 @@ +(import ./. {}).env