summary refs log tree commit diff
path: root/lib/systems
diff options
context:
space:
mode:
authorGraham Christensen <graham@grahamc.com>2017-07-28 20:05:35 -0400
committerGraham Christensen <graham@grahamc.com>2017-09-16 21:36:43 -0400
commit152c63c9ff82276e225ac4a4fa71c791d33e443d (patch)
tree0755fd329430e64c6eacfdf4d45e75693ea824ae /lib/systems
parent4d205eb0444996b1939ab9e495201912a3316b36 (diff)
downloadnixpkgs-152c63c9ff82276e225ac4a4fa71c791d33e443d.tar
nixpkgs-152c63c9ff82276e225ac4a4fa71c791d33e443d.tar.gz
nixpkgs-152c63c9ff82276e225ac4a4fa71c791d33e443d.tar.bz2
nixpkgs-152c63c9ff82276e225ac4a4fa71c791d33e443d.tar.lz
nixpkgs-152c63c9ff82276e225ac4a4fa71c791d33e443d.tar.xz
nixpkgs-152c63c9ff82276e225ac4a4fa71c791d33e443d.tar.zst
nixpkgs-152c63c9ff82276e225ac4a4fa71c791d33e443d.zip
Convert libs to a fixed-point
This does break the API of being able to import any lib file and get
its libs, however I'm not sure people did this.

I made this while exploring being able to swap out docFn with a stub
in #2305, to avoid functor performance problems. I don't know if that
is going to move forward (or if it is a problem or not,) but after
doing all this work figured I'd put it up anyway :)

Two notable advantages to this approach:

1. when a lib inherits another lib's functions, it doesn't
   automatically get put in to the scope of lib
2. when a lib implements a new obscure functions, it doesn't
   automatically get put in to the scope of lib

Using the test script (later in this commit) I got the following diff
on the API:

  + diff master fixed-lib
  11764a11765,11766
  > .types.defaultFunctor
  > .types.defaultTypeMerge
  11774a11777,11778
  > .types.isOptionType
  > .types.isType
  11781a11786
  > .types.mkOptionType
  11788a11794
  > .types.setType
  11795a11802
  > .types.types

This means that this commit _adds_ to the API, however I can't find a
way to fix these last remaining discrepancies. At least none are
_removed_.

Test script (run with nix-repl in the PATH):

  #!/bin/sh

  set -eux

  repl() {
      suff=${1:-}
      echo "(import ./lib)$suff" \
          | nix-repl 2>&1
  }

  attrs_to_check() {
      repl "${1:-}" \
          | tr ';'  $'\n' \
          | grep "\.\.\." \
          | cut -d' ' -f2 \
          | sed -e "s/^/${1:-}./" \
          | sort
  }

  summ() {
      repl "${1:-}" \
          | tr ' ' $'\n' \
          | sort \
          | uniq
  }

  deep_summ() {
      suff="${1:-}"
      depth="${2:-4}"
      depth=$((depth - 1))
      summ "$suff"

      for attr in $(attrs_to_check "$suff" | grep -v "types.types"); do
          if [ $depth -eq 0 ]; then
              summ "$attr" | sed -e "s/^/$attr./"
          else
              deep_summ "$attr" "$depth" | sed -e "s/^/$attr./"
          fi
      done
  }

  (
      cd nixpkgs

      #git add .
      #git commit -m "Auto-commit, sorry" || true
      git checkout fixed-lib
      deep_summ > ../fixed-lib
      git checkout master
      deep_summ > ../master
  )

  if diff master fixed-lib; then
      echo "SHALLOW MATCH!"
  fi

  (
      cd nixpkgs
      git checkout fixed-lib
      repl .types
  )
Diffstat (limited to 'lib/systems')
-rw-r--r--lib/systems/default.nix13
-rw-r--r--lib/systems/doubles.nix9
-rw-r--r--lib/systems/examples.nix4
-rw-r--r--lib/systems/inspect.nix7
-rw-r--r--lib/systems/parse.nix11
-rw-r--r--lib/systems/platforms.nix1
6 files changed, 24 insertions, 21 deletions
diff --git a/lib/systems/default.nix b/lib/systems/default.nix
index c22c9956196..22166f611f9 100644
--- a/lib/systems/default.nix
+++ b/lib/systems/default.nix
@@ -1,11 +1,12 @@
-let inherit (import ../attrsets.nix) mapAttrs; in
+{ lib }:
+  let inherit (lib.attrsets) mapAttrs; in
 
 rec {
-  doubles = import ./doubles.nix;
-  parse = import ./parse.nix;
-  inspect = import ./inspect.nix;
-  platforms = import ./platforms.nix;
-  examples = import ./examples.nix;
+  doubles = import ./doubles.nix { inherit lib; };
+  parse = import ./parse.nix { inherit lib; };
+  inspect = import ./inspect.nix { inherit lib; };
+  platforms = import ./platforms.nix { inherit lib; };
+  examples = import ./examples.nix { inherit lib; };
 
   # Elaborate a `localSystem` or `crossSystem` so that it contains everything
   # necessary.
diff --git a/lib/systems/doubles.nix b/lib/systems/doubles.nix
index ac1a199d80c..0cae8ec56fd 100644
--- a/lib/systems/doubles.nix
+++ b/lib/systems/doubles.nix
@@ -1,8 +1,9 @@
+{ lib }:
 let
-  lists = import ../lists.nix;
-  parse = import ./parse.nix;
-  inherit (import ./inspect.nix) predicates;
-  inherit (import ../attrsets.nix) matchAttrs;
+  inherit (lib) lists;
+  parse = import ./parse.nix { inherit lib; };
+  inherit (import ./inspect.nix { inherit lib; }) predicates;
+  inherit (lib.attrsets) matchAttrs;
 
   all = [
     "aarch64-linux"
diff --git a/lib/systems/examples.nix b/lib/systems/examples.nix
index e394f43831c..ff2273febcb 100644
--- a/lib/systems/examples.nix
+++ b/lib/systems/examples.nix
@@ -1,8 +1,8 @@
 # These can be passed to nixpkgs as either the `localSystem` or
 # `crossSystem`. They are put here for user convenience, but also used by cross
 # tests and linux cross stdenv building, so handle with care!
-
-let platforms = import ./platforms.nix; in
+{ lib }:
+let platforms = import ./platforms.nix { inherit lib; }; in
 
 rec {
   #
diff --git a/lib/systems/inspect.nix b/lib/systems/inspect.nix
index 2d5353341f5..a4fa9af4e0a 100644
--- a/lib/systems/inspect.nix
+++ b/lib/systems/inspect.nix
@@ -1,6 +1,7 @@
-with import ./parse.nix;
-with import ../attrsets.nix;
-with import ../lists.nix;
+{ lib }:
+with import ./parse.nix { inherit lib; };
+with lib.attrsets;
+with lib.lists;
 
 rec {
   patterns = rec {
diff --git a/lib/systems/parse.nix b/lib/systems/parse.nix
index 438d83685db..d14ca04bfb9 100644
--- a/lib/systems/parse.nix
+++ b/lib/systems/parse.nix
@@ -4,14 +4,13 @@
 # http://llvm.org/docs/doxygen/html/Triple_8cpp_source.html especially
 # Triple::normalize. Parsing should essentially act as a more conservative
 # version of that last function.
-
-with import ../lists.nix;
-with import ../types.nix;
-with import ../attrsets.nix;
-with (import ./inspect.nix).predicates;
+{ lib }:
+with lib.lists;
+with lib.types;
+with lib.attrsets;
+with (import ./inspect.nix { inherit lib; }).predicates;
 
 let
-  lib = import ../default.nix;
   setTypesAssert = type: pred:
     mapAttrs (name: value:
       assert pred value;
diff --git a/lib/systems/platforms.nix b/lib/systems/platforms.nix
index 54ed8f3c12c..7aeb4d88e51 100644
--- a/lib/systems/platforms.nix
+++ b/lib/systems/platforms.nix
@@ -1,3 +1,4 @@
+{ lib }:
 rec {
   pcBase = {
     name = "pc";