From e2e77950f3f1ca560fbffe4351b98a9e75c4c685 Mon Sep 17 00:00:00 2001 From: Maxim Ivanov Date: Tue, 6 May 2014 22:41:49 +0100 Subject: [PATCH 1/3] Scatter output hook This hook allows to scatter files in $out to multiple outputs. For "bin" and "doc" outputs there are prefefined default masks, but they can be overriden by setting files_, for example: files_bin = [ "/bin/*" "/lib/libexec/" ]; To make an effect hook must be specified in buildInputs. --- .../setup-hooks/scatter_output.sh | 56 +++++++++++++++++++ pkgs/top-level/all-packages.nix | 2 + 2 files changed, 58 insertions(+) create mode 100644 pkgs/build-support/setup-hooks/scatter_output.sh diff --git a/pkgs/build-support/setup-hooks/scatter_output.sh b/pkgs/build-support/setup-hooks/scatter_output.sh new file mode 100644 index 00000000000..79118392094 --- /dev/null +++ b/pkgs/build-support/setup-hooks/scatter_output.sh @@ -0,0 +1,56 @@ +preFixupPhases+=" scatter_files" +preDistPhases+=" propagate_bin_input" + +SCATTER_BIN_DEFAULT=${SCATTER_BIN_DEFAULT:-"/lib/*.so* /bin/*"} +SCATTER_DOC_DEFAULT=${SCATTER_DOC_DEFAULT:-"/share/man/* /share/doc/*"} + + +scatter_files() { + save_nullglob=$(shopt -p nullglob) + for o in $outputs; do + [[ "$o" == "out" ]] && continue + v=files_${o} + + #if files_'output' isn't set in derivative, use defualts for some + [[ ${!v} ]] || { + case $o in + bin) + v=SCATTER_BIN_DEFAULT + ;; + doc) + v=SCATTER_DOC_DEFAULT + ;; + *) + continue + ;; + esac + } + + # prepend each path with $out + paths=$out${!v// \// $out/} + shopt -s nullglob + for f in $paths; do + shopt -u nullglob + dist=${!o}${f#$out} + mkdir -p $(dirname $dist) + cp -pr $f $dist + # remove source, not forgetting to clean empty dirs + rm -r $f + rmdir --ignore-fail-on-non-empty $(dirname $f) + done + find ${!o} -type f -exec /bin/sh -c 'patchelf --set-rpath $(patchelf --print-rpath {} 2>/dev/null):'${!o}'/lib {} 2>/dev/null && patchelf --shrink-rpath {}' \; + done + eval $save_nullglob +} + +propagate_bin_input() { + if [[ -n ${bin:-} ]]; then + mkdir -p $out/nix-support + echo $bin >> $out/nix-support/propagated-native-build-inputs + fi + + if [[ -n ${bin:-} && -n ${doc:-} ]]; then + mkdir -p $bin/nix-support + echo $doc >> $bin/nix-support/propagated-user-env-packages + fi +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index fc38595d390..5a74ba45e91 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -278,6 +278,8 @@ let dotnetfx = dotnetfx40; }; + scatterOutputHook = makeSetupHook {} ../build-support/setup-hooks/scatter_output.sh; + vsenv = callPackage ../build-support/vsenv { vs = vs90wrapper; }; From 9e685556f2b544c88e95ddf703bbe04002283007 Mon Sep 17 00:00:00 2001 From: Maxim Ivanov Date: Tue, 6 May 2014 22:42:21 +0100 Subject: [PATCH 2/3] make use of new extractRuntimeHook --- pkgs/development/libraries/libmsgpack/default.nix | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pkgs/development/libraries/libmsgpack/default.nix b/pkgs/development/libraries/libmsgpack/default.nix index 26dc6be8382..ab9dbd48ea4 100644 --- a/pkgs/development/libraries/libmsgpack/default.nix +++ b/pkgs/development/libraries/libmsgpack/default.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchurl, autoconf, automake, libtool, ruby }: +{ stdenv, fetchurl, autoconf, automake, libtool, ruby, scatterOutputHook }: stdenv.mkDerivation rec { version = "0.5.8"; @@ -9,17 +9,18 @@ stdenv.mkDerivation rec { sha256 = "1h6k9kdbfavmw3by5kk3raszwa64hn9k8yw9rdhvl5m8g2lks89k"; }; + nativeBuildInputs = [ scatterOutputHook ]; buildInputs = [ autoconf automake libtool ruby ]; - outputs = [ "out" "lib" ]; + outputs = [ "out" "bin" ]; - preConfigure = "./bootstrap"; - - postInstall = '' - mkdir -p $lib/lib - mv $out/lib/*.so.* $lib/lib/ + preConfigure = '' + sed -i s,glibtoolize,libtoolize, ./bootstrap + ./bootstrap ''; + enableParallelBuilding = true; + meta = with stdenv.lib; { description = "MessagePack implementation for C and C++"; homepage = http://msgpack.org; From e7d5e1cdbc4844e0d9b491ad86a8440314f6b73f Mon Sep 17 00:00:00 2001 From: Maxim Ivanov Date: Mon, 26 May 2014 14:48:39 +0100 Subject: [PATCH 3/3] Don't hardcode shell, use $SHELL instead --- pkgs/build-support/setup-hooks/scatter_output.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/build-support/setup-hooks/scatter_output.sh b/pkgs/build-support/setup-hooks/scatter_output.sh index 79118392094..f2a501c55e4 100644 --- a/pkgs/build-support/setup-hooks/scatter_output.sh +++ b/pkgs/build-support/setup-hooks/scatter_output.sh @@ -38,7 +38,7 @@ scatter_files() { rm -r $f rmdir --ignore-fail-on-non-empty $(dirname $f) done - find ${!o} -type f -exec /bin/sh -c 'patchelf --set-rpath $(patchelf --print-rpath {} 2>/dev/null):'${!o}'/lib {} 2>/dev/null && patchelf --shrink-rpath {}' \; + find ${!o} -type f -exec $SHELL -c 'patchelf --set-rpath $(patchelf --print-rpath {} 2>/dev/null):'${!o}'/lib {} 2>/dev/null && patchelf --shrink-rpath {}' \; done eval $save_nullglob }