4r/flake.nix

229 lines
7.2 KiB
Nix

{
description = "4r";
inputs = {
nixpkgs.url = github:NixOS/nixpkgs/22.05;
utils.url = github:numtide/flake-utils;
relude-src = {
url = github:kowainik/relude/v1.1.0.0;
flake = false;
};
doctest-src = {
url = github:sol/doctest/0.20.0;
flake = false;
};
servant-src = {
url = github:haskell-servant/servant;
flake = false;
};
polysemy-zoo-src = {
url = github:polysemy-research/polysemy-zoo/006421384e61f4a7f66670e69af926735c91a65e;
flake = false;
};
polysemy-src.url = github:polysemy-research/polysemy/v1.7.1.0;
servant-polysemy-src = {
url = github:AJChapman/servant-polysemy/v0.1.3;
flake = false;
};
};
outputs = inputs@{ nixpkgs, utils, ... }:
utils.lib.eachDefaultSystem (system:
let nixpkgs' = import nixpkgs {
inherit system;
};
unwords = nixpkgs'.lib.concatStringsSep " ";
options = [
"-Wall"
"-Wcompat"
"-Wincomplete-uni-patterns"
"-Wredundant-constraints"
"-Wmissing-export-lists"
"-Wincomplete-record-updates"
"-Wmissing-deriving-strategies"
];
extensions = [
"-XNoImplicitPrelude"
"-XNoFieldSelectors"
"-XOverloadedRecordDot"
"-XDuplicateRecordFields"
"-XBangPatterns"
"-XBinaryLiterals"
"-XBlockArguments"
"-XConstraintKinds"
"-XDataKinds"
"-XDeriveFunctor"
"-XDeriveGeneric"
"-XDerivingStrategies"
"-XFlexibleContexts"
"-XFlexibleInstances"
"-XGADTs"
"-XGeneralizedNewtypeDeriving"
"-XHexFloatLiterals"
"-XImportQualifiedPost"
"-XInstanceSigs"
"-XKindSignatures"
"-XLambdaCase"
"-XMultiParamTypeClasses"
"-XNumericUnderscores"
"-XOverloadedStrings"
"-XScopedTypeVariables"
"-XStandaloneDeriving"
"-XTupleSections"
"-XTypeApplications"
"-XTypeOperators"
"-XTypeSynonymInstances"
"-XUndecidableInstances"
];
this = ghcVersion:
let pkgs = nixpkgs'.haskell.packages.${ghcVersion}.override {
overrides = (import ./nix/dependencies.nix inputs ghcVersion);
};
_4r-api = pkgs.mkDerivation {
pname = "4r-api";
version = "0.1.0";
src = ./4r-api;
isExecutable = false;
isLibrary = true;
libraryHaskellDepends = with pkgs; [
aeson
base
polysemy
relude
servant
servant-client
servant-client-polysemy
];
doHaddock = false;
doHoogle = false;
license = nixpkgs.lib.licenses.gpl3Plus;
passthru = { inherit pkgs; };
};
_4r = pkgs.mkDerivation {
pname = "4r";
version = "0.1.0";
src = ./4r;
isExecutable = true;
executableHaskellDepends = with pkgs; [
_4r-api
aeson
ansi-terminal
base
commonmark
commonmark-extensions
cryptohash-sha512
http-api-data
http-client
optparse-applicative
polysemy
relude
servant
servant-client
servant-client-polysemy
unordered-containers
];
license = nixpkgs.lib.licenses.gpl3Plus;
passthru = { inherit pkgs; };
};
_4r-feed = pkgs.mkDerivation {
pname = "4r-feed";
version = "0.1.0";
src = ./4r-feed;
isExecutable = true;
executableHaskellDepends = with pkgs; [
_4r-api
base
cache
clock
commonmark
commonmark-extensions
feed
http-client
http-media
http-types
mtl
polysemy
relude
servant
servant-client
servant-client-polysemy
servant-server
wai-cli
];
license = nixpkgs.lib.licenses.gpl3Plus;
passthru = { inherit pkgs; };
};
fourmolu = nixpkgs'.writeScript "fourmolu"
''
set -x
${pkgs.fourmolu}/bin/fourmolu --mode inplace \
--indentation 2 --check-idempotence --import-export-comma-style leading \
${unwords (map (e: "-o ${e}") (options ++ extensions))} \
$(find . -name '*.hs')
'';
in
{ inherit _4r _4r-api _4r-feed fourmolu; };
thisNative = this "ghc922";
in
{
packages = thisNative // {
default = thisNative._4r;
};
apps =
let binaryToApp = bin: { type = "app"; program = "${bin}/bin/${bin.pname}"; };
in
rec {
_4r = binaryToApp thisNative._4r;
_4r-feed = binaryToApp thisNative._4r-feed;
default = _4r;
fourmolu = {
type = "app";
program = thisNative.fourmolu.outPath;
};
};
devShells =
let mkGhci = deriv: dir: deriv.env.overrideAttrs (_: {
shellHook = ''
ghci ${unwords (options ++ extensions)} $(find ${dir} -name '*.hs')
exit $?
'';
});
in
{
default = thisNative._4r.env;
_4r = mkGhci thisNative._4r "4r";
_4r-api = mkGhci thisNative._4r-api "4r-api";
_4r-feed = mkGhci thisNative._4r-feed "4r-feed";
};
nixosModules._4r-feed = { ... }: {
options = {};
config =
let name = "4r-feed";
in
{
users.users.${name} = {
group = "nobody";
isSystemUser = true;
};
systemd.services.${name} = {
enable = true;
script =
''
${thisNative._4r-feed}/bin/4r-feed --host 127.0.0.1 --port 40000 --devlogging
'';
after = ["i2p.service"];
wantedBy = ["multi-user.target"];
serviceConfig = {
User = name;
Group = "nobody";
};
};
};
};
});
}