tahoe-lafs/default.nix

137 lines
5.2 KiB
Nix

let
# sources.nix contains information about which versions of some of our
# dependencies we should use. since we use it to pin nixpkgs and the PyPI
# package database, roughly all the rest of our dependencies are *also*
# pinned - indirectly.
#
# sources.nix is managed using a tool called `niv`. as an example, to
# update to the most recent version of nixpkgs from the 21.11 maintenance
# release, in the top-level tahoe-lafs checkout directory you run:
#
# niv update nixpkgs-21.11
#
# or, to update the PyPI package database -- which is necessary to make any
# newly released packages visible -- you likewise run:
#
# niv update pypi-deps-db
#
# niv also supports chosing a specific revision, following a different
# branch, etc. find complete documentation for the tool at
# https://github.com/nmattia/niv
sources = import nix/sources.nix;
in
{
pkgsVersion ? "nixpkgs-21.11" # a string which chooses a nixpkgs from the
# niv-managed sources data
, pkgs ? import sources.${pkgsVersion} { } # nixpkgs itself
, pypiData ? sources.pypi-deps-db # the pypi package database snapshot to use
# for dependency resolution
, pythonVersion ? "python37" # a string choosing the python derivation from
# nixpkgs to target
, extras ? [ "tor" "i2p" ] # a list of strings identifying tahoe-lafs extras,
# the dependencies of which the resulting package
# will also depend on. Include all of the runtime
# extras by default because the incremental cost of
# including them is a lot smaller than the cost of
# re-building the whole thing to add them.
, mach-nix ? import sources.mach-nix { # the mach-nix package to use to build
# the tahoe-lafs package
inherit pkgs pypiData;
python = pythonVersion;
}
}:
# The project name, version, and most other metadata are automatically
# extracted from the source. Some requirements are not properly extracted
# and those cases are handled below. The version can only be extracted if
# `setup.py update_version` has been run (this is not at all ideal but it
# seems difficult to fix) - so for now just be sure to run that first.
mach-nix.buildPythonPackage rec {
# Define the location of the Tahoe-LAFS source to be packaged. We can't
src = pkgs.lib.cleanSourceWith {
# Define our own filter because we need to keep the whole `.git` directory
# for setuptools-scm. :/
filter = name: type:
let baseName = baseNameOf (toString name);
in ! (
baseName == "__pycache__" ||
baseName == ".hypothesis" ||
baseName == ".tox" ||
baseName == ".mypy_cache" ||
pkgs.lib.hasPrefix "_trial_temp" baseName ||
pkgs.lib.hasSuffix ".pyc" baseName ||
pkgs.lib.hasSuffix ".pyo" baseName ||
pkgs.lib.hasSuffix "~" baseName ||
type == "symlink" ||
type == "unknown"
);
src = ./.;
};
# The name and most other metadata can be discovered from the package
# metadata files. However, setuptools-scm is too tricky for mach-nix so we
# have to duplicate the version information here.
version = "1.18.1.post1";
pythonImportsCheck = [ "allmydata" ];
# This is really a check but I can't get checks to run. I think mach-nix
# works hard to disable them.
#
# Check that the nix and Python package metadata are roughly in agreement
# regarding the version information.
postInstall = ''
python -c "
from allmydata import __version__ as v
w = '${version}'
print(v)
print(w)
raise SystemExit(v.split('.')[:3] != w.split('.')[:3])
"
'';
nativeBuildInputs = [
pkgs.git
];
# Select whichever package extras were requested.
inherit extras;
# Define some extra requirements that mach-nix does not automatically detect
# from inspection of the source. We typically don't need to put version
# constraints on any of these requirements. The pypi-deps-db we're
# operating with makes dependency resolution deterministic so as long as it
# works once it will always work. It could be that in the future we update
# pypi-deps-db and an incompatibility arises - in which case it would make
# sense to apply some version constraints here.
requirementsExtra = ''
# mach-nix does not yet support pyproject.toml which means it misses any
# build-time requirements of our dependencies which are declared in such a
# file. Tell it about them here.
setuptools_rust
setuptools_scm
'';
# Specify where mach-nix should find packages for our Python dependencies.
# There are some reasonable defaults so we only need to specify certain
# packages where the default configuration runs into some issue.
providers = {
};
# Define certain overrides to the way Python dependencies are built.
_ = {
# Remove a click-default-group patch for a test suite problem which no
# longer applies because the project apparently no longer has a test suite
# in its source distribution.
click-default-group.patches = [];
};
passthru.meta.mach-nix = {
inherit providers _;
};
}