From 2e082edd6164d6b8d381b4c0d683277b3c0b2286 Mon Sep 17 00:00:00 2001 From: Moritz Angermann Date: Wed, 20 Feb 2019 16:16:24 +0800 Subject: [PATCH 1/4] Adds sublib test --- test/cabal-sublib/Main.hs | 4 + test/cabal-sublib/Setup.hs | 2 + test/cabal-sublib/cabal-sublib.cabal | 41 ++++++++++ test/cabal-sublib/cabal-sublib.nix | 33 ++++++++ test/cabal-sublib/default.nix | 67 ++++++++++++++++ test/cabal-sublib/plan.nix | 111 +++++++++++++++++++++++++++ test/default.nix | 1 + 7 files changed, 259 insertions(+) create mode 100644 test/cabal-sublib/Main.hs create mode 100644 test/cabal-sublib/Setup.hs create mode 100644 test/cabal-sublib/cabal-sublib.cabal create mode 100644 test/cabal-sublib/cabal-sublib.nix create mode 100644 test/cabal-sublib/default.nix create mode 100644 test/cabal-sublib/plan.nix diff --git a/test/cabal-sublib/Main.hs b/test/cabal-sublib/Main.hs new file mode 100644 index 0000000000..65ae4a05d5 --- /dev/null +++ b/test/cabal-sublib/Main.hs @@ -0,0 +1,4 @@ +module Main where + +main :: IO () +main = putStrLn "Hello, Haskell!" diff --git a/test/cabal-sublib/Setup.hs b/test/cabal-sublib/Setup.hs new file mode 100644 index 0000000000..9a994af677 --- /dev/null +++ b/test/cabal-sublib/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/test/cabal-sublib/cabal-sublib.cabal b/test/cabal-sublib/cabal-sublib.cabal new file mode 100644 index 0000000000..66ab36282c --- /dev/null +++ b/test/cabal-sublib/cabal-sublib.cabal @@ -0,0 +1,41 @@ +cabal-version: 2.2 +-- Initial package description 'cabal-simple.cabal' generated by 'cabal +-- init'. For further documentation, see +-- http://haskell.org/cabal/users-guide/ + +name: cabal-sublib +version: 0.1.0.0 +-- synopsis: +-- description: +-- bug-reports: +license: MIT +author: Moritz Angermann +maintainer: moritz.angermann@iohk.io +-- category: +build-type: Simple + +library + -- exposed-modules: + -- other-modules: + -- other-extensions: + build-depends: base >=4.11 && <4.12 + , slib + -- hs-source-dirs: + default-language: Haskell2010 + +library slib + build-depends: extra + , safe + , aeson + default-language: Haskell2010 + +executable cabal-sublib + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.11 && <4.12 + , cabal-sublib + , extra + , optparse-applicative + -- hs-source-dirs: + default-language: Haskell2010 diff --git a/test/cabal-sublib/cabal-sublib.nix b/test/cabal-sublib/cabal-sublib.nix new file mode 100644 index 0000000000..d0af18919d --- /dev/null +++ b/test/cabal-sublib/cabal-sublib.nix @@ -0,0 +1,33 @@ +{ system, compiler, flags, pkgs, hsPkgs, pkgconfPkgs, ... }: + { + flags = {}; + package = { + specVersion = "2.2"; + identifier = { name = "cabal-sublib"; version = "0.1.0.0"; }; + license = "MIT"; + copyright = ""; + maintainer = "moritz.angermann@iohk.io"; + author = "Moritz Angermann"; + homepage = ""; + url = ""; + synopsis = ""; + description = ""; + buildType = "Simple"; + }; + components = { + "library" = { depends = [ (hsPkgs.base) (hsPkgs.slib) ]; }; + sublibs = { + "slib" = { depends = [ (hsPkgs.extra) (hsPkgs.safe) (hsPkgs.aeson) ]; }; + }; + exes = { + "cabal-sublib" = { + depends = [ + (hsPkgs.base) + (hsPkgs.cabal-sublib) + (hsPkgs.extra) + (hsPkgs.optparse-applicative) + ]; + }; + }; + }; + } // rec { src = (pkgs.lib).mkDefault ./.; } diff --git a/test/cabal-sublib/default.nix b/test/cabal-sublib/default.nix new file mode 100644 index 0000000000..8b5f1d684d --- /dev/null +++ b/test/cabal-sublib/default.nix @@ -0,0 +1,67 @@ +# Test a package set +{ stdenv, util, mkPkgSet }: + +with stdenv.lib; + +let + ## steps to generate local files + # 1. cabal-to-nix cabal-sublib.cabal > cabal-sublib.nix + # 2. cabal new-build + # 3. plan-to-nix ./dist-newstyle/cache/plan.json > plan.nix + pkgSet = mkPkgSet { + pkg-def = import ./plan.nix; + pkg-def-overlays = [ + { cabal-sublib = ./cabal-sublib.nix; + } + ]; + modules = [ + { + # Package has no exposed modules which causes + # haddock: No input file(s) + packages.cabal-sublib.doHaddock = false; + } + ]; + }; + + packages = pkgSet.config.hsPkgs; + +in + stdenv.mkDerivation { + name = "cabal-sublib-test"; + + buildCommand = '' + exe="${packages.cabal-sublib.components.exes.cabal-sublib}/bin/cabal-sublib" + + size=$(command stat --format '%s' "$exe") + printf "size of executable $exe is $size. \n" >& 2 + + # fixme: run on target platform when cross-compiled + printf "checking whether executable runs... " >& 2 + $exe + + printf "checking that executable is dynamically linked to system libraries... " >& 2 + '' + optionalString stdenv.isLinux '' + ldd $exe | grep libpthread + '' + optionalString stdenv.isDarwin '' + otool -L $exe |grep .dylib + '' + '' + + printf "Checking that \"all\" component has the programs... " >& 2 + all_exe="${packages.cabal-sublib.components.all}/bin/cabal-sublib" + test -f "$all_exe" + echo "$all_exe" >& 2 + + touch $out + ''; + + meta.platforms = platforms.all; + + passthru = { + # Used for debugging with nix repl + inherit pkgSet packages; + + # Used for testing externally with nix-shell (../tests.sh). + # This just adds cabal-install to the existing shells. + test-shell = util.addCabalInstall packages.cabal-sublib.components.all; + }; +} diff --git a/test/cabal-sublib/plan.nix b/test/cabal-sublib/plan.nix new file mode 100644 index 0000000000..dead4b6b3f --- /dev/null +++ b/test/cabal-sublib/plan.nix @@ -0,0 +1,111 @@ +hackage: + { + packages = { + "binary".revision = hackage."binary"."0.8.5.1".revisions.default; + "ghc-prim".revision = hackage."ghc-prim"."0.5.2.0".revisions.default; + "extra".revision = hackage."extra"."1.6.14".revisions.default; + "stm".revision = hackage."stm"."2.4.5.1".revisions.default; + "unix".revision = hackage."unix"."2.7.2.2".revisions.default; + "rts".revision = hackage."rts"."1.0".revisions.default; + "clock".revision = hackage."clock"."0.7.2".revisions.default; + "clock".flags.llvm = false; + "scientific".revision = hackage."scientific"."0.3.6.2".revisions.default; + "scientific".flags.integer-simple = false; + "scientific".flags.bytestring-builder = false; + "deepseq".revision = hackage."deepseq"."1.4.3.0".revisions.default; + "random".revision = hackage."random"."1.1".revisions.default; + "uuid-types".revision = hackage."uuid-types"."1.0.3".revisions.default; + "optparse-applicative".revision = hackage."optparse-applicative"."0.14.3.0".revisions.default; + "dlist".revision = hackage."dlist"."0.8.0.5".revisions.default; + "directory".revision = hackage."directory"."1.3.1.5".revisions.default; + "transformers-compat".revision = hackage."transformers-compat"."0.6.2".revisions.default; + "transformers-compat".flags.five = false; + "transformers-compat".flags.generic-deriving = true; + "transformers-compat".flags.two = false; + "transformers-compat".flags.five-three = true; + "transformers-compat".flags.mtl = true; + "transformers-compat".flags.four = false; + "transformers-compat".flags.three = false; + "template-haskell".revision = hackage."template-haskell"."2.13.0.0".revisions.default; + "vector".revision = hackage."vector"."0.12.0.2".revisions.default; + "vector".flags.unsafechecks = false; + "vector".flags.internalchecks = false; + "vector".flags.wall = false; + "vector".flags.boundschecks = true; + "primitive".revision = hackage."primitive"."0.6.4.0".revisions.default; + "time-locale-compat".revision = hackage."time-locale-compat"."0.1.1.5".revisions.default; + "time-locale-compat".flags.old-locale = false; + "safe".revision = hackage."safe"."0.3.17".revisions.default; + "base-compat".revision = hackage."base-compat"."0.10.5".revisions.default; + "ansi-terminal".revision = hackage."ansi-terminal"."0.8.2".revisions.default; + "ansi-terminal".flags.example = false; + "tagged".revision = hackage."tagged"."0.8.6".revisions.default; + "tagged".flags.transformers = true; + "tagged".flags.deepseq = true; + "containers".revision = hackage."containers"."0.5.11.0".revisions.default; + "integer-logarithms".revision = hackage."integer-logarithms"."1.0.2.2".revisions.default; + "integer-logarithms".flags.check-bounds = false; + "integer-logarithms".flags.integer-gmp = true; + "bytestring".revision = hackage."bytestring"."0.10.8.2".revisions.default; + "ansi-wl-pprint".revision = hackage."ansi-wl-pprint"."0.6.8.2".revisions.default; + "ansi-wl-pprint".flags.example = false; + "StateVar".revision = hackage."StateVar"."1.1.1.1".revisions.default; + "contravariant".revision = hackage."contravariant"."1.5".revisions.default; + "contravariant".flags.semigroups = true; + "contravariant".flags.tagged = true; + "contravariant".flags.statevar = true; + "contravariant".flags.safe = false; + "text".revision = hackage."text"."1.2.3.1".revisions.default; + "unordered-containers".revision = hackage."unordered-containers"."0.2.9.0".revisions.default; + "unordered-containers".flags.debug = false; + "base".revision = hackage."base"."4.11.1.0".revisions.default; + "time".revision = hackage."time"."1.8.0.2".revisions.default; + "transformers".revision = hackage."transformers"."0.5.5.0".revisions.default; + "hashable".revision = hackage."hashable"."1.2.7.0".revisions.default; + "hashable".flags.sse2 = true; + "hashable".flags.integer-gmp = true; + "hashable".flags.sse41 = false; + "hashable".flags.examples = false; + "attoparsec".revision = hackage."attoparsec"."0.13.2.2".revisions.default; + "attoparsec".flags.developer = false; + "colour".revision = hackage."colour"."2.3.4".revisions.default; + "filepath".revision = hackage."filepath"."1.4.2".revisions.default; + "process".revision = hackage."process"."1.6.3.0".revisions.default; + "pretty".revision = hackage."pretty"."1.1.3.6".revisions.default; + "aeson".revision = hackage."aeson"."1.4.2.0".revisions.default; + "aeson".flags.cffi = false; + "aeson".flags.fast = false; + "aeson".flags.bytestring-builder = false; + "aeson".flags.developer = false; + "ghc-boot-th".revision = hackage."ghc-boot-th"."8.4.4".revisions.default; + "th-abstraction".revision = hackage."th-abstraction"."0.2.10.0".revisions.default; + "array".revision = hackage."array"."0.5.2.0".revisions.default; + "integer-gmp".revision = hackage."integer-gmp"."1.0.2.0".revisions.default; + }; + compiler = { + version = "8.4.4"; + nix-name = "ghc844"; + packages = { + "binary" = "0.8.5.1"; + "ghc-prim" = "0.5.2.0"; + "stm" = "2.4.5.1"; + "unix" = "2.7.2.2"; + "rts" = "1.0"; + "deepseq" = "1.4.3.0"; + "directory" = "1.3.1.5"; + "template-haskell" = "2.13.0.0"; + "containers" = "0.5.11.0"; + "bytestring" = "0.10.8.2"; + "text" = "1.2.3.1"; + "base" = "4.11.1.0"; + "time" = "1.8.0.2"; + "transformers" = "0.5.5.0"; + "filepath" = "1.4.2"; + "process" = "1.6.3.0"; + "pretty" = "1.1.3.6"; + "ghc-boot-th" = "8.4.4"; + "array" = "0.5.2.0"; + "integer-gmp" = "1.0.2.0"; + }; + }; + } diff --git a/test/default.nix b/test/default.nix index d9b6b256bd..9a592f1454 100644 --- a/test/default.nix +++ b/test/default.nix @@ -11,6 +11,7 @@ let in { cabal-simple = callPackage ./cabal-simple { inherit (haskell) mkPkgSet; inherit util; }; + cabal-sublib = callPackage ./cabal-sublib { inherit (haskell) mkPkgSet; inherit util; }; cabal-22 = callPackage ./cabal-22 { inherit (haskell) mkPkgSet; }; with-packages = callPackage ./with-packages { inherit (haskell) mkPkgSet; inherit util; }; builder-haddock = callPackage ./builder-haddock { inherit (haskell) mkPkgSet; }; From 9ad251593f09c91e39e663b130ced9f663d0ce11 Mon Sep 17 00:00:00 2001 From: Moritz Angermann Date: Fri, 22 Feb 2019 10:54:40 +0800 Subject: [PATCH 2/4] WIP: does not work :-/ --- modules/plan.nix | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/plan.nix b/modules/plan.nix index 82849848ae..afc65ba8f0 100644 --- a/modules/plan.nix +++ b/modules/plan.nix @@ -53,8 +53,9 @@ with types; let m = if revision == null then (abort "${name} has no revision!") - else revision modArgs; - in m // { flags = lib.mapAttrs (_: lib.mkDefault) (m.flags // revArgs.flags or {}); } + else revision (modArgs // { hsPkgs = hsPkgs // (mapAttrs (l: _: hsPkgs.${name}.components.${l})); }); + in + m // { flags = lib.mapAttrs (_: lib.mkDefault) (m.flags // revArgs.flags or {}); } ) (lib.filterAttrs (n: v: v == null || v.revision != null ) module.packages); }; } From ba1f53866189fe20d22d17793507625ac19c12a8 Mon Sep 17 00:00:00 2001 From: Moritz Angermann Date: Fri, 22 Feb 2019 12:33:06 +0800 Subject: [PATCH 3/4] almost --- builder/comp-builder.nix | 4 ++-- modules/plan.nix | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/builder/comp-builder.nix b/builder/comp-builder.nix index 97eaa0ce59..f22d756b1e 100644 --- a/builder/comp-builder.nix +++ b/builder/comp-builder.nix @@ -45,7 +45,7 @@ let flatDepends = let - makePairs = map (p: rec { key="${val}"; val=p.components.library; }); + makePairs = map (p: rec { key="${val}"; val=(p.components.library or p); }); closure = builtins.genericClosure { startSet = makePairs component.depends; operator = {val,...}: makePairs val.config.depends; @@ -104,7 +104,7 @@ let cat > $out/ghc-environment < Date: Fri, 22 Feb 2019 14:57:21 +0800 Subject: [PATCH 4/4] Make it work! --- builder/comp-builder.nix | 12 +++++++++++- lib/default.nix | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/builder/comp-builder.nix b/builder/comp-builder.nix index f22d756b1e..5931ad64f9 100644 --- a/builder/comp-builder.nix +++ b/builder/comp-builder.nix @@ -294,13 +294,23 @@ stdenv.mkDerivation ({ ''; # Note: Cabal does *not* copy test executables during the `install` phase. + # + # Note 2: if a package contains multiple libs (lib + sublibs) SETUP register will generate a + # folder isntead of a file for the configuration. Therfore if the result is a folder, + # we need to register each and every element of that folder. installPhase = '' runHook preInstall $SETUP_HS copy ${lib.concatStringsSep " " component.setupInstallFlags} ${lib.optionalString (haskellLib.isLibrary componentId || haskellLib.isAll componentId) '' $SETUP_HS register --gen-pkg-config=${name}.conf ${ghc.targetPrefix}ghc-pkg -v0 init $out/package.conf.d - ${ghc.targetPrefix}ghc-pkg -v0 --package-db ${configFiles}/package.conf.d -f $out/package.conf.d register ${name}.conf + if [ -d "${name}.conf" ]; then + for pkg in ${name}.conf/*; do + ${ghc.targetPrefix}ghc-pkg -v0 --package-db ${configFiles}/package.conf.d -f $out/package.conf.d register "$pkg" + done + else + ${ghc.targetPrefix}ghc-pkg -v0 --package-db ${configFiles}/package.conf.d -f $out/package.conf.d register ${name}.conf + fi ''} ${lib.optionalString (haskellLib.isTest componentId || haskellLib.isAll componentId) '' mkdir -p $out/${name} diff --git a/lib/default.nix b/lib/default.nix index 3d89d779cc..06dd919b28 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -31,7 +31,7 @@ with haskellLib; componentPrefix = { # Are all of these right? - sublibs = "sublib"; + sublibs = "lib"; foreignlibs = "foreignlib"; exes = "exe"; tests = "test";