wafHook: init

The waf build system is python-based and hosted locally in each package in the executable file named "waf". Unlike CMake, it cannot generate makefiles so we end up having to override the configure, build, and install phases. I've tried to keep these as close to what's in setup.sh as possible. If there is no waf file in the root directory, then we just copy the one hosted in Nixpkgs. Otherwise the only thing you have to add to a package using Waf is "wafHook" into nativeBuildInputs. wafFlags controls the flags specifically passed to waf while configureFlags, buildFlags, and installFlags are still used as in the generic builder.
This commit is contained in:
Matthew Bauer 2018-11-10 14:30:48 -06:00
parent df9334b646
commit 92ebfa1383
2 changed files with 66 additions and 0 deletions

@ -0,0 +1,62 @@
wafConfigurePhase() {
runHook preConfigure
if ! [ -f ./waf ]; then
cp @waf@ waf
fi
if [[ -z "${dontAddPrefix:-}" && -n "$prefix" ]]; then
configureFlags="${prefixKey:---prefix=}$prefix $configureFlags"
fi
local flagsArray=(
$configureFlags ${configureFlagsArray[@]}
${configureTargets:-configure}
)
echoCmd 'configure flags' "${flagsArray[@]}"
python waf "${flagsArray[@]}"
runHook postConfigure
}
wafBuildPhase () {
runHook preBuild
# set to empty if unset
: ${wafFlags=}
local flagsArray=(
${enableParallelBuilding:+-j ${NIX_BUILD_CORES}}
$wafFlags ${wafFlagsArray[@]}
$buildFlags ${buildFlagsArray[@]}
${buildTargets:-build}
)
echoCmd 'build flags' "${flagsArray[@]}"
python waf "${flagsArray[@]}"
runHook postBuild
}
wafInstallPhase() {
runHook preInstall
if [ -n "$prefix" ]; then
mkdir -p "$prefix"
fi
local flagsArray=(
$wafFlags ${wafFlagsArray[@]}
$installFlags ${installFlagsArray[@]}
${installTargets:-install}
)
echoCmd 'install flags' "${flagsArray[@]}"
python waf "${flagsArray[@]}"
runHook postInstall
}
configurePhase=wafConfigurePhase
buildPhase=wafBuildPhase
installPhase=wafInstallPhase

@ -6203,6 +6203,10 @@ with pkgs;
volumeicon = callPackage ../tools/audio/volumeicon { };
waf = callPackage ../development/tools/build-managers/waf { python = python3; };
wafHook = makeSetupHook {
deps = [ python ];
substitutions = { inherit waf; };
} ../development/tools/build-managers/waf/setup-hook.sh;
wakelan = callPackage ../tools/networking/wakelan { };