tvl-depot/users/Profpatsch/writers/default.nix
Profpatsch 37883389bc feat(users/Profpatsch): add writeHaskellInteractive
Instead of compiling the module, run it in interpreted mode. Saves on
linking times and can probably be driven to do cooler things in the
future, like calling functions directly via an environment variable or
something.

Change-Id: I9c835005462cdd86055fb7702630a44f78c36107
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7781
Autosubmit: Profpatsch <mail@profpatsch.de>
Reviewed-by: Profpatsch <mail@profpatsch.de>
Tested-by: BuildkiteCI
2023-01-06 18:12:41 +00:00

120 lines
2.8 KiB
Nix
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ depot, pkgs, lib, ... }:
let
bins = depot.nix.getBins pkgs.s6-portable-utils [ "s6-mkdir" "s6-cat" "s6-ln" "s6-ls" "s6-touch" ]
// depot.nix.getBins pkgs.coreutils [ "printf" ];
inherit (depot.nix.yants) defun struct restrict attrs list string drv any;
inherit (depot.nix) drvSeqL;
FlakeError =
restrict
"flake error"
(s: lib.any (prefix: (builtins.substring 0 1 s) == prefix)
[ "E" "W" ])
string;
Libraries = defun [ (attrs any) (list drv) ];
pythonPackages = pkgs.python310Packages;
buildPythonPackages = pkgs.buildPackages.python310Packages;
python = pythonPackages.python;
python3 =
{ name
, libraries ? (_: [ ])
, flakeIgnore ? [ ]
}:
let
in
pkgs.writers.makePythonWriter python pythonPackages buildPythonPackages name {
libraries = Libraries libraries pythonPackages;
flakeIgnore =
let
ignoreTheseErrors = [
# whitespace after {
"E201"
# whitespace before }
"E202"
# fuck 4-space indentation
"E121"
"E111"
# who cares about blank lines …
# … at end of files
"W391"
# … between functions
"E302"
"E305"
# … if theres too many of them
"E303"
# or lines that are too long
"E501"
];
in
list FlakeError (ignoreTheseErrors ++ flakeIgnore);
};
# TODO: add the same flake check as the pyhon3 writer
python3Lib = { name, libraries ? (_: [ ]) }: moduleString:
let
srcTree = depot.nix.runExecline.local name { stdin = moduleString; } [
"importas"
"out"
"out"
"if"
[ bins.s6-mkdir "-p" "\${out}/${name}" ]
"if"
[
"redirfd"
"-w"
"1"
"\${out}/setup.py"
bins.printf
''
from distutils.core import setup
setup(
name='%s',
packages=['%s']
)
''
name
name
]
"if"
[
# redirect stdin to the init py
"redirfd"
"-w"
"1"
"\${out}/${name}/__init__.py"
bins.s6-cat
]
];
in
pythonPackages.buildPythonPackage {
inherit name;
src = srcTree;
propagatedBuildInputs = libraries pythonPackages;
doCheck = false;
};
ghcBins = libraries: depot.nix.getBins (pkgs.ghc.withPackages (_: libraries)) [ "runghc" ];
writeHaskellInteractive = name: { libraries, ghcArgs ? [ ] }: path:
depot.nix.writeExecline name { } ([
(ghcBins libraries).runghc
"--"
] ++ ghcArgs ++ [
"--"
path
]);
in
{
inherit
python3
python3Lib
writeHaskellInteractive
;
}