summaryrefslogtreecommitdiff
path: root/Biz/Bild.nix
diff options
context:
space:
mode:
Diffstat (limited to 'Biz/Bild.nix')
-rw-r--r--Biz/Bild.nix156
1 files changed, 56 insertions, 100 deletions
diff --git a/Biz/Bild.nix b/Biz/Bild.nix
index ee0b1fe..1955d2c 100644
--- a/Biz/Bild.nix
+++ b/Biz/Bild.nix
@@ -1,79 +1,79 @@
{ nixpkgs ? import ./Bild/Nixpkgs.nix }:
-rec {
+let
constants = import ./Bild/Constants.nix;
+ lib = nixpkgs.lib;
+# put all of our stuff in the 'bild' namespace
+in nixpkgs // { bild = rec {
+ # provided by .envrc
+ root = builtins.getEnv "BIZ_ROOT";
- # internal usage
- private = {
- inherit nixpkgs;
+ inherit (nixpkgs) sources;
- # provided by .envrc
- root = builtins.getEnv "BIZ_ROOT";
+ haskell = rec {
+ inherit (constants) ghcCompiler;
- selectAttrs = deps: packageSet:
- nixpkgs.lib.attrsets.attrVals deps packageSet;
+ # all available packages
+ deps = import ./Bild/Deps/Haskell.nix;
+ packages = lib.attrsets.getAttrs deps nixpkgs.haskellPackages;
- # returns true if a is a subset of b, where a and b are attrsets
- subset = a: b: builtins.all
- (x: builtins.elem x b) a;
+ # make a ghc with dependencies
+ ghcWith = nixpkgs.haskell.packages.${ghcCompiler}.ghcWithHoogle;
- # 44 = lib.strings.stringLength "/nix/store/gia2r9mxhc900y1m97dlmr1g3rm3ich3-"
- dropNixStore = s: nixpkgs.lib.strings.substring 44 (nixpkgs.lib.strings.stringLength s) s;
+ # ghc with all packages, used for generating bild's package database
+ ghcPackageSetFull = ghcWith (p: lib.attrsets.attrVals deps p);
- haskellDeps = import ./Bild/Deps/Haskell.nix;
-
- ghcPackages = nixpkgs.haskellPackages;
- ghcWith = nixpkgs.haskell.packages.${constants.ghcCompiler}.ghcWithHoogle;
-
- sbclWith = nixpkgs.lispPackages_new.sbclWithPackages;
-
- pythonPackages = nixpkgs.python3Packages;
- pythonWith = nixpkgs.python3.withPackages;
-
- cPackages = nixpkgs.pkgs;
-
- ghcPackageSetFull = private.ghcWith private.haskellDeps;
- ghcPackageSetBild = private.ghcWith (hpkgs: with hpkgs; [
+ # bild's dependencies, needs to be hand-written
+ ghcPackageSetBild = ghcWith (hpkgs: with hpkgs; [
aeson async base bytestring conduit conduit-extra containers directory
docopt filepath process protolude rainbow regex-applicative split tasty
tasty-hunit tasty-quickcheck text hostname
wai # can remove when removed from Biz.Log
]);
+ };
+ lisp = {
+ sbclWith = nixpkgs.lispPackages_new.sbclWithPackages;
};
- # generally-useful things from nixpkgs
- inherit (nixpkgs) lib stdenv sources;
+ python = {
+ packages = nixpkgs.python3Packages;
+ pythonWith = nixpkgs.python3.withPackages;
+ buildPythonApplication = nixpkgs.python3.pkgs.buildPythonApplication;
+ };
+
+ # c packages are just nixpkgs, filtered to just the list of deps i want
+ c.packages = lib.attrsets.getAttrs (import ./Bild/Deps/C.nix) nixpkgs.pkgs;
# expose some packages for inclusion in os/image builds
pkgs = with nixpkgs.pkgs; { inherit git; };
- # remove this when I switch to all-nix builds
+ # this is needed to do builds without calling out to nix, remove this when I
+ # switch to all-nix builds
bildRuntimeDeps = with nixpkgs; [
pkg-config
# this is just to get access to ghc-pkg in bild
- (private.ghcWith (hpkgs: with hpkgs; []))
+ (haskell.ghcWith (hpkgs: with hpkgs; []))
- /* disable until nixified builds are complete */
# lisp deps
guile
- (private.sbclWith (p: with p; [asdf alexandria])) # just enough to build Example.lisp
+ (lisp.sbclWith (p: with p; [asdf alexandria])) # just enough to build Example.lisp
];
# a standard nix build for `bild` - this should be the only hand-written
# builder we need
- bild = stdenv.mkDerivation {
+ bild = nixpkgs.stdenv.mkDerivation {
name = "bild";
src = ../.;
- nativeBuildInputs = [ private.ghcPackageSetBild ];
+ nativeBuildInputs = [ haskell.ghcPackageSetBild ];
buildInputs = [ nixpkgs.makeWrapper ];
propagatedBuildInputs = bildRuntimeDeps;
strictDeps = true;
buildPhase = ''
- mkdir -p $out/bin $out/lib/ghc-${private.ghcPackageSetFull.version}
+ mkdir -p $out/bin $out/lib/ghc-${haskell.ghcPackageSetFull.version}
cp -r \
- ${private.ghcPackageSetFull}/lib/ghc-${private.ghcPackageSetFull.version}/package.conf.d \
- $out/lib/ghc-${private.ghcPackageSetFull.version}
+ ${haskell.ghcPackageSetFull}/lib/ghc-${haskell.ghcPackageSetFull.version}/package.conf.d \
+ $out/lib/ghc-${haskell.ghcPackageSetFull.version}
ghc \
-threaded \
-Werror \
@@ -84,14 +84,14 @@ rec {
'';
installPhase = ''
wrapProgram $out/bin/bild \
- --prefix PATH : ${lib.makeBinPath [ private.ghcPackageSetBild ]} \
+ --prefix PATH : ${lib.makeBinPath [ haskell.ghcPackageSetBild ]} \
--set GHC_PACKAGE_PATH \
- $out/lib/ghc-${private.ghcPackageSetFull.version}/package.conf.d
+ $out/lib/ghc-${haskell.ghcPackageSetFull.version}/package.conf.d
'';
};
# wrapper around bild
- runBildAnalyze = main: stdenv.mkDerivation rec {
+ runBildAnalyze = main: nixpkgs.stdenv.mkDerivation rec {
name = "bild-analysis";
src = ../.;
USER = "nixbld";
@@ -109,43 +109,19 @@ rec {
installPhase = "exit 0";
};
- # gather data needed for compiling by analyzing the main module
- analyze = main:
- let
- path = lib.strings.removePrefix (builtins.getEnv "BIZ_ROOT" + "/") (toString main);
- in
- lib.attrsets.getAttrFromPath [path]
- (lib.trivial.importJSON
- (runBildAnalyze main + "/analysis.json"));
-
- buildPythonApplication = nixpkgs.python310.pkgs.buildPythonApplication;
-
- # build a ghc executable
- ghc = main:
- let
- data = analyze main;
- ghc = private.ghcWith (hp: private.selectAttrs data.langdeps hp);
- module = lib.strings.concatStringsSep "." data.namespace.path;
- in stdenv.mkDerivation {
- name = module;
- src = ../.;
- nativeBuildInputs = [ ghc ] ++ private.selectAttrs data.sysdeps nixpkgs.pkgs;
- strictDeps = true;
- buildPhase = ''
- set -eux
- mkdir -p $out/bin
- : compiling with ghc
- ${ghc}/bin/ghc \
- -Werror \
- -i. \
- --make ${main} \
- -main-is ${module} \
- -o $out/bin/${data.out}
- '';
- # the install process was handled above
- installPhase = "exit 0";
- } // { env = ghc; };
+ # gather data needed for compiling by analyzing the main module. returns the
+ # json object of the build
+ analyze = main: builtins.readFile (runBildAnalyze main + "/analysis.json");
+
+ # i think this isn't going to work because we have a nix-in-nix problem.
+ # instead:
+ # - get the store path some other way. if i can pass that to bild.os, then nix
+ # should automatically get all the deps required
+ # - just do runBildAnalyze, pass the args to Bild/Builder.nix, should continue
+ # no problem
+ run = main: import ./Bild/Builder.nix { analysisJSON = analyze main; };
+ # the main development environment
env = let
linters = with nixpkgs.pkgs; [ ormolu hlint deadnix indent black];
in nixpkgs.pkgs.mkShell {
@@ -156,7 +132,7 @@ rec {
ctags
figlet
git
- haskell.packages.${constants.ghcCompiler}.fast-tags
+ nixpkgs.haskell.packages.${constants.ghcCompiler}.fast-tags
hlint
lolcat
#nixops # fails to build
@@ -165,34 +141,14 @@ rec {
wemux
];
shellHook = ''
- export GHC_PACKAGE_PATH=${bild}/lib/ghc-${private.ghcPackageSetFull.version}/package.conf.d
+ export GHC_PACKAGE_PATH=${bild}/lib/ghc-${haskell.ghcPackageSetFull.version}/package.conf.d
'';
};
# build an operating system. 'cfg' is the NixOS config
os = cfg: (nixpkgs.nixos (_args: cfg)).toplevel;
- # build a rust executable
- rust = main:
- let
- data = analyze main;
- rustc = nixpkgs.pkgs.rustc;
- in stdenv.mkDerivation {
- name = lib.string.concatStringsSep "::" data.namespace.path;
- src = ../.;
- nativeBuildInputs = [ rustc ];
- strictDeps = true;
- buildPhase = ''
- set -eux
- mkdir -p $out/bin
- : compiling with rustc
- ${rustc}/bin/rustc \
- ${main} \
- -o $out/bin/${data.out}
- '';
- installPhase = "exit 0";
- };
-
# build a docker image
image = nixpkgs.pkgs.dockerTools.buildImage;
+};
}