2025-07-24 13:55:40 +02:00

133 lines
3.3 KiB
Nix

{
lib,
stdenv,
fetchFromGitHub,
fetchpatch,
asciidoc,
docbook_xml_dtd_45,
docbook_xsl,
installShellFiles,
libxslt,
python3,
re2c,
buildPackages,
buildDocs ? true,
nix-update-script,
ninjaRelease ? "latest",
}:
stdenv.mkDerivation (finalAttrs: {
pname = "ninja";
version =
{
"1.11" = "1.11.1";
latest = "1.12.1";
}
.${ninjaRelease};
src = fetchFromGitHub {
owner = "ninja-build";
repo = "ninja";
rev = "v${finalAttrs.version}";
hash =
{
# TODO: Remove Ninja 1.11 as soon as possible.
"1.11" = "sha256-LvV/Fi2ARXBkfyA1paCRmLUwCh/rTyz+tGMg2/qEepI=";
latest = "sha256-RT5u+TDvWxG5EVQEYj931EZyrHUSAqK73OKDAascAwA=";
}
.${ninjaRelease} or (throw "Unsupported Ninja release: ${ninjaRelease}");
};
depsBuildBuild = [ buildPackages.stdenv.cc ];
nativeBuildInputs = [
python3
re2c
installShellFiles
]
++ lib.optionals buildDocs [
asciidoc
docbook_xml_dtd_45
docbook_xsl
libxslt.bin
];
# TODO: remove together with ninja 1.11
patches = lib.optionals (lib.versionOlder finalAttrs.version "1.12") [
(fetchpatch {
name = "ninja1.11-python3.13-compat.patch";
url = "https://github.com/ninja-build/ninja/commit/9cf13cd1ecb7ae649394f4133d121a01e191560b.patch";
hash = "sha256-zlMs9LDJ2thtiSUjbsONyqoyYxrB/Ilt2Ljr0nCU6nQ=";
})
];
postPatch = ''
# write rebuild args to file after bootstrap
substituteInPlace configure.py --replace "subprocess.check_call(rebuild_args)" "open('rebuild_args','w').write(rebuild_args[0])"
'';
buildPhase = ''
runHook preBuild
# for list of env vars
# see https://github.com/ninja-build/ninja/blob/v1.11.1/configure.py#L264
CXX="$CXX_FOR_BUILD" \
AR="$AR_FOR_BUILD" \
CFLAGS="$CFLAGS_FOR_BUILD" \
CXXFLAGS="$CXXFLAGS_FOR_BUILD" \
LDFLAGS="$LDFLAGS_FOR_BUILD" \
python configure.py --bootstrap
python configure.py
source rebuild_args
''
+ lib.optionalString buildDocs ''
# "./ninja -vn manual" output copied here to support cross compilation.
asciidoc -b docbook -d book -o build/manual.xml doc/manual.asciidoc
xsltproc --nonet doc/docbook.xsl build/manual.xml > doc/manual.html
''
+ ''
runHook postBuild
'';
installPhase = ''
runHook preInstall
install -Dm555 -t $out/bin ninja
installShellCompletion --name ninja \
--bash misc/bash-completion \
--zsh misc/zsh-completion
''
+ lib.optionalString buildDocs ''
install -Dm444 -t $out/share/doc/ninja doc/manual.asciidoc doc/manual.html
''
+ ''
runHook postInstall
'';
setupHook = ./setup-hook.sh;
passthru.updateScript = nix-update-script { };
meta = {
description = "Small build system with a focus on speed";
mainProgram = "ninja";
longDescription = ''
Ninja is a small build system with a focus on speed. It differs from
other build systems in two major respects: it is designed to have its
input files generated by a higher-level build system, and it is designed
to run builds as fast as possible.
'';
homepage = "https://ninja-build.org/";
license = lib.licenses.asl20;
platforms = lib.platforms.unix;
maintainers = with lib.maintainers; [
thoughtpolice
bjornfor
orivej
];
};
})