about summary refs log tree commit diff
path: root/nixpkgs/pkgs/by-name/wa/waf
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/by-name/wa/waf')
-rw-r--r--nixpkgs/pkgs/by-name/wa/waf/hook.nix24
-rw-r--r--nixpkgs/pkgs/by-name/wa/waf/package.nix80
-rw-r--r--nixpkgs/pkgs/by-name/wa/waf/setup-hook.sh94
3 files changed, 198 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/by-name/wa/waf/hook.nix b/nixpkgs/pkgs/by-name/wa/waf/hook.nix
new file mode 100644
index 000000000000..ac497d227831
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/wa/waf/hook.nix
@@ -0,0 +1,24 @@
+{ lib
+, stdenv
+, pkgs
+, makeSetupHook
+, waf
+}:
+
+makeSetupHook {
+  name = "waf-setup-hook";
+
+  substitutions = {
+    # Sometimes the upstream provides its own waf file; in order to honor it,
+    # waf is not inserted into propagatedBuildInputs, rather it is inserted
+    # directly
+    inherit waf;
+    wafCrossFlags = lib.optionalString (stdenv.hostPlatform.system != stdenv.targetPlatform.system)
+      ''--cross-compile "--cross-execute=${stdenv.targetPlatform.emulator pkgs}"'';
+  };
+
+  meta = {
+    description = "A setup hook for using Waf in Nixpkgs";
+    inherit (waf.meta) maintainers platforms broken;
+  };
+} ./setup-hook.sh
diff --git a/nixpkgs/pkgs/by-name/wa/waf/package.nix b/nixpkgs/pkgs/by-name/wa/waf/package.nix
new file mode 100644
index 000000000000..515f3ae03421
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/wa/waf/package.nix
@@ -0,0 +1,80 @@
+{ lib
+, stdenv
+, fetchFromGitLab
+, callPackage
+, ensureNewerSourcesForZipFilesHook
+, python3
+# optional list of extra waf tools, e.g. `[ "doxygen" "pytest" ]`
+, extraTools ? []
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "waf";
+  version = "2.0.26";
+
+  src = fetchFromGitLab {
+    owner = "ita1024";
+    repo = "waf";
+    rev = "waf-${finalAttrs.version}";
+    hash = "sha256-AXDMWlwivJ0Xot6iwuIIlbV2Anz6ieghyOI9jA4yrko=";
+  };
+
+  nativeBuildInputs = [
+    ensureNewerSourcesForZipFilesHook
+    python3
+  ];
+
+  buildInputs = [
+    # waf executable uses `#!/usr/bin/env python`
+    python3
+  ];
+
+  strictDeps = true;
+
+  configurePhase = ''
+    runHook preConfigure
+
+    python waf-light configure
+
+    runHook postConfigure
+  '';
+
+  buildPhase = let
+    extraToolsList =
+      lib.optionalString (extraTools != [])
+        "--tools=\"${lib.concatStringsSep "," extraTools}\"";
+  in
+  ''
+    runHook preBuild
+
+    python waf-light build ${extraToolsList}
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D waf $out/bin/waf
+
+    runHook postInstall
+  '';
+
+  passthru = {
+    inherit python3 extraTools;
+    hook = callPackage ./hook.nix {
+      waf = finalAttrs.finalPackage;
+    };
+  };
+
+  meta = {
+    homepage = "https://waf.io";
+    description = "The meta build system";
+    changelog  = "https://gitlab.com/ita1024/waf/blob/${finalAttrs.version}/ChangeLog";
+    license = lib.licenses.bsd3;
+    mainProgram = "waf";
+    maintainers = with lib.maintainers; [ AndersonTorres ];
+    inherit (python3.meta) platforms;
+    sourceProvenance = [ lib.sourceTypes.fromSource ];
+  };
+})
diff --git a/nixpkgs/pkgs/by-name/wa/waf/setup-hook.sh b/nixpkgs/pkgs/by-name/wa/waf/setup-hook.sh
new file mode 100644
index 000000000000..d3e2bf97e682
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/wa/waf/setup-hook.sh
@@ -0,0 +1,94 @@
+# shellcheck shell=bash disable=SC2206
+
+wafConfigurePhase() {
+    runHook preConfigure
+
+    if ! [ -f "${wafPath:=./waf}" ]; then
+        echo "copying waf to $wafPath..."
+        cp @waf@/bin/waf "$wafPath"
+    fi
+
+    if [ -z "${dontAddPrefix:-}" ] && [ -n "$prefix" ]; then
+        local prefixFlag="${prefixKey:---prefix=}$prefix"
+    fi
+
+    if [ -n "${PKG_CONFIG}" ]; then
+      export PKGCONFIG="${PKG_CONFIG}"
+    fi
+
+    local flagsArray=(
+        $prefixFlag
+        $wafConfigureFlags "${wafConfigureFlagsArray[@]}"
+        ${wafConfigureTargets:-configure}
+    )
+
+    if [ -z "${dontAddWafCrossFlags:-}" ]; then
+        flagsArray+=(@wafCrossFlags@)
+    fi
+
+    echoCmd 'waf configure flags' "${flagsArray[@]}"
+    python "$wafPath" "${flagsArray[@]}"
+
+    if ! [[ -v enableParallelBuilding ]]; then
+        enableParallelBuilding=1
+        echo "waf: enabled parallel building"
+    fi
+
+    if ! [[ -v enableParallelInstalling ]]; then
+        enableParallelInstalling=1
+        echo "waf: enabled parallel installing"
+    fi
+
+    runHook postConfigure
+}
+
+wafBuildPhase () {
+    runHook preBuild
+
+    # set to empty if unset
+    : "${wafFlags=}"
+
+    local flagsArray=(
+      ${enableParallelBuilding:+-j ${NIX_BUILD_CORES}}
+      $wafFlags ${wafFlagsArray[@]}
+      $wafBuildFlags ${wafBuildFlagsArray[@]}
+      ${wafBuildTargets:-build}
+    )
+
+    echoCmd 'waf build flags' "${flagsArray[@]}"
+    python "$wafPath" "${flagsArray[@]}"
+
+    runHook postBuild
+}
+
+wafInstallPhase() {
+    runHook preInstall
+
+    if [ -n "$prefix" ]; then
+        mkdir -p "$prefix"
+    fi
+
+    local flagsArray=(
+        ${enableParallelInstalling:+-j ${NIX_BUILD_CORES}}
+        $wafFlags ${wafFlagsArray[@]}
+        $wafInstallFlags ${wafInstallFlagsArray[@]}
+        ${wafInstallTargets:-install}
+    )
+
+    echoCmd 'waf install flags' "${flagsArray[@]}"
+    python "$wafPath" "${flagsArray[@]}"
+
+    runHook postInstall
+}
+
+if [ -z "${dontUseWafConfigure-}" ] && [ -z "${configurePhase-}" ]; then
+    configurePhase=wafConfigurePhase
+fi
+
+if [ -z "${dontUseWafBuild-}" ] && [ -z "${buildPhase-}" ]; then
+    buildPhase=wafBuildPhase
+fi
+
+if [ -z "${dontUseWafInstall-}" ] && [ -z "${installPhase-}" ]; then
+    installPhase=wafInstallPhase
+fi