Decided it would be best if hydra just provided the latest stable nixpkgs for us to use. This way there is no need for an udpate script that polutes our logs with update submodule commits.
150 lines
5.6 KiB
Nix
150 lines
5.6 KiB
Nix
with builtins;
|
|
|
|
# This duplicates the overlay code in nixpkgs/pkgs/top-level/impure.nix (may require periodic resyncing).
|
|
#
|
|
# It has to be done this way because passing overlays to nixpkgs (required to insert our packages) disables all the
|
|
# default overlay mechanisms (required to pickup any user or system overlays).
|
|
|
|
let
|
|
|
|
# overlaysDefault - List of overlay functions nixpkgs would normally use if not provided.
|
|
#
|
|
# This is the order overlays are searched for in accordance to what is done in nixpkgs. If an overlay is found
|
|
# at a given level (the leading number) the search is stopped and they are used. If multiple overlays are found
|
|
# at a given level then an error is generated.
|
|
#
|
|
# 1. <nixpkgs-overlays> (i.e., nixpkgs-overlays.nix or nixpkgs-overlays/default.nix in NIX_PATH)
|
|
# 2. ~/.config/nixpkgs/overlays.nix
|
|
# 2. ~/.config/nixpkgs/overlays
|
|
#
|
|
# This code is lifted directly from nixpkgs/pkgs/top-level/impure.nix to ensure consistency.
|
|
#
|
|
overlaysDefault =
|
|
let
|
|
|
|
# try expression default - Replace expression with default on exception.
|
|
try = x: def: let res = tryEval x; in if res.success then res.value else def;
|
|
|
|
# isDir path - Is path a directory (requires access).
|
|
isDir = path: pathExists (path + "/.");
|
|
|
|
# overlaysRetrieve path - Retrieve a list of the overlay functions from path.
|
|
# path is file - import the file itself (should give a list of overlay functions)
|
|
# path is directory - list of imports of all the *.nix files in the directory (each should give an overlay function)
|
|
#
|
|
overlaysRetrieve = path:
|
|
if isDir path then
|
|
let content = readDir path; in
|
|
map (n: import (path + ("/" + n)))
|
|
(builtins.filter (n: builtins.match ".*\\.nix" n != null || pathExists (path + ("/" + n + "/default.nix")))
|
|
(attrNames content))
|
|
else
|
|
import path;
|
|
|
|
# pathOverlays - NIX_PATH nixpkgs-overlays file or "" if not found
|
|
pathOverlays = try <nixpkgs-overlays> "";
|
|
|
|
# homeDir - ~/
|
|
# homeOverlaysFile - ~/.config/nixpkgs/overlays.nix
|
|
# homeOverlaysDir - ~/.config/nixpkgs/overlays
|
|
#
|
|
homeDir = builtins.getEnv "HOME";
|
|
homeOverlaysFile = homeDir + "/.config/nixpkgs/overlays.nix";
|
|
homeOverlaysDir = homeDir + "/.config/nixpkgs/overlays";
|
|
|
|
in
|
|
|
|
if pathOverlays != "" && pathExists pathOverlays then overlaysRetrieve pathOverlays
|
|
else if pathExists homeOverlaysFile && pathExists homeOverlaysDir then
|
|
throw ''
|
|
Nixpkgs overlays can be specified with ${homeOverlaysFile} or ${homeOverlaysDir}, but not both.
|
|
Please remove one of them and try again.
|
|
''
|
|
else if pathExists homeOverlaysFile then
|
|
if isDir homeOverlaysFile then
|
|
throw (homeOverlaysFile + " should be a file")
|
|
else overlaysRetrieve homeOverlaysFile
|
|
else if pathExists homeOverlaysDir then
|
|
if !(isDir homeOverlaysDir) then
|
|
throw (homeOverlaysDir + " should be a directory")
|
|
else overlaysRetrieve homeOverlaysDir
|
|
else [];
|
|
|
|
|
|
# overlaysAlways - List of overlay functions provide by this package.
|
|
#
|
|
# The naming in this function is misleading but consistent with nixpkgs.
|
|
#
|
|
# self - final package set (stack fully closed) (-> pkgs in all-packages.nix)
|
|
# super - prior package set (stack closed up to us)
|
|
# res - next package set (stack closed up to and over us) (-> self in all-packages.nix)
|
|
#
|
|
overlaysAlways =
|
|
let
|
|
# knot - Feed final and up to and over us overlay results into overlay
|
|
#
|
|
# This matches what is done in nixpkgs (see pkgs/top-level/stage.nix).
|
|
#
|
|
knot = path: self: super:
|
|
let res = import path res self; in res;
|
|
in
|
|
map knot [
|
|
./temporary/all-temporary.nix
|
|
./pkgs/all-packages.nix
|
|
];
|
|
|
|
# nixpkgs - The underlying nixpkg to use.
|
|
#
|
|
# Get a usable nixpkgs, that is, one with a version that matches ours, or die.
|
|
#
|
|
nixpkgs =
|
|
let
|
|
|
|
# first check list - Return first element of list that passes check list otherwise aborts.
|
|
#
|
|
first = check: list:
|
|
if list == []
|
|
then builtins.throw ''
|
|
Unable to locate a suitable nixpkgs directory.
|
|
Most likely you want to git clone one into the top of the repo as 'upstream'.
|
|
''
|
|
else if check ( builtins.head list )
|
|
then builtins.head list
|
|
else first check ( builtins.tail list );
|
|
|
|
# okay path - Check if path exist and match our version number and otherwise print a warning.
|
|
#
|
|
# Version numbers are taken from ./version files.
|
|
#
|
|
okay =
|
|
let
|
|
version = builtins.readFile ./.version;
|
|
in
|
|
path:
|
|
( builtins.pathExists (path + /.version)
|
|
&& ( builtins.readFile (path + /.version) == version
|
|
|| builtins.trace ''
|
|
Skipping ${path} as not version ${version}.
|
|
'' false ) );
|
|
|
|
# paths - Paths to search for nixpkgs.
|
|
#
|
|
paths = [
|
|
./upstream # 1. build channel or git cloned one directly associated with us takes priority
|
|
<nixpkgs/upstream> # 2. if the channel is a version of ourselves the real one will be in a subdirectory
|
|
<nixpkgs> # 3. otherwise maybe the channel is a nixpkgs proper
|
|
];
|
|
|
|
in
|
|
|
|
first okay paths;
|
|
|
|
in
|
|
|
|
{ overlays ? overlaysDefault
|
|
, upstream ? nixpkgs
|
|
, ... } @ args:
|
|
|
|
import upstream ( builtins.removeAttrs args [ "upstream" ]
|
|
// { overlays = overlaysAlways ++ overlays; } )
|