mirror of
https://github.com/NixOS/nixpkgs.git
synced 2026-06-26 12:06:08 +00:00
Limit-on-update/delete is useful for, amongst other things, bounding the amount of work done in a single SQL statement. It is not enabled by upstream by default, but Debian does enable it. Because the parser generator doesn't receive NIX_CFLAGS_COMPILE, the setting has to go through the --enable-update-limit configure flag. Maybe in the future, if this derivation moves to e.g. CFLAGS, this feature enablement can be made uniform with the others.
172 lines
4.8 KiB
Nix
172 lines
4.8 KiB
Nix
{
|
||
lib,
|
||
stdenv,
|
||
fetchurl,
|
||
unzip,
|
||
tcl,
|
||
zlib,
|
||
readline,
|
||
ncurses,
|
||
|
||
# for tests
|
||
python3Packages,
|
||
sqldiff,
|
||
sqlite-analyzer,
|
||
sqlite-rsync,
|
||
tinysparql,
|
||
|
||
# uses readline & ncurses for a better interactive experience if set to true
|
||
interactive ? false,
|
||
|
||
gitUpdater,
|
||
buildPackages,
|
||
}:
|
||
|
||
let
|
||
archiveVersion = import ./archive-version.nix lib;
|
||
in
|
||
|
||
stdenv.mkDerivation rec {
|
||
pname = "sqlite${lib.optionalString interactive "-interactive"}";
|
||
version = "3.51.2";
|
||
|
||
# nixpkgs-update: no auto update
|
||
# NB! Make sure to update ./tools.nix src (in the same directory).
|
||
src = fetchurl {
|
||
url = "https://sqlite.org/2026/sqlite-src-${archiveVersion version}.zip";
|
||
hash = "sha256-hREPdi1QeUFNmd1deRe8P/fgWHbmzL0T2ElqOBfyCCk=";
|
||
};
|
||
docsrc = fetchurl {
|
||
url = "https://sqlite.org/2026/sqlite-doc-${archiveVersion version}.zip";
|
||
hash = "sha256-xuMNB8XpwSaQHFTY18kKnBo3B4JFUX8GCzxpxN5Dv10=";
|
||
};
|
||
|
||
outputs = [
|
||
"bin"
|
||
"dev"
|
||
"man"
|
||
"doc"
|
||
"out"
|
||
];
|
||
separateDebugInfo = stdenv.hostPlatform.isLinux;
|
||
|
||
depsBuildBuild = [
|
||
buildPackages.stdenv.cc
|
||
];
|
||
|
||
nativeBuildInputs = [
|
||
unzip
|
||
tcl
|
||
];
|
||
buildInputs = [
|
||
zlib
|
||
]
|
||
++ lib.optionals interactive [
|
||
readline
|
||
ncurses
|
||
];
|
||
|
||
# required for aarch64 but applied for all arches for simplicity
|
||
preConfigure = ''
|
||
patchShebangs configure
|
||
'';
|
||
|
||
# sqlite relies on autosetup now; so many of the
|
||
# previously-understood flags are gone. They should instead be set
|
||
# on a per-output basis.
|
||
setOutputFlags = false;
|
||
|
||
env.TCLLIBDIR = "${placeholder "out"}/lib";
|
||
|
||
configureFlags = [
|
||
"--bindir=${placeholder "bin"}/bin"
|
||
"--includedir=${placeholder "dev"}/include"
|
||
"--libdir=${placeholder "out"}/lib"
|
||
(if stdenv.hostPlatform.isStatic then "--disable-tcl" else "--with-tcl=${lib.getLib tcl}/lib")
|
||
# Enabling limit-on-update/delete by adding -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT to NIX_CFLAGS_COMPILE does not work: the lemon parser generator (built early in buildPhase) doesn't receive the flag when it's invoked, as it's not been wrapped with Nix magic.
|
||
"--enable-update-limit"
|
||
]
|
||
++ lib.optional (!interactive) "--disable-readline"
|
||
# autosetup only looks up readline.h in predefined set of directories.
|
||
++ lib.optional interactive "--with-readline-header=${lib.getDev readline}/include/readline/readline.h"
|
||
++ lib.optional (stdenv.hostPlatform.isStatic) "--disable-shared";
|
||
|
||
env.NIX_CFLAGS_COMPILE = toString [
|
||
"-DSQLITE_ENABLE_COLUMN_METADATA"
|
||
"-DSQLITE_ENABLE_DBSTAT_VTAB"
|
||
"-DSQLITE_ENABLE_JSON1"
|
||
"-DSQLITE_ENABLE_FTS3"
|
||
"-DSQLITE_ENABLE_FTS3_PARENTHESIS"
|
||
"-DSQLITE_ENABLE_FTS3_TOKENIZER"
|
||
"-DSQLITE_ENABLE_FTS4"
|
||
"-DSQLITE_ENABLE_FTS5"
|
||
"-DSQLITE_ENABLE_GEOPOLY"
|
||
"-DSQLITE_ENABLE_MATH_FUNCTIONS"
|
||
"-DSQLITE_ENABLE_PERCENTILE"
|
||
"-DSQLITE_ENABLE_PREUPDATE_HOOK"
|
||
"-DSQLITE_ENABLE_RBU"
|
||
"-DSQLITE_ENABLE_RTREE"
|
||
"-DSQLITE_ENABLE_SESSION"
|
||
"-DSQLITE_ENABLE_STMT_SCANSTATUS"
|
||
"-DSQLITE_ENABLE_UNLOCK_NOTIFY"
|
||
"-DSQLITE_SOUNDEX"
|
||
"-DSQLITE_SECURE_DELETE"
|
||
"-DSQLITE_MAX_VARIABLE_NUMBER=250000"
|
||
"-DSQLITE_MAX_EXPR_DEPTH=10000"
|
||
];
|
||
|
||
# Test for features which may not be available at compile time
|
||
preBuild = ''
|
||
# Necessary for FTS5 on Linux
|
||
export NIX_CFLAGS_LINK="$NIX_CFLAGS_LINK -lm"
|
||
|
||
echo ""
|
||
echo "NIX_CFLAGS_COMPILE = $NIX_CFLAGS_COMPILE"
|
||
echo ""
|
||
'';
|
||
|
||
postInstall = ''
|
||
mkdir -p $doc/share/doc
|
||
unzip $docsrc
|
||
mv sqlite-doc-${archiveVersion version} $doc/share/doc/sqlite
|
||
'';
|
||
|
||
# SQLite’s tests are unreliable on Darwin. Sometimes they run successfully, but often they do not.
|
||
doCheck = !stdenv.hostPlatform.isDarwin;
|
||
# When tcl is not available, only run test targets that don't need it.
|
||
checkTarget = lib.optionalString stdenv.hostPlatform.isStatic "fuzztest sourcetest";
|
||
|
||
passthru = {
|
||
tests = {
|
||
inherit (python3Packages) sqlalchemy;
|
||
inherit
|
||
sqldiff
|
||
sqlite-analyzer
|
||
sqlite-rsync
|
||
tinysparql
|
||
;
|
||
};
|
||
|
||
updateScript = gitUpdater {
|
||
# No nicer place to look for latest version.
|
||
url = "https://github.com/sqlite/sqlite.git";
|
||
# Expect tags like "version-3.43.0".
|
||
rev-prefix = "version-";
|
||
};
|
||
};
|
||
|
||
meta = {
|
||
changelog = "https://www.sqlite.org/releaselog/${lib.replaceStrings [ "." ] [ "_" ] version}.html";
|
||
description = "Self-contained, serverless, zero-configuration, transactional SQL database engine";
|
||
downloadPage = "https://sqlite.org/download.html";
|
||
homepage = "https://www.sqlite.org/";
|
||
license = lib.licenses.publicDomain;
|
||
mainProgram = "sqlite3";
|
||
maintainers = with lib.maintainers; [ np ];
|
||
teams = [ lib.teams.security-review ];
|
||
platforms = lib.platforms.unix ++ lib.platforms.windows;
|
||
pkgConfigModules = [ "sqlite3" ];
|
||
identifiers.cpeParts = lib.meta.cpeFullVersionWithVendor "sqlite" version;
|
||
};
|
||
}
|