1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
{
lib, stdenv, fetchFromGitHub,
cmake, ninja,
libxcrypt, zlib, openssl,
gmp, gperftools, readline,
libedit, libarchive, Security,
# optional dependencies
withDb ? true,
db,
withJava ? true,
jdk,
withOdbc ? true,
unixODBC,
withPcre ? true,
pcre2,
withPython ? true,
python3,
withYaml ? true,
libyaml,
withGui ? false,
libX11, libXpm, libXext, libXft, libXinerama, libjpeg, libXt, libSM, freetype, fontconfig,
# gcc/g++ as runtime dependency
withNativeCompiler ? true
# Packs must be installed from a local directory during the build, with dependencies
# resolved manually, e.g. to install the 'julian' pack, which depends on the 'delay', 'list_util' and 'typedef' packs:
# julian = pkgs.fetchzip {
# name = "swipl-pack-julian";
# url = "https://github.com/mndrix/julian/archive/v0.1.3.zip";
# sha256 = "1sgql7c21p3c5m14kwa0bcmlwn9fql612krn9h36gla1j9yjdfgy";
# };
# delay = pkgs.fetchzip {
# name = "swipl-pack-delay";
# url = "https://github.com/mndrix/delay/archive/v0.3.3.zip";
# sha256 = "0ira87afxnc2dnbbmgwmrr8qvary8lhzvhqwd52dccm6yqd3nybg";
# };
# list_util = pkgs.fetchzip {
# name = "swipl-pack-list_util";
# url = "https://github.com/mndrix/list_util/archive/v0.13.0.zip";
# sha256 = "0lx7vffflak0y8l8vg8k0g8qddwwn23ksbz02hi3f8rbarh1n89q";
# };
# typedef = builtins.fetchTarball {
# name = "swipl-pack-typedef";
# url = "https://raw.githubusercontent.com/samer--/prolog/master/typedef/release/typedef-0.1.9.tgz";
# sha256 = "056nqjn01g18fb1b2qivv9s7hb4azk24nx2d4kvkbmm1k91f44p3";
# };
# swiProlog = pkgs.swiProlog.override { extraPacks = map (dep-path: "'file://${dep-path}'") [
# julian delay list_util typedef
# ]; };
, extraPacks ? []
, extraLibraries ? [] # removed option - see below
}:
let
# minorVersion is even for stable, odd for unstable
version = "9.2.6";
# This package provides several with* options, which replaces the old extraLibraries option.
# This error should help users that still use this option find their way to these flags.
# We can probably remove this after one NixOS version.
extraLibraries' = if extraLibraries == [] then [] else throw
"option 'extraLibraries' removed - use 'with*' options (e.g., 'withJava'), or overrideAttrs to inject extra build dependencies";
packInstall = swiplPath: pack:
''${swiplPath}/bin/swipl -g "pack_install(${pack}, [package_directory(\"${swiplPath}/lib/swipl/extra-pack\"), silent(true), interactive(false)])." -t "halt."
'';
withGui' = withGui && !stdenv.isDarwin;
optionalDependencies = []
++ (lib.optional withDb db)
++ (lib.optional withJava jdk)
++ (lib.optional withOdbc unixODBC)
++ (lib.optional withPcre pcre2)
++ (lib.optional withPython python3)
++ (lib.optional withYaml libyaml)
++ (lib.optionals withGui' [ libXt libXext libXpm libXft libXinerama
libjpeg libSM freetype fontconfig
])
++ (lib.optional stdenv.isDarwin Security)
++ extraLibraries';
in
stdenv.mkDerivation {
pname = "swi-prolog";
inherit version;
# SWI-Prolog has two repositories: swipl and swipl-devel.
# - `swipl`, which tracks stable releases and backports
# - `swipl-devel` which tracks continuous development
src = fetchFromGitHub {
owner = "SWI-Prolog";
repo = "swipl";
rev = "V${version}";
hash = "sha256-FgEn+Ht45++GFpfcdaJ5In5x+NyIOopSlSAs+t7sPDE=";
fetchSubmodules = true;
};
# Add the packInstall path to the swipl pack search path
postPatch = ''
echo "user:file_search_path(pack, '$out/lib/swipl/extra-pack')." >> boot/init.pl
'';
nativeBuildInputs = [ cmake ninja ];
buildInputs = [
libarchive
libxcrypt
zlib
openssl
gperftools
gmp
readline
libedit
] ++ optionalDependencies;
hardeningDisable = [ "format" ];
cmakeFlags = [ "-DSWIPL_INSTALL_IN_LIB=ON" ]
++ lib.optionals (!withNativeCompiler) [
# without these options, the build will embed full compiler paths
"-DSWIPL_CC=${if stdenv.isDarwin then "clang" else "gcc"}"
"-DSWIPL_CXX=${if stdenv.isDarwin then "clang++" else "g++"}"
];
preInstall = ''
mkdir -p $out/lib/swipl/extra-pack
'';
postInstall = builtins.concatStringsSep "\n"
( builtins.map (packInstall "$out") extraPacks
);
meta = {
homepage = "https://www.swi-prolog.org";
description = "Prolog compiler and interpreter";
license = lib.licenses.bsd2;
mainProgram = "swipl";
platforms = lib.platforms.linux ++ lib.optionals (!withGui) lib.platforms.darwin;
maintainers = [ lib.maintainers.meditans lib.maintainers.matko ];
};
}
|