diff options
author | Ben Sima <ben@bsima.me> | 2024-04-01 13:30:45 -0400 |
---|---|---|
committer | Ben Sima <ben@bsima.me> | 2024-04-01 13:30:45 -0400 |
commit | db373a8c727cad91d375b40a6c70b11ed73bdafb (patch) | |
tree | a7ed24e98242b6e38f44cb0c9884718d248cc613 /Biz/Bild/Builder.nix | |
parent | 5c8ef1bf4dff4fc7c6e66a57673a81477bcc850a (diff) |
Add nixfmt to Lint.hs
nixfmt is the soon-to-be official formatter for Nix code, as per the NixOS
GitHub group. So I figure I should just adopt it without worrying too much about
the specifics of the formatting. I just formatted everything in one go, hence
the huge diff, oh well.
Diffstat (limited to 'Biz/Bild/Builder.nix')
-rw-r--r-- | Biz/Bild/Builder.nix | 258 |
1 files changed, 134 insertions, 124 deletions
diff --git a/Biz/Bild/Builder.nix b/Biz/Bild/Builder.nix index 959d176..d2e6875 100644 --- a/Biz/Bild/Builder.nix +++ b/Biz/Bild/Builder.nix @@ -1,148 +1,158 @@ -/* -This is the library of nix builders. Some rules to follow: -- Keep this code as minimal as possible. I'd rather write Haskell than Nix, - wouldn't you? -- Try to reuse as much upstream Nix as possible. +/* This is the library of nix builders. Some rules to follow: + - Keep this code as minimal as possible. I'd rather write Haskell than Nix, + wouldn't you? + - Try to reuse as much upstream Nix as possible. */ -{ analysisJSON, nixpkgs ? import ../Bild.nix {} }: +{ analysisJSON, nixpkgs ? import ../Bild.nix { } }: with nixpkgs; let analysis = builtins.fromJSON analysisJSON; - build = _: target: let - name = target.out; - root = builtins.getEnv "CODEROOT"; - mainModule = target.mainModule; - compileLine = - lib.strings.concatStringsSep " " ([target.compiler] ++ target.compilerFlags); + build = _: target: + let + name = target.out; + root = builtins.getEnv "CODEROOT"; + mainModule = target.mainModule; + compileLine = lib.strings.concatStringsSep " " + ([ target.compiler ] ++ target.compilerFlags); - allSources = target.srcs ++ [target.quapath]; + allSources = target.srcs ++ [ target.quapath ]; - isEmpty = x: x == null || x == []; + isEmpty = x: x == null || x == [ ]; - skip = ["_" ".direnv"]; - filter = file: type: - if lib.lists.elem (builtins.baseNameOf file) skip then false - # TODO: this means any new directory will cause a rebuild. this bad. i - # should recurse into the directory and match against the srcs. for now I - # just use preBuild to delete empty dirs - else if type == "directory" then true - else if type == "regular" then lib.trivial.pipe file - [ (f: lib.strings.removePrefix "${root}/" f) - (f: lib.lists.elem f allSources) - ] - else false; + skip = [ "_" ".direnv" ]; + filter = file: type: + if lib.lists.elem (builtins.baseNameOf file) skip then + false + # TODO: this means any new directory will cause a rebuild. this bad. i + # should recurse into the directory and match against the srcs. for now I + # just use preBuild to delete empty dirs + else if type == "directory" then + true + else if type == "regular" then + lib.trivial.pipe file [ + (f: lib.strings.removePrefix "${root}/" f) + (f: lib.lists.elem f allSources) + ] + else + false; - # remove empty directories, leftover from the src filter - preBuild = "find . -type d -empty -delete"; + # remove empty directories, leftover from the src filter + preBuild = "find . -type d -empty -delete"; - src = lib.sources.cleanSourceWith {inherit filter; src = lib.sources.cleanSource root;}; + src = lib.sources.cleanSourceWith { + inherit filter; + src = lib.sources.cleanSource root; + }; - langdeps_ = - if isEmpty target.langdeps then - [] + langdeps_ = if isEmpty target.langdeps then + [ ] else - lib.attrsets.attrVals - target.langdeps - (lib.attrsets.getAttrFromPath (lib.strings.splitString "." target.packageSet) bild); + lib.attrsets.attrVals target.langdeps (lib.attrsets.getAttrFromPath + (lib.strings.splitString "." target.packageSet) bild); - sysdeps_ = - if isEmpty target.sysdeps then - [] + sysdeps_ = if isEmpty target.sysdeps then + [ ] else lib.attrsets.attrVals target.sysdeps pkgs; - rundeps_ = - if isEmpty target.rundeps then - [] + rundeps_ = if isEmpty target.rundeps then + [ ] else lib.attrsets.attrVals target.rundeps bild.pkgs; - CODEROOT = "."; + CODEROOT = "."; - builders = { - base = stdenv.mkDerivation rec { - inherit name src CODEROOT preBuild; - buildInputs = langdeps_ ++ sysdeps_; - installPhase = "install -D ${name} $out/bin/${name}"; - buildPhase = compileLine; - }; + builders = { + base = stdenv.mkDerivation rec { + inherit name src CODEROOT preBuild; + buildInputs = langdeps_ ++ sysdeps_; + installPhase = "install -D ${name} $out/bin/${name}"; + buildPhase = compileLine; + }; - haskell = stdenv.mkDerivation rec { - inherit name src CODEROOT preBuild; - nativeBuildInputs = [ makeWrapper ]; - buildInputs = sysdeps_ ++ [ - (bild.haskell.ghcWith (p: - (lib.attrsets.attrVals target.langdeps p) - )) - ]; - buildPhase = compileLine; - installPhase = '' - install -D ${name} $out/bin/${name} - wrapProgram $out/bin/${name} \ - --prefix PATH : ${lib.makeBinPath rundeps_} - ''; - }; + haskell = stdenv.mkDerivation rec { + inherit name src CODEROOT preBuild; + nativeBuildInputs = [ makeWrapper ]; + buildInputs = sysdeps_ ++ [ + (bild.haskell.ghcWith + (p: (lib.attrsets.attrVals target.langdeps p))) + ]; + buildPhase = compileLine; + installPhase = '' + install -D ${name} $out/bin/${name} + wrapProgram $out/bin/${name} \ + --prefix PATH : ${lib.makeBinPath rundeps_} + ''; + }; - c = stdenv.mkDerivation rec { - inherit name src CODEROOT preBuild; - buildInputs = langdeps_ ++ sysdeps_; - installPhase = "install -D ${name} $out/bin/${name}"; - buildPhase = lib.strings.concatStringsSep " " [ - compileLine - (if isEmpty langdeps_ then "" else - "$(pkg-config --cflags ${lib.strings.concatStringsSep " " target.langdeps})") - (if isEmpty sysdeps_ then "" else - "$(pkg-config --libs ${lib.strings.concatStringsSep " " target.sysdeps})") - ]; - }; + c = stdenv.mkDerivation rec { + inherit name src CODEROOT preBuild; + buildInputs = langdeps_ ++ sysdeps_; + installPhase = "install -D ${name} $out/bin/${name}"; + buildPhase = lib.strings.concatStringsSep " " [ + compileLine + (if isEmpty langdeps_ then + "" + else + "$(pkg-config --cflags ${ + lib.strings.concatStringsSep " " target.langdeps + })") + (if isEmpty sysdeps_ then + "" + else + "$(pkg-config --libs ${ + lib.strings.concatStringsSep " " target.sysdeps + })") + ]; + }; - python = bild.python.buildPythonApplication rec { - inherit name src CODEROOT; - propagatedBuildInputs = langdeps_ ++ sysdeps_; - buildInputs = sysdeps_; - nativeCheckInputs = [ black mypy ruff ]; - checkPhase = '' - check() { - $@ || { echo "fail: $name: $3"; exit 1; } - } - cp ${../../pyproject.toml} ./pyproject.toml - check python -m black --quiet --exclude 'setup\.py$' --check . - check ${ruff}/bin/ruff check . - touch ./py.typed - check python -m mypy \ - --explicit-package-bases \ - --no-error-summary \ - --exclude 'setup\.py$' \ - . - check python -m ${mainModule} test - ''; - preBuild = '' - # remove empty directories, leftover from the src filter - find . -type d -empty -delete - # initialize remaining dirs as python modules - find . -type d -exec touch {}/__init__.py \; - # generate a minimal setup.py - cat > setup.py << EOF - from setuptools import setup, find_packages - setup( - name='${name}', - entry_points={'console_scripts':['${name} = ${mainModule}:main']}, - version='0.0.0', - url='git://simatime.com/biz.git', - author='dev', - author_email='dev@simatime.com', - description='nil', - packages=find_packages(), - install_requires=[], - ) - EOF - ''; - pythonImportsCheck = [mainModule]; # sanity check + python = bild.python.buildPythonApplication rec { + inherit name src CODEROOT; + propagatedBuildInputs = langdeps_ ++ sysdeps_; + buildInputs = sysdeps_; + nativeCheckInputs = [ black mypy ruff ]; + checkPhase = '' + check() { + $@ || { echo "fail: $name: $3"; exit 1; } + } + cp ${../../pyproject.toml} ./pyproject.toml + check python -m black --quiet --exclude 'setup\.py$' --check . + check ${ruff}/bin/ruff check . + touch ./py.typed + check python -m mypy \ + --explicit-package-bases \ + --no-error-summary \ + --exclude 'setup\.py$' \ + . + check python -m ${mainModule} test + ''; + preBuild = '' + # remove empty directories, leftover from the src filter + find . -type d -empty -delete + # initialize remaining dirs as python modules + find . -type d -exec touch {}/__init__.py \; + # generate a minimal setup.py + cat > setup.py << EOF + from setuptools import setup, find_packages + setup( + name='${name}', + entry_points={'console_scripts':['${name} = ${mainModule}:main']}, + version='0.0.0', + url='git://simatime.com/biz.git', + author='dev', + author_email='dev@simatime.com', + description='nil', + packages=find_packages(), + install_requires=[], + ) + EOF + ''; + pythonImportsCheck = [ mainModule ]; # sanity check + }; }; - }; - in builders.${target.builder}; -# the bild caller gives us the Analysis type, which is a hashmap, but i need to -# return a single drv, so just take the first one for now. ideally i would only -# pass Target, one at a time, (perhaps parallelized in haskell land) and then i -# wouldn't need all of this let nesting + in builders.${target.builder}; + # the bild caller gives us the Analysis type, which is a hashmap, but i need to + # return a single drv, so just take the first one for now. ideally i would only + # pass Target, one at a time, (perhaps parallelized in haskell land) and then i + # wouldn't need all of this let nesting in builtins.head (lib.attrsets.mapAttrsToList build analysis) |