about summary refs log tree commit diff
path: root/pkgs/by-name/ni
diff options
context:
space:
mode:
authorJohn Titor <50095635+JohnRTitor@users.noreply.github.com>2024-05-13 11:27:20 +0530
committerJohn Titor <50095635+JohnRTitor@users.noreply.github.com>2024-05-13 11:33:07 +0530
commit493d74ef4a597b7c00bb2db4134f8912df0697f1 (patch)
treeca77247babdb9c8c16b34e005736f4dd695c902c /pkgs/by-name/ni
parent966fd1be01818529c8cbdbd34fa9a41bc17d574c (diff)
ninja: migrate to pkgs/by-name
Diffstat (limited to 'pkgs/by-name/ni')
-rw-r--r--pkgs/by-name/ni/ninja/package.nix108
-rw-r--r--pkgs/by-name/ni/ninja/setup-hook.sh86
2 files changed, 194 insertions, 0 deletions
diff --git a/pkgs/by-name/ni/ninja/package.nix b/pkgs/by-name/ni/ninja/package.nix
new file mode 100644
index 0000000000000..3402bcfca625f
--- /dev/null
+++ b/pkgs/by-name/ni/ninja/package.nix
@@ -0,0 +1,108 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, asciidoc
+, docbook_xml_dtd_45
+, docbook_xsl
+, installShellFiles
+, libxslt
+, python3
+, re2c
+, buildPackages
+, buildDocs ? true
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ninja";
+  version = "1.11.1";
+
+  src = fetchFromGitHub {
+    owner = "ninja-build";
+    repo = "ninja";
+    rev = "v${version}";
+    hash = "sha256-LvV/Fi2ARXBkfyA1paCRmLUwCh/rTyz+tGMg2/qEepI=";
+  };
+
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+
+  nativeBuildInputs = [
+    python3
+    re2c
+    installShellFiles
+  ]
+  ++ lib.optionals buildDocs [
+    asciidoc
+    docbook_xml_dtd_45
+    docbook_xsl
+    libxslt.bin
+  ];
+
+  patches = lib.optionals stdenv.is32bit [
+    # Otherwise ninja may fail on some files in a larger FS.
+    (fetchpatch {
+      name = "stat64.patch";
+      url = "https://github.com/ninja-build/ninja/commit/7bba11ae704efc84cac5fde5e9be53f653f237d1.diff";
+      hash = "sha256-tINS57xLh1lwnYFWCQs5OudfgtIShaOh5zbmv7w5BnQ=";
+    })
+  ];
+
+  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;
+
+  meta = with lib; {
+    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 = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ thoughtpolice bjornfor orivej ];
+  };
+}
diff --git a/pkgs/by-name/ni/ninja/setup-hook.sh b/pkgs/by-name/ni/ninja/setup-hook.sh
new file mode 100644
index 0000000000000..7fa5e4675f39b
--- /dev/null
+++ b/pkgs/by-name/ni/ninja/setup-hook.sh
@@ -0,0 +1,86 @@
+ninjaBuildPhase() {
+    runHook preBuild
+
+    local buildCores=1
+
+    # Parallel building is enabled by default.
+    if [ "${enableParallelBuilding-1}" ]; then
+        buildCores="$NIX_BUILD_CORES"
+    fi
+
+    local flagsArray=(
+        -j$buildCores
+        $ninjaFlags "${ninjaFlagsArray[@]}"
+    )
+
+    echoCmd 'build flags' "${flagsArray[@]}"
+    TERM=dumb ninja "${flagsArray[@]}"
+
+    runHook postBuild
+}
+
+ninjaCheckPhase() {
+    runHook preCheck
+
+    if [ -z "${checkTarget:-}" ]; then
+        if ninja -t query test >/dev/null 2>&1; then
+            checkTarget=test
+        fi
+    fi
+
+    if [ -z "${checkTarget:-}" ]; then
+        echo "no test target found in ninja, doing nothing"
+    else
+        local buildCores=1
+
+        if [ "${enableParallelChecking-1}" ]; then
+            buildCores="$NIX_BUILD_CORES"
+        fi
+
+        local flagsArray=(
+            -j$buildCores
+            $ninjaFlags "${ninjaFlagsArray[@]}"
+            $checkTarget
+        )
+
+        echoCmd 'check flags' "${flagsArray[@]}"
+        TERM=dumb ninja "${flagsArray[@]}"
+    fi
+
+    runHook postCheck
+}
+
+ninjaInstallPhase() {
+    runHook preInstall
+
+    local buildCores=1
+
+    # Parallel building is enabled by default.
+    if [ "${enableParallelInstalling-1}" ]; then
+        buildCores="$NIX_BUILD_CORES"
+    fi
+
+    # shellcheck disable=SC2086
+    local flagsArray=(
+        -j$buildCores
+        $ninjaFlags "${ninjaFlagsArray[@]}"
+        ${installTargets:-install}
+    )
+
+    echoCmd 'install flags' "${flagsArray[@]}"
+    TERM=dumb ninja "${flagsArray[@]}"
+
+    runHook postInstall
+}
+
+if [ -z "${dontUseNinjaBuild-}" -a -z "${buildPhase-}" ]; then
+    buildPhase=ninjaBuildPhase
+fi
+
+if [ -z "${dontUseNinjaCheck-}" -a -z "${checkPhase-}" ]; then
+    checkPhase=ninjaCheckPhase
+fi
+
+if [ -z "${dontUseNinjaInstall-}" -a -z "${installPhase-}" ]; then
+    installPhase=ninjaInstallPhase
+fi