209 lines
6.3 KiB
Nix
209 lines
6.3 KiB
Nix
{
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-21.11";
|
|
flake-utils.url = "github:numtide/flake-utils";
|
|
};
|
|
outputs = { self, nixpkgs, flake-utils, ... }:
|
|
flake-utils.lib.eachSystem
|
|
[
|
|
"x86_64-linux"
|
|
]
|
|
|
|
(system:
|
|
let
|
|
pkgs = import nixpkgs { inherit system; };
|
|
lib = pkgs.lib;
|
|
|
|
mkSpotApps = appNames:
|
|
pkgs.lib.genAttrs appNames
|
|
(name: flake-utils.lib.mkApp {
|
|
drv = self.packages.${system}.spot;
|
|
name = name;
|
|
});
|
|
|
|
spotPackage =
|
|
let
|
|
inherit (builtins)
|
|
filter
|
|
head
|
|
isString
|
|
match
|
|
readFile
|
|
split
|
|
;
|
|
|
|
# NOTE: Maintaining the version separately would be a pain, and we
|
|
# can't have a flake.nix.in with a @VERSION@ because it would make
|
|
# the flake unusable without running autoconf first, defeating some
|
|
# of its purpose.
|
|
#
|
|
# So let's get it the hard way instead :)
|
|
extractVersionRegex = ''^AC_INIT\(\[spot], \[([^]]+)], \[spot@lrde\.epita\.fr]\)$'';
|
|
getLines = (fileContent:
|
|
filter isString (split "\n" fileContent)
|
|
);
|
|
findVersionLine = (lines:
|
|
lib.lists.findFirst
|
|
(l: lib.strings.hasPrefix "AC_INIT(" l)
|
|
null
|
|
lines
|
|
);
|
|
getVersion = (file:
|
|
let
|
|
lines = getLines (readFile file);
|
|
versionLine = findVersionLine lines;
|
|
version = head (match extractVersionRegex versionLine);
|
|
in
|
|
version
|
|
);
|
|
in
|
|
{
|
|
lib,
|
|
pkgs,
|
|
stdenv,
|
|
# FIXME: do we want this flag?
|
|
buildOrgDoc ? false,
|
|
# Whether to enable Spot's Python 3 bindings
|
|
enablePython ? false
|
|
}:
|
|
stdenv.mkDerivation {
|
|
pname = "spot";
|
|
version = getVersion ./configure.ac;
|
|
|
|
src = self;
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
# NOTE: Nix enables a lot of hardening flags by default, some of
|
|
# these probably harm performance so I've disabled everything
|
|
# (haven't benchmarked with vs without these, though).
|
|
hardeningDisable = [ "all" ];
|
|
|
|
# NOTE: mktexpk fails without a HOME set
|
|
preBuild = ''
|
|
export HOME=$TMPDIR
|
|
patchShebangs tools
|
|
'' + (if buildOrgDoc then ''
|
|
ln -s ${pkgs.plantuml}/lib/plantuml.jar doc/org/plantuml.jar
|
|
'' else ''
|
|
touch doc/org-stamp
|
|
'');
|
|
|
|
configureFlags = [
|
|
"--disable-devel"
|
|
"--enable-optimizations"
|
|
] ++ lib.optional (!enablePython) [
|
|
"--disable-python"
|
|
];
|
|
|
|
nativeBuildInputs = with pkgs; [
|
|
autoreconfHook
|
|
|
|
autoconf
|
|
automake
|
|
bison
|
|
flex
|
|
libtool
|
|
perl
|
|
] ++ lib.optional buildOrgDoc [
|
|
graphviz
|
|
groff
|
|
plantuml
|
|
pdf2svg
|
|
R
|
|
] ++ lib.optional enablePython [
|
|
python3
|
|
swig4
|
|
];
|
|
|
|
buildInputs = with pkgs; [
|
|
# should provide the minimum amount of packages necessary for
|
|
# building tl.pdf
|
|
(texlive.combine {
|
|
inherit (texlive)
|
|
scheme-basic
|
|
latexmk
|
|
|
|
booktabs
|
|
doi
|
|
doublestroke
|
|
koma-script
|
|
mathabx
|
|
mathpazo
|
|
metafont
|
|
microtype
|
|
nag
|
|
pgf
|
|
standalone
|
|
stmaryrd
|
|
tabulary
|
|
todonotes
|
|
wasy
|
|
wasysym
|
|
;
|
|
})
|
|
];
|
|
};
|
|
in
|
|
{
|
|
defaultPackage = self.packages.${system}.spot;
|
|
|
|
packages = {
|
|
# binaries + library only
|
|
spot = pkgs.callPackage spotPackage {};
|
|
|
|
# NOTE: clang build is broken on Nix when linking to stdlib++, using
|
|
# libcxx instead. See:
|
|
# https://github.com/NixOS/nixpkgs/issues/91285
|
|
spotClang = pkgs.callPackage spotPackage {
|
|
stdenv = pkgs.llvmPackages.libcxxStdenv;
|
|
};
|
|
|
|
spotWithOrgDoc = pkgs.callPackage spotPackage {
|
|
buildOrgDoc = true;
|
|
};
|
|
|
|
spotWithPython = pkgs.python3Packages.toPythonModule (
|
|
pkgs.callPackage spotPackage {
|
|
enablePython = true;
|
|
}
|
|
);
|
|
|
|
spotFull = pkgs.python3Packages.toPythonModule (
|
|
pkgs.callPackage spotPackage {
|
|
buildOrgDoc = true; enablePython = true;
|
|
}
|
|
);
|
|
};
|
|
|
|
apps = mkSpotApps [
|
|
"autcross"
|
|
"autfilt"
|
|
"dstar2tgba"
|
|
"genaut"
|
|
"genltl"
|
|
"ltl2tgba"
|
|
"ltl2tgta"
|
|
"ltlcross"
|
|
"ltldo"
|
|
"ltlfilt"
|
|
"ltlgrind"
|
|
"ltlsynt"
|
|
"randaut"
|
|
"randltl"
|
|
];
|
|
|
|
devShell = pkgs.mkShell {
|
|
name = "spot-dev";
|
|
inputsFrom = [ self.packages.${system}.spotFull ];
|
|
buildInputs = [
|
|
pkgs.gdb
|
|
|
|
(pkgs.python3.withPackages (p: [
|
|
p.jupyter
|
|
p.ipython # otherwise ipython module isn't found when running ipynb tests
|
|
]))
|
|
];
|
|
};
|
|
});
|
|
}
|