summary refs log tree commit diff
path: root/pkgs/build-support/setup-hooks
diff options
context:
space:
mode:
authorVladimír Čunát <vcunat@gmail.com>2015-10-03 13:33:13 +0200
committerVladimír Čunát <vcunat@gmail.com>2015-10-03 13:33:37 +0200
commit5227fb1dd53fcb5918b9342dff4868f4ad68427e (patch)
treed6cd521e3f67944031216a27f740f28f22b73b41 /pkgs/build-support/setup-hooks
parentd6dd3b8bd1eaeeb21dfdb5051cd4732c748ce5d7 (diff)
parent33373d939a19f465228ddede6d38ce9032b5916b (diff)
downloadnixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar.gz
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar.bz2
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar.lz
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar.xz
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.tar.zst
nixlib-5227fb1dd53fcb5918b9342dff4868f4ad68427e.zip
Merge commit staging+systemd into closure-size
Many non-conflict problems weren't (fully) resolved in this commit yet.
Diffstat (limited to 'pkgs/build-support/setup-hooks')
-rw-r--r--pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh11
-rw-r--r--pkgs/build-support/setup-hooks/make-wrapper.sh14
-rw-r--r--pkgs/build-support/setup-hooks/multiple-outputs.sh5
-rw-r--r--pkgs/build-support/setup-hooks/patch-shebangs.sh4
-rw-r--r--pkgs/build-support/setup-hooks/separate-debug-info.sh44
-rw-r--r--pkgs/build-support/setup-hooks/wrap-gapps-hook.sh41
6 files changed, 110 insertions, 9 deletions
diff --git a/pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh b/pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh
index 4b8abb61ace5..9108b4c50355 100644
--- a/pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh
+++ b/pkgs/build-support/setup-hooks/make-coverage-analysis-report.sh
@@ -10,9 +10,16 @@ coverageReportPhase() {
     mkdir -p $out/coverage
     genhtml app.info $lcovExtraTraceFiles -o $out/coverage > log
 
-    # Grab the overall coverage percentage for use in release overviews.
+    # Grab the overall coverage percentage so that Hydra can plot it over time.
     mkdir -p $out/nix-support
-    grep "Overall coverage rate" log | sed 's/^.*(\(.*\)%).*$/\1/' > $out/nix-support/coverage-rate
+    lineCoverage="$(sed 's/.*lines\.*: \([0-9\.]\+\)%.*/\1/; t ; d' log)"
+    functionCoverage="$(sed 's/.*functions\.*: \([0-9\.]\+\)%.*/\1/; t ; d' log)"
+    if [ -z "$lineCoverage" -o -z "$functionCoverage" ]; then
+        echo "failed to get coverage statistics"
+        exit 1
+    fi
+    echo "lineCoverage $lineCoverage %" >> $out/nix-support/hydra-metrics
+    echo "functionCoverage $functionCoverage %" >> $out/nix-support/hydra-metrics
 
     echo "report coverage $out/coverage" >> $out/nix-support/hydra-build-products
 }
diff --git a/pkgs/build-support/setup-hooks/make-wrapper.sh b/pkgs/build-support/setup-hooks/make-wrapper.sh
index 41f2a59246d1..5150b4f0218a 100644
--- a/pkgs/build-support/setup-hooks/make-wrapper.sh
+++ b/pkgs/build-support/setup-hooks/make-wrapper.sh
@@ -2,7 +2,7 @@ makeWrapper() {
     local original=$1
     local wrapper=$2
     local params varName value command separator n fileNames
-    local flagsBefore flags
+    local argv0 flagsBefore flags
 
     mkdir -p "$(dirname $wrapper)"
 
@@ -68,12 +68,18 @@ makeWrapper() {
             n=$((n + 1))
             flagsBefore="$flagsBefore $flags"
         fi
+
+        if test "$p" = "--argv0"; then
+            argv0=${params[$((n + 1))]}
+            n=$((n + 1))
+        fi
     done
 
     # Note: extraFlagsArray is an array containing additional flags
     # that may be set by --run actions.
-    echo exec "$original" $flagsBefore '"${extraFlagsArray[@]}"' '"$@"' >> $wrapper
-    
+    echo exec ${argv0:+-a $argv0} "$original" \
+         $flagsBefore '"${extraFlagsArray[@]}"' '"$@"' >> $wrapper
+
     chmod +x $wrapper
 }
 
@@ -98,5 +104,5 @@ wrapProgram() {
     local prog="$1"
     local hidden="$(dirname "$prog")/.$(basename "$prog")"-wrapped
     mv $prog $hidden
-    makeWrapper $hidden $prog "$@"
+    makeWrapper $hidden $prog --argv0 '"$0"' "$@"
 }
diff --git a/pkgs/build-support/setup-hooks/multiple-outputs.sh b/pkgs/build-support/setup-hooks/multiple-outputs.sh
index f621d4577b43..7527000eb257 100644
--- a/pkgs/build-support/setup-hooks/multiple-outputs.sh
+++ b/pkgs/build-support/setup-hooks/multiple-outputs.sh
@@ -96,10 +96,13 @@ _multioutDocs() {
     _moveToOutput share/man "${!outputMan}"
     _moveToOutput share/info "${!outputInfo}"
     _moveToOutput share/doc "${!outputDoc}"
+    # outputs TODO: perhaps have outputDevDoc for developer docs
+    # and maybe allow _moveToOutput move to "/dev/trash" or similar
+    _moveToOutput share/gtk-doc "${!outputDoc}"
 
     # Remove empty share directory.
     if [ -d "$out/share" ]; then
-        rmdir "$out/share" 2> /dev/null || true
+        rmdir "$out/share" --ignore-fail-on-non-empty
     fi
 }
 
diff --git a/pkgs/build-support/setup-hooks/patch-shebangs.sh b/pkgs/build-support/setup-hooks/patch-shebangs.sh
index 5a7f23b2d816..9d8cd0217a53 100644
--- a/pkgs/build-support/setup-hooks/patch-shebangs.sh
+++ b/pkgs/build-support/setup-hooks/patch-shebangs.sh
@@ -5,7 +5,7 @@
 # rewritten to /nix/store/<hash>/bin/python.  Interpreters that are
 # already in the store are left untouched.
 
-fixupOutputHooks+=('if [ -z "$dontPatchShebangs" ]; then patchShebangs "$prefix"; fi')
+fixupOutputHooks+=('if [ -z "$dontPatchShebangs" -a -e "$prefix" ]; then patchShebangs "$prefix"; fi')
 
 patchShebangs() {
     local dir="$1"
@@ -18,7 +18,7 @@ patchShebangs() {
     local oldInterpreterLine
     local newInterpreterLine
 
-    find "$dir" -type f -perm +0100 | while read f; do
+    find "$dir" -type f -perm -0100 | while read f; do
         if [ "$(head -1 "$f" | head -c +2)" != '#!' ]; then
             # missing shebang => not a script
             continue
diff --git a/pkgs/build-support/setup-hooks/separate-debug-info.sh b/pkgs/build-support/setup-hooks/separate-debug-info.sh
new file mode 100644
index 000000000000..dc6de05bb69a
--- /dev/null
+++ b/pkgs/build-support/setup-hooks/separate-debug-info.sh
@@ -0,0 +1,44 @@
+export NIX_LDFLAGS+=" --build-id"
+export NIX_CFLAGS_COMPILE+=" -ggdb"
+dontStrip=1
+
+fixupOutputHooks+=(_separateDebugInfo)
+
+_separateDebugInfo() {
+    local dst="${debug:-$out}"
+    if [ "$prefix" = "$dst" ]; then return; fi
+
+    dst="$dst/lib/debug/.build-id"
+
+    # Find executables and dynamic libraries.
+    local -a files=($(find "$prefix" -type f -a \( -perm /0100 -o -name "*.so" -o -name "*.so.*" \)))
+
+    local i magic
+    for i in "${files[@]}"; do
+        # Skip non-ELF files.
+        exec 10< "$i"
+        read -n 4 -u 10 magic
+        exec 10<&-
+
+        # Extract the Build ID. FIXME: there's probably a cleaner way.
+        local id="$(readelf -n "$i" | sed 's/.*Build ID: \([0-9a-f]*\).*/\1/; t; d')"
+        if [ "${#id}" != 40 ]; then
+            echo "could not find build ID of $i, skipping" >&2
+            continue
+        fi
+
+        # Extract the debug info.
+        header "separating debug info from $i (build ID $id)"
+        mkdir -p "$dst/${id:0:2}"
+        objcopy --only-keep-debug "$i" "$dst/${id:0:2}/${id:2}.debug" --compress-debug-sections
+        strip --strip-debug "$i"
+    done
+}
+
+# - We might prefer to compress the debug info during link-time already,
+#   but our ld doesn't support --compress-debug-sections=zlib (yet).
+# - Debug info may cause problems due to excessive memory usage during linking.
+#   Using -Wa,--compress-debug-sections should help with that;
+#   further interesting information: https://gcc.gnu.org/wiki/DebugFission
+# - Another related tool: https://fedoraproject.org/wiki/Features/DwarfCompressor
+
diff --git a/pkgs/build-support/setup-hooks/wrap-gapps-hook.sh b/pkgs/build-support/setup-hooks/wrap-gapps-hook.sh
new file mode 100644
index 000000000000..3445c4b9cc1d
--- /dev/null
+++ b/pkgs/build-support/setup-hooks/wrap-gapps-hook.sh
@@ -0,0 +1,41 @@
+gappsWrapperArgs=()
+
+find_gio_modules() {
+    if [ -d "$1"/lib/gio/modules ] && [ -n "$(ls -A $1/lib/gio/modules)" ] ; then
+        gappsWrapperArgs+=(--prefix GIO_EXTRA_MODULES : "$1/lib/gio/modules")
+    fi
+}
+
+envHooks+=(find_gio_modules)
+
+wrapGAppsHook() {
+  if [ -n "$GDK_PIXBUF_MODULE_FILE" ]; then
+    gappsWrapperArgs+=(--set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE")
+  fi
+
+  if [ -n "$XDG_ICON_DIRS" ]; then
+    gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS")
+  fi
+
+  if [ -n "$GSETTINGS_SCHEMAS_PATH" ]; then
+    gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH")
+  fi
+
+  if [ -d "$prefix/share" ]; then
+    gappsWrapperArgs+=(--prefix XDG_DATA_DIRS : "$prefix/share")
+  fi
+
+  for v in $wrapPrefixVariables GST_PLUGIN_SYSTEM_PATH_1_0 GI_TYPELIB_PATH GRL_PLUGIN_PATH; do
+    eval local dummy="\$$v"
+    gappsWrapperArgs+=(--prefix $v : "$dummy")
+  done
+
+  if [ -z "$dontWrapGApps" ]; then
+    for i in $prefix/bin/* $prefix/libexec/*; do
+      echo "Wrapping app $i"
+      wrapProgram "$i" "${gappsWrapperArgs[@]}"
+    done
+  fi
+}
+
+fixupOutputHooks+=(wrapGAppsHook)