on iko/ghcjs-patch-master help sign in
Adds sublib support (#63)
8ffa7cdMoritz Angermann
builder/comp-builder.nix+13−3
@@ -46,7 +46,7 @@ let
46
46
47 flatDepends =
47 flatDepends =
48 let
48 let
49− makePairs = map (p: rec { key="${val}"; val=p.components.library; });
49+ makePairs = map (p: rec { key="${val}"; val=(p.components.library or p); });
50 closure = builtins.genericClosure {
50 closure = builtins.genericClosure {
51 startSet = makePairs component.depends;
51 startSet = makePairs component.depends;
52 operator = {val,...}: makePairs val.config.depends;
52 operator = {val,...}: makePairs val.config.depends;
@@ -105,7 +105,7 @@ let
105 cat > $out/ghc-environment <<EOF
105 cat > $out/ghc-environment <<EOF
106 package-db $out/package.conf.d
106 package-db $out/package.conf.d
107 EOF
107 EOF
108− ${lib.concatMapStringsSep "\n" (p: envDep "--package-db ${p.components.library}/package.conf.d" p.identifier.name) component.depends}
108+ ${lib.concatMapStringsSep "\n" (p: envDep "--package-db ${p.components.library or p}/package.conf.d" p.identifier.name) component.depends}
109 ${lib.concatMapStringsSep "\n" (envDep "") (lib.remove "ghc" nonReinstallablePkgs)}
109 ${lib.concatMapStringsSep "\n" (envDep "") (lib.remove "ghc" nonReinstallablePkgs)}
110
110
111 '' + lib.optionalString component.doExactConfig ''
111 '' + lib.optionalString component.doExactConfig ''
@@ -299,13 +299,23 @@ stdenv.mkDerivation ({
299 '';
299 '';
300
300
301 # Note: Cabal does *not* copy test executables during the `install` phase.
301 # Note: Cabal does *not* copy test executables during the `install` phase.
302+ #
303+ # Note 2: if a package contains multiple libs (lib + sublibs) SETUP register will generate a
304+ # folder isntead of a file for the configuration. Therfore if the result is a folder,
305+ # we need to register each and every element of that folder.
302 installPhase = ''
306 installPhase = ''
303 runHook preInstall
307 runHook preInstall
304 $SETUP_HS copy ${lib.concatStringsSep " " component.setupInstallFlags}
308 $SETUP_HS copy ${lib.concatStringsSep " " component.setupInstallFlags}
305 ${lib.optionalString (haskellLib.isLibrary componentId || haskellLib.isAll componentId) ''
309 ${lib.optionalString (haskellLib.isLibrary componentId || haskellLib.isAll componentId) ''
306 $SETUP_HS register --gen-pkg-config=${name}.conf
310 $SETUP_HS register --gen-pkg-config=${name}.conf
307 ${ghc.targetPrefix}ghc-pkg -v0 init $out/package.conf.d
311 ${ghc.targetPrefix}ghc-pkg -v0 init $out/package.conf.d
312+ if [ -d "${name}.conf" ]; then
313+ for pkg in ${name}.conf/*; do
314+ ${ghc.targetPrefix}ghc-pkg -v0 --package-db ${configFiles}/package.conf.d -f $out/package.conf.d register "$pkg"
315+ done
316+ else
308− ${ghc.targetPrefix}ghc-pkg -v0 --package-db ${configFiles}/package.conf.d -f $out/package.conf.d register ${name}.conf
317+ ${ghc.targetPrefix}ghc-pkg -v0 --package-db ${configFiles}/package.conf.d -f $out/package.conf.d register ${name}.conf
318+ fi
309 ''}
319 ''}
310 ${lib.optionalString (haskellLib.isTest componentId || haskellLib.isAll componentId) ''
320 ${lib.optionalString (haskellLib.isTest componentId || haskellLib.isAll componentId) ''
311 mkdir -p $out/${name}
321 mkdir -p $out/${name}
lib/default.nix+1−1
@@ -31,7 +31,7 @@ with haskellLib;
31
31
32 componentPrefix = {
32 componentPrefix = {
33 # Are all of these right?
33 # Are all of these right?
34− sublibs = "sublib";
34+ sublibs = "lib";
35 foreignlibs = "foreignlib";
35 foreignlibs = "foreignlib";
36 exes = "exe";
36 exes = "exe";
37 tests = "test";
37 tests = "test";
modules/plan.nix+3−2
@@ -53,8 +53,9 @@ with types;
53
53
54 let m = if revision == null
54 let m = if revision == null
55 then (abort "${name} has no revision!")
55 then (abort "${name} has no revision!")
56− else revision modArgs;
56+ else revision (modArgs // { hsPkgs = hsPkgs // (mapAttrs (l: _: hsPkgs.${name}.components.sublibs.${l}) (m.components.sublibs or {})); });
57+ in
57− in m // { flags = lib.mapAttrs (_: lib.mkDefault) (m.flags // revArgs.flags or {}); }
58+ m // { flags = lib.mapAttrs (_: lib.mkDefault) (m.flags // revArgs.flags or {}); }
58 ) (lib.filterAttrs (n: v: v == null || v.revision != null ) module.packages);
59 ) (lib.filterAttrs (n: v: v == null || v.revision != null ) module.packages);
59 };
60 };
60}
61}
test/cabal-sublib/Main.hsnew file+4
@@ -0,0 +1,4 @@
1+module Main where
2+
3+main :: IO ()
4+main = putStrLn "Hello, Haskell!"
test/cabal-sublib/Setup.hsnew file+2
@@ -0,0 +1,2 @@
1+import Distribution.Simple
2+main = defaultMain
test/cabal-sublib/cabal-sublib.cabalnew file+41
@@ -0,0 +1,41 @@
1+cabal-version: 2.2
2+-- Initial package description 'cabal-simple.cabal' generated by 'cabal
3+-- init'. For further documentation, see
4+-- http://haskell.org/cabal/users-guide/
5+
6+name: cabal-sublib
7+version: 0.1.0.0
8+-- synopsis:
9+-- description:
10+-- bug-reports:
11+license: MIT
12+author: Moritz Angermann
13+maintainer: moritz.angermann@iohk.io
14+-- category:
15+build-type: Simple
16+
17+library
18+ -- exposed-modules:
19+ -- other-modules:
20+ -- other-extensions:
21+ build-depends: base >=4.11 && <4.12
22+ , slib
23+ -- hs-source-dirs:
24+ default-language: Haskell2010
25+
26+library slib
27+ build-depends: extra
28+ , safe
29+ , aeson
30+ default-language: Haskell2010
31+
32+executable cabal-sublib
33+ main-is: Main.hs
34+ -- other-modules:
35+ -- other-extensions:
36+ build-depends: base >=4.11 && <4.12
37+ , cabal-sublib
38+ , extra
39+ , optparse-applicative
40+ -- hs-source-dirs:
41+ default-language: Haskell2010
test/cabal-sublib/cabal-sublib.nixnew file+33
@@ -0,0 +1,33 @@
1+{ system, compiler, flags, pkgs, hsPkgs, pkgconfPkgs, ... }:
2+ {
3+ flags = {};
4+ package = {
5+ specVersion = "2.2";
6+ identifier = { name = "cabal-sublib"; version = "0.1.0.0"; };
7+ license = "MIT";
8+ copyright = "";
9+ maintainer = "moritz.angermann@iohk.io";
10+ author = "Moritz Angermann";
11+ homepage = "";
12+ url = "";
13+ synopsis = "";
14+ description = "";
15+ buildType = "Simple";
16+ };
17+ components = {
18+ "library" = { depends = [ (hsPkgs.base) (hsPkgs.slib) ]; };
19+ sublibs = {
20+ "slib" = { depends = [ (hsPkgs.extra) (hsPkgs.safe) (hsPkgs.aeson) ]; };
21+ };
22+ exes = {
23+ "cabal-sublib" = {
24+ depends = [
25+ (hsPkgs.base)
26+ (hsPkgs.cabal-sublib)
27+ (hsPkgs.extra)
28+ (hsPkgs.optparse-applicative)
29+ ];
30+ };
31+ };
32+ };
33+ } // rec { src = (pkgs.lib).mkDefault ./.; }
test/cabal-sublib/default.nixnew file+67
@@ -0,0 +1,67 @@
1+# Test a package set
2+{ stdenv, util, mkPkgSet }:
3+
4+with stdenv.lib;
5+
6+let
7+ ## steps to generate local files
8+ # 1. cabal-to-nix cabal-sublib.cabal > cabal-sublib.nix
9+ # 2. cabal new-build
10+ # 3. plan-to-nix ./dist-newstyle/cache/plan.json > plan.nix
11+ pkgSet = mkPkgSet {
12+ pkg-def = import ./plan.nix;
13+ pkg-def-overlays = [
14+ { cabal-sublib = ./cabal-sublib.nix;
15+ }
16+ ];
17+ modules = [
18+ {
19+ # Package has no exposed modules which causes
20+ # haddock: No input file(s)
21+ packages.cabal-sublib.doHaddock = false;
22+ }
23+ ];
24+ };
25+
26+ packages = pkgSet.config.hsPkgs;
27+
28+in
29+ stdenv.mkDerivation {
30+ name = "cabal-sublib-test";
31+
32+ buildCommand = ''
33+ exe="${packages.cabal-sublib.components.exes.cabal-sublib}/bin/cabal-sublib"
34+
35+ size=$(command stat --format '%s' "$exe")
36+ printf "size of executable $exe is $size. \n" >& 2
37+
38+ # fixme: run on target platform when cross-compiled
39+ printf "checking whether executable runs... " >& 2
40+ $exe
41+
42+ printf "checking that executable is dynamically linked to system libraries... " >& 2
43+ '' + optionalString stdenv.isLinux ''
44+ ldd $exe | grep libpthread
45+ '' + optionalString stdenv.isDarwin ''
46+ otool -L $exe |grep .dylib
47+ '' + ''
48+
49+ printf "Checking that \"all\" component has the programs... " >& 2
50+ all_exe="${packages.cabal-sublib.components.all}/bin/cabal-sublib"
51+ test -f "$all_exe"
52+ echo "$all_exe" >& 2
53+
54+ touch $out
55+ '';
56+
57+ meta.platforms = platforms.all;
58+
59+ passthru = {
60+ # Used for debugging with nix repl
61+ inherit pkgSet packages;
62+
63+ # Used for testing externally with nix-shell (../tests.sh).
64+ # This just adds cabal-install to the existing shells.
65+ test-shell = util.addCabalInstall packages.cabal-sublib.components.all;
66+ };
67+}
test/cabal-sublib/plan.nixnew file+111
@@ -0,0 +1,111 @@
1+hackage:
2+ {
3+ packages = {
4+ "binary".revision = hackage."binary"."0.8.5.1".revisions.default;
5+ "ghc-prim".revision = hackage."ghc-prim"."0.5.2.0".revisions.default;
6+ "extra".revision = hackage."extra"."1.6.14".revisions.default;
7+ "stm".revision = hackage."stm"."2.4.5.1".revisions.default;
8+ "unix".revision = hackage."unix"."2.7.2.2".revisions.default;
9+ "rts".revision = hackage."rts"."1.0".revisions.default;
10+ "clock".revision = hackage."clock"."0.7.2".revisions.default;
11+ "clock".flags.llvm = false;
12+ "scientific".revision = hackage."scientific"."0.3.6.2".revisions.default;
13+ "scientific".flags.integer-simple = false;
14+ "scientific".flags.bytestring-builder = false;
15+ "deepseq".revision = hackage."deepseq"."1.4.3.0".revisions.default;
16+ "random".revision = hackage."random"."1.1".revisions.default;
17+ "uuid-types".revision = hackage."uuid-types"."1.0.3".revisions.default;
18+ "optparse-applicative".revision = hackage."optparse-applicative"."0.14.3.0".revisions.default;
19+ "dlist".revision = hackage."dlist"."0.8.0.5".revisions.default;
20+ "directory".revision = hackage."directory"."1.3.1.5".revisions.default;
21+ "transformers-compat".revision = hackage."transformers-compat"."0.6.2".revisions.default;
22+ "transformers-compat".flags.five = false;
23+ "transformers-compat".flags.generic-deriving = true;
24+ "transformers-compat".flags.two = false;
25+ "transformers-compat".flags.five-three = true;
26+ "transformers-compat".flags.mtl = true;
27+ "transformers-compat".flags.four = false;
28+ "transformers-compat".flags.three = false;
29+ "template-haskell".revision = hackage."template-haskell"."2.13.0.0".revisions.default;
30+ "vector".revision = hackage."vector"."0.12.0.2".revisions.default;
31+ "vector".flags.unsafechecks = false;
32+ "vector".flags.internalchecks = false;
33+ "vector".flags.wall = false;
34+ "vector".flags.boundschecks = true;
35+ "primitive".revision = hackage."primitive"."0.6.4.0".revisions.default;
36+ "time-locale-compat".revision = hackage."time-locale-compat"."0.1.1.5".revisions.default;
37+ "time-locale-compat".flags.old-locale = false;
38+ "safe".revision = hackage."safe"."0.3.17".revisions.default;
39+ "base-compat".revision = hackage."base-compat"."0.10.5".revisions.default;
40+ "ansi-terminal".revision = hackage."ansi-terminal"."0.8.2".revisions.default;
41+ "ansi-terminal".flags.example = false;
42+ "tagged".revision = hackage."tagged"."0.8.6".revisions.default;
43+ "tagged".flags.transformers = true;
44+ "tagged".flags.deepseq = true;
45+ "containers".revision = hackage."containers"."0.5.11.0".revisions.default;
46+ "integer-logarithms".revision = hackage."integer-logarithms"."1.0.2.2".revisions.default;
47+ "integer-logarithms".flags.check-bounds = false;
48+ "integer-logarithms".flags.integer-gmp = true;
49+ "bytestring".revision = hackage."bytestring"."0.10.8.2".revisions.default;
50+ "ansi-wl-pprint".revision = hackage."ansi-wl-pprint"."0.6.8.2".revisions.default;
51+ "ansi-wl-pprint".flags.example = false;
52+ "StateVar".revision = hackage."StateVar"."1.1.1.1".revisions.default;
53+ "contravariant".revision = hackage."contravariant"."1.5".revisions.default;
54+ "contravariant".flags.semigroups = true;
55+ "contravariant".flags.tagged = true;
56+ "contravariant".flags.statevar = true;
57+ "contravariant".flags.safe = false;
58+ "text".revision = hackage."text"."1.2.3.1".revisions.default;
59+ "unordered-containers".revision = hackage."unordered-containers"."0.2.9.0".revisions.default;
60+ "unordered-containers".flags.debug = false;
61+ "base".revision = hackage."base"."4.11.1.0".revisions.default;
62+ "time".revision = hackage."time"."1.8.0.2".revisions.default;
63+ "transformers".revision = hackage."transformers"."0.5.5.0".revisions.default;
64+ "hashable".revision = hackage."hashable"."1.2.7.0".revisions.default;
65+ "hashable".flags.sse2 = true;
66+ "hashable".flags.integer-gmp = true;
67+ "hashable".flags.sse41 = false;
68+ "hashable".flags.examples = false;
69+ "attoparsec".revision = hackage."attoparsec"."0.13.2.2".revisions.default;
70+ "attoparsec".flags.developer = false;
71+ "colour".revision = hackage."colour"."2.3.4".revisions.default;
72+ "filepath".revision = hackage."filepath"."1.4.2".revisions.default;
73+ "process".revision = hackage."process"."1.6.3.0".revisions.default;
74+ "pretty".revision = hackage."pretty"."1.1.3.6".revisions.default;
75+ "aeson".revision = hackage."aeson"."1.4.2.0".revisions.default;
76+ "aeson".flags.cffi = false;
77+ "aeson".flags.fast = false;
78+ "aeson".flags.bytestring-builder = false;
79+ "aeson".flags.developer = false;
80+ "ghc-boot-th".revision = hackage."ghc-boot-th"."8.4.4".revisions.default;
81+ "th-abstraction".revision = hackage."th-abstraction"."0.2.10.0".revisions.default;
82+ "array".revision = hackage."array"."0.5.2.0".revisions.default;
83+ "integer-gmp".revision = hackage."integer-gmp"."1.0.2.0".revisions.default;
84+ };
85+ compiler = {
86+ version = "8.4.4";
87+ nix-name = "ghc844";
88+ packages = {
89+ "binary" = "0.8.5.1";
90+ "ghc-prim" = "0.5.2.0";
91+ "stm" = "2.4.5.1";
92+ "unix" = "2.7.2.2";
93+ "rts" = "1.0";
94+ "deepseq" = "1.4.3.0";
95+ "directory" = "1.3.1.5";
96+ "template-haskell" = "2.13.0.0";
97+ "containers" = "0.5.11.0";
98+ "bytestring" = "0.10.8.2";
99+ "text" = "1.2.3.1";
100+ "base" = "4.11.1.0";
101+ "time" = "1.8.0.2";
102+ "transformers" = "0.5.5.0";
103+ "filepath" = "1.4.2";
104+ "process" = "1.6.3.0";
105+ "pretty" = "1.1.3.6";
106+ "ghc-boot-th" = "8.4.4";
107+ "array" = "0.5.2.0";
108+ "integer-gmp" = "1.0.2.0";
109+ };
110+ };
111+ }
test/default.nix+1
@@ -11,6 +11,7 @@ let
11
11
12in {
12in {
13 cabal-simple = callPackage ./cabal-simple { inherit (haskell) mkPkgSet; inherit util; };
13 cabal-simple = callPackage ./cabal-simple { inherit (haskell) mkPkgSet; inherit util; };
14+ cabal-sublib = callPackage ./cabal-sublib { inherit (haskell) mkPkgSet; inherit util; };
14 cabal-22 = callPackage ./cabal-22 { inherit (haskell) mkPkgSet; };
15 cabal-22 = callPackage ./cabal-22 { inherit (haskell) mkPkgSet; };
15 with-packages = callPackage ./with-packages { inherit (haskell) mkPkgSet; inherit util; };
16 with-packages = callPackage ./with-packages { inherit (haskell) mkPkgSet; inherit util; };
16 builder-haddock = callPackage ./builder-haddock { inherit (haskell) mkPkgSet; };
17 builder-haddock = callPackage ./builder-haddock { inherit (haskell) mkPkgSet; };