From 5c8f99a33bc836fba5013c8705e4ae35d8aeb96d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Giraudeau Date: Tue, 18 Jan 2022 11:55:11 +0100 Subject: [PATCH] Bump nixpkgs, haskell.nix, iohk-nix and index-state --- cabal.project | 2 +- nix/default.nix | 9 +++--- nix/haskell.nix | 8 ++--- nix/sources.json | 24 ++++----------- nix/sources.nix | 80 +++++++++++++++++++++++++++++++++++------------- 5 files changed, 73 insertions(+), 50 deletions(-) diff --git a/cabal.project b/cabal.project index 166ae1f..b750287 100644 --- a/cabal.project +++ b/cabal.project @@ -1,4 +1,4 @@ -index-state: 2021-01-10T00:00:00Z +index-state: 2022-01-17T00:00:00Z packages: ./metadata-lib diff --git a/nix/default.nix b/nix/default.nix index 2e220a4..49d8637 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -7,19 +7,18 @@ let sources = import ./sources.nix { inherit pkgs; } // sourcesOverride; iohkNix = import sources.iohk-nix {}; - haskellNix = import sources."haskell.nix" {}; + haskellNix = import sources."haskell.nix" { inherit system; }; # use our own nixpkgs if it exists in our sources, # otherwise use iohkNix default nixpkgs. nixpkgs = if (sources ? nixpkgs) then (builtins.trace "Not using IOHK default nixpkgs (use 'niv drop nixpkgs' to use default for better sharing)" sources.nixpkgs) - else (builtins.trace "Using IOHK default nixpkgs" - iohkNix.nixpkgs); + else haskellNix.sources.nixpkgs-2105; # for inclusion in pkgs: overlays = # Haskell.nix (https://github.com/input-output-hk/haskell.nix) - haskellNix.overlays + haskellNix.nixpkgsArgs.overlays # haskell-nix.haskellLib.extra: some useful extra utility functions for haskell.nix ++ iohkNix.overlays.haskell-nix-extra # iohkNix: nix utilities and niv: @@ -40,7 +39,7 @@ let pkgs = import nixpkgs { inherit system crossSystem overlays; - config = haskellNix.config // config; + config = haskellNix.nixpkgsArgs.config // config; }; in pkgs diff --git a/nix/haskell.nix b/nix/haskell.nix index 1c7b673..b5c9a3c 100644 --- a/nix/haskell.nix +++ b/nix/haskell.nix @@ -17,7 +17,7 @@ , borsBuild ? null # Version info, to be passed when not building from a git work tree , gitrev ? null -, libsodium ? pkgs.libsodium +, libsodium-vrf ? pkgs.libsodium-vrf }: let haskell = pkgs.haskell-nix; @@ -31,7 +31,7 @@ let pkg-set = haskell-nix.cabalProject ({ inherit src; - compiler-nix-name = "ghc8102"; + compiler-nix-name = "ghc8107"; modules = [ # Add source filtering to local packages { @@ -68,7 +68,7 @@ let # Musl libc fully static build (lib.optionalAttrs stdenv.hostPlatform.isMusl (let - staticLibs = with pkgs; [ zlib openssl libffi gmp6 libsodium ]; + staticLibs = with pkgs; [ zlib openssl libffi gmp6 libsodium-vrf ]; # Module options which add GHC flags and libraries for a fully static build fullyStaticOptions = { @@ -135,7 +135,7 @@ let # the revision is sourced from the local git work tree. setGitRev = ''${haskellBuildUtils}/bin/set-git-rev "${gitrev'}" $out/bin/*''; # package with libsodium: - setLibSodium = "ln -s ${libsodium}/bin/libsodium-23.dll $out/bin/libsodium-23.dll"; + setLibSodium = "ln -s ${libsodium-vrf}/bin/libsodium-23.dll $out/bin/libsodium-23.dll"; gitrev' = if (gitrev == null) then buildPackages.commonLib.commitIdFromGitRepoOrZero ../.git else gitrev; diff --git a/nix/sources.json b/nix/sources.json index 470d98b..b5e410d 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -5,10 +5,10 @@ "homepage": "https://input-output-hk.github.io/haskell.nix", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "ebf59e4fc32b5e4bdef64b1f2bdf4e9733721533", - "sha256": "189fq5ijvbkh4i6a3fbl9blmjfllwq5ryhkkaajndbns4jvcdyg9", + "rev": "e3ff467e13d3803edec242c8368be2d7e134991b", + "sha256": "11m69ljrvvc26fk0s4zg5arhphxpvgvhdn0zw6qwyr30i5i0lpvp", "type": "tarball", - "url": "https://github.com/input-output-hk/haskell.nix/archive/ebf59e4fc32b5e4bdef64b1f2bdf4e9733721533.tar.gz", + "url": "https://github.com/input-output-hk/haskell.nix/archive/e3ff467e13d3803edec242c8368be2d7e134991b.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "iohk-nix": { @@ -17,22 +17,10 @@ "homepage": null, "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "5b86d63a0b59b7666d19901b654d8fbde27d9500", - "sha256": "1mfb93nnw0x4gyq93v6lh6h7imliw4j0wp5l9gpdafy3rw621xzb", + "rev": "a878d7fe8607c762f2a961bc87f8882e0485d37a", + "sha256": "0bhjr7rwvxib0jmq31hxmisgmb3di2ml9p8s6lfg2j7x57c3c7fw", "type": "tarball", - "url": "https://github.com/input-output-hk/iohk-nix/archive/5b86d63a0b59b7666d19901b654d8fbde27d9500.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "niv": { - "branch": "master", - "description": "Easy dependency management for Nix projects", - "homepage": "https://github.com/nmattia/niv", - "owner": "nmattia", - "repo": "niv", - "rev": "9d35b9e4837ab88517210b1701127612c260eccf", - "sha256": "0q50xhnm8g2yfyakrh0nly4swyygxpi0a8cb9gp65wcakcgvzvdh", - "type": "tarball", - "url": "https://github.com/nmattia/niv/archive/9d35b9e4837ab88517210b1701127612c260eccf.tar.gz", + "url": "https://github.com/input-output-hk/iohk-nix/archive/a878d7fe8607c762f2a961bc87f8882e0485d37a.tar.gz", "url_template": "https://github.com///archive/.tar.gz" } } diff --git a/nix/sources.nix b/nix/sources.nix index 7bd0f3e..1938409 100644 --- a/nix/sources.nix +++ b/nix/sources.nix @@ -6,25 +6,33 @@ let # The fetchers. fetch_ fetches specs of type . # - fetch_file = pkgs: spec: - if spec.builtin or true then - builtins_fetchurl { inherit (spec) url sha256; } - else - pkgs.fetchurl { inherit (spec) url sha256; }; + fetch_file = pkgs: name: spec: + let + name' = sanitizeName name + "-src"; + in + if spec.builtin or true then + builtins_fetchurl { inherit (spec) url sha256; name = name'; } + else + pkgs.fetchurl { inherit (spec) url sha256; name = name'; }; fetch_tarball = pkgs: name: spec: let - ok = str: ! builtins.isNull (builtins.match "[a-zA-Z0-9+-._?=]" str); - # sanitize the name, though nix will still fail if name starts with period - name' = stringAsChars (x: if ! ok x then "-" else x) "${name}-src"; + name' = sanitizeName name + "-src"; in if spec.builtin or true then builtins_fetchTarball { name = name'; inherit (spec) url sha256; } else pkgs.fetchzip { name = name'; inherit (spec) url sha256; }; - fetch_git = spec: - builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; }; + fetch_git = name: spec: + let + ref = + if spec ? ref then spec.ref else + if spec ? branch then "refs/heads/${spec.branch}" else + if spec ? tag then "refs/tags/${spec.tag}" else + abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"; + in + builtins.fetchGit { url = spec.repo; inherit (spec) rev; inherit ref; }; fetch_local = spec: spec.path; @@ -40,11 +48,21 @@ let # Various helpers # + # https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695 + sanitizeName = name: + ( + concatMapStrings (s: if builtins.isList s then "-" else s) + ( + builtins.split "[^[:alnum:]+._?=-]+" + ((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name) + ) + ); + # The set of packages used when specs are fetched using non-builtins. - mkPkgs = sources: + mkPkgs = sources: system: let sourcesNixpkgs = - import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {}; + import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; }; hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath; hasThisAsNixpkgsPath = == ./.; in @@ -64,15 +82,27 @@ let if ! builtins.hasAttr "type" spec then abort "ERROR: niv spec ${name} does not have a 'type' attribute" - else if spec.type == "file" then fetch_file pkgs spec + else if spec.type == "file" then fetch_file pkgs name spec else if spec.type == "tarball" then fetch_tarball pkgs name spec - else if spec.type == "git" then fetch_git spec + else if spec.type == "git" then fetch_git name spec else if spec.type == "local" then fetch_local spec else if spec.type == "builtin-tarball" then fetch_builtin-tarball name else if spec.type == "builtin-url" then fetch_builtin-url name else abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}"; + # If the environment variable NIV_OVERRIDE_${name} is set, then use + # the path directly as opposed to the fetched source. + replace = name: drv: + let + saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name; + ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}"; + in + if ersatz == "" then drv else + # this turns the string into an actual Nix path (for both absolute and + # relative paths) + if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}"; + # Ports of functions for older nix versions # a Nix version of mapAttrs if the built-in doesn't exist @@ -89,25 +119,29 @@ let # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269 stringAsChars = f: s: concatStrings (map f (stringToCharacters s)); + concatMapStrings = f: list: concatStrings (map f list); concatStrings = builtins.concatStringsSep ""; + # https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331 + optionalAttrs = cond: as: if cond then as else {}; + # fetchTarball version that is compatible between all the versions of Nix - builtins_fetchTarball = { url, name, sha256 }@attrs: + builtins_fetchTarball = { url, name ? null, sha256 }@attrs: let inherit (builtins) lessThan nixVersion fetchTarball; in if lessThan nixVersion "1.12" then - fetchTarball { inherit name url; } + fetchTarball ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; })) else fetchTarball attrs; # fetchurl version that is compatible between all the versions of Nix - builtins_fetchurl = { url, sha256 }@attrs: + builtins_fetchurl = { url, name ? null, sha256 }@attrs: let inherit (builtins) lessThan nixVersion fetchurl; in if lessThan nixVersion "1.12" then - fetchurl { inherit url; } + fetchurl ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; })) else fetchurl attrs; @@ -119,14 +153,15 @@ let then abort "The values in sources.json should not have an 'outPath' attribute" else - spec // { outPath = fetch config.pkgs name spec; } + spec // { outPath = replace name (fetch config.pkgs name spec); } ) config.sources; # The "config" used by the fetchers mkConfig = - { sourcesFile ? ./sources.json - , sources ? builtins.fromJSON (builtins.readFile sourcesFile) - , pkgs ? mkPkgs sources + { sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null + , sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile) + , system ? builtins.currentSystem + , pkgs ? mkPkgs sources system }: rec { # The sources, i.e. the attribute set of spec name to spec inherit sources; @@ -134,5 +169,6 @@ let # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers inherit pkgs; }; + in mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }