Skip to content

Instantly share code, notes, and snippets.

@tomprince
Created September 1, 2021 00:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomprince/9a6cff05222dfaf59577f6b9fd07d0f3 to your computer and use it in GitHub Desktop.
Save tomprince/9a6cff05222dfaf59577f6b9fd07d0f3 to your computer and use it in GitHub Desktop.
PEP517 requirements in mach-nix
{mach-nix, pkgs ? import <nixpkgs> {}, lib ? pkgs.lib}:
let
extract-metadata = import ./extract-metadata.nix { inherit lib mkPython pkgs; };
buildPythonApplication = {...}@args: let
metadata = extract-metadata { inherit (args) python src providers; };
requirements = lib.concatStringsSep "\n" metadata.requires_dist;
in
mach-nix.buildPythonApplication ({ inherit requirements; } // args);
in
buildPythonApplication { ... };
{lib, mkPython, pkgs}: {src, python, providers}:
let
pyproject-toml = "${src}/pyproject.toml";
default-build-system = {
requires = ["setuptools >= 40.8.0" "wheel"];
build-backend = "setuptools.build_meta:__legacy__";
};
build-system = if builtins.pathExists pyproject-toml then
let
toml = builtins.fromTOML (builtins.readFile pyproject-toml);
in toml.build-system
else default-build-system;
base-env = mkPython {
inherit python providers;
requirements = ''
pep517
importlib-metadata >= 4.0.0
'';
};
build-env = mkPython {
inherit python providers;
requirements = lib.concatStringsSep "\n" build-system.requires;
};
extract = let
args = lib.escapeShellArgs [build-env.interpreter build-system.build-backend build-system.backend-path or ""];
in pkgs.runCommand "python-metadata.json" {}
''
${base-env.interpreter} ${./extract-metadata.py} $out ${src} ${args}
'';
in
builtins.fromJSON (builtins.readFile extract)
import json
import sys
from importlib_metadata import Distribution
from pep517.wrappers import Pep517HookCaller
_, out, source, python, backend, backend_path = sys.argv
hooks = Pep517HookCaller(
source, build_backend=backend, python_executable=python, backend_path=backend_path
)
dist = Distribution.at(hooks.prepare_metadata_for_build_wheel("."))
with open(out, "x") as f:
json.dump(dist.metadata.json, f)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment