From 0c37778c2c17fb40407f6432ff009cd7ae5b17b1 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Mon, 17 Jul 2017 23:36:17 -0400 Subject: cc-wrapper: WIP linking hack for mac OS Probably best to override Haskell packages set, or anything else linking a lot of libraries, with this. --- pkgs/build-support/cc-wrapper/default.nix | 20 ++- .../cc-wrapper/macos-sierra-reexport-hack.patch | 140 +++++++++++++++++++++ 2 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.patch (limited to 'pkgs/build-support') diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index 676fbd006881..c178204f9fb5 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -12,6 +12,7 @@ , isGNU ? false, isClang ? cc.isClang or false, gnugrep ? null , buildPackages ? {}, hostPlatform, targetPlatform , runCommand ? null +, useMacosReexportHack ? false }: with stdenv.lib; @@ -295,7 +296,20 @@ stdenv.mkDerivation { ln -s $ldPath/${prefix}as $out/bin/${prefix}as fi - wrap ${prefix}ld ${preWrap ./ld-wrapper.sh} ''${ld:-$ldPath/${prefix}ld} + wrap ${prefix}ld ${if !useMacosReexportHack + then preWrap ./ld-wrapper.sh + else stdenv.mkDerivation { + name = "patched-ld-wrapper-src"; + patches = [ ./macos-sierra-reexport-hack.patch ]; + unpackPhase = '' + src=$PWD + cp ${./ld-wrapper.sh} ld-wrapper.sh + ''; + buildPhase = ""; + installPhase = '' + cp ld-wrapper.sh $out + ''; + }} ''${ld:-$ldPath/${prefix}ld} if [ -e ${binutils_bin}/bin/${prefix}ld.gold ]; then wrap ${prefix}ld.gold ${preWrap ./ld-wrapper.sh} ${binutils_bin}/bin/${prefix}ld.gold @@ -399,5 +413,7 @@ stdenv.mkDerivation { { description = stdenv.lib.attrByPath ["meta" "description"] "System C compiler" cc_ + " (wrapper script)"; - }; + } // optionalAttrs useMacosReexportHack { + platforms = stdenv.lib.platforms.darwin; + }; } diff --git a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.patch b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.patch new file mode 100644 index 000000000000..031c5640f541 --- /dev/null +++ b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.patch @@ -0,0 +1,140 @@ +--- a/ld-wrapper.sh ++++ b/ld-wrapper.sh +@@ -101,35 +101,115 @@ if [ "$NIX_DONT_SET_RPATH" != 1 ]; then + rpath="" + + # First, find all -L... switches. +- allParams=("${params[@]}" ${extra[@]}) ++ declare -ar allParams=("${extraBefore[@]}" "${params[@]}" "${extra[@]}") ++ declare -a allParamsPost=() childrenLookup=() childrenLink=() ++ ++ declare -r recurThreshold=300 ++ ++ declare overflowCount=0 ++ for p in "${allParams[@]}"; do ++ case "$p" in ++ -o) ++ declare -r outputName="$p2" ++ ;; ++ (-l*) ++ let overflowCount+=1 ++ ;; ++ *) ;; ++ esac ++ done ++ ++ if (( "$overflowCount" > "$recurThreshold" )); then ++ declare -r linkIndirect="1" ++ else ++ declare -r linkIndirect="" ++ fi ++ ++ function append_Ls() { ++ if [[ -n "$linkIndirect" ]]; then ++ childrenLookup+=("$@") ++ fi ++ allParamsPost+=("$@") ++ } ++ ++ function append_ls() { ++ local p ++ if (( $# == 2 )); then p="$2"; else p="${1:2}"; fi ++ if [[ -n "$linkIndirect" && "$p" != "-lto_library" && "$p" != "-lSystem" ]]; then ++ childrenLink+=("$@") ++ else ++ allParamsPost+=("$@") ++ fi ++ } ++ + n=0 + while [ $n -lt ${#allParams[*]} ]; do + p=${allParams[n]} + p2=${allParams[$((n+1))]} ++ + if [ "${p:0:3}" = -L/ ]; then + addToLibPath ${p:2} ++ append_Ls "$p" + elif [ "$p" = -L ]; then + addToLibPath ${p2} ++ append_Ls "$p" "$p2" + n=$((n + 1)) + elif [ "$p" = -l ]; then + addToLibs ${p2} ++ append_ls "$p" "$p2" + n=$((n + 1)) + elif [ "${p:0:2}" = -l ]; then + addToLibs ${p:2} ++ append_ls "$p" + elif [ "$p" = -dynamic-linker ]; then + # Ignore the dynamic linker argument, or it + # will get into the next 'elif'. We don't want + # the dynamic linker path rpath to go always first. ++ allParamsPost+=("$p" "$p2") + n=$((n + 1)) + elif [[ "$p" =~ ^[^-].*\.so($|\.) ]]; then + # This is a direct reference to a shared library, so add + # its directory to the rpath. + path="$(dirname "$p")"; + addToRPath "${path}" ++ allParamsPost+=("$p") ++ else ++ allParamsPost+=("$p") + fi ++ + n=$((n + 1)) + done + ++ if [[ "$linkIndirect" ]]; then ++ while (( $n < "${#childrenLink[@]}" )); do ++ childrenLink[n]="-reexport${childrenLink[n]}" ++ done ++ declare -r outputNameLibless=$(basename $( ++ if [[ "${outputName:0:3}" = lib ]]; then ++ echo "${outputName:3}" ++ else ++ echo "${outputName:-unnamed}" ++ fi)) ++ declare -ra children=("$outputNameLibless-reexport-delegate-0" \ ++ "$outputNameLibless-reexport-delegate-1") ++ ++ mkdir -p "$out/lib" ++ ++ # first half of libs ++ "$0" -dylib -o "$out/lib/lib${children[0]}.dylib" \ ++ -install_name "$out/lib/lib${children[0]}.dylib" \ ++ "${childrenLookup[@]}" \ ++ "${childrenLink[@]::$((${#childrenLink[@]} / 2 ))}" ++ ++ # second half of libs ++ "$0" -dylib -o "$out/lib/lib${children[1]}.dylib" \ ++ -install_name "$out/lib/lib${children[1]}.dylib" \ ++ "${childrenLookup[@]}" \ ++ "${childrenLink[@]:$((${#childrenLink[@]} / 2 ))}" ++ ++ allParamsPost+=("-L$out/lib" "-l${children[0]}" "-l${children[1]}") ++ fi ++ + # Second, for each directory in the library search path (-L...), + # see if it contains a dynamic library used by a -l... flag. If + # so, add the directory to the rpath. +@@ -170,12 +243,8 @@ fi + + # Optionally print debug info. + if [ -n "$NIX_DEBUG" ]; then +- echo "original flags to @prog@:" >&2 +- for i in "${params[@]}"; do +- echo " $i" >&2 +- done +- echo "extra flags to @prog@:" >&2 +- for i in ${extra[@]}; do ++ echo "flags to @prog@:" >&2 ++ for i in "${allParamsPost[@]}"; do + echo " $i" >&2 + done + fi +@@ -185,4 +254,4 @@ if [ -n "$NIX_LD_WRAPPER_EXEC_HOOK" ]; then + fi + + PATH="$path_backup" +-exec @prog@ ${extraBefore[@]} "${params[@]}" ${extra[@]} ++exec @prog@ "${allParamsPost[@]}" -- cgit 1.4.1 From 9242c8b331a3571debb04b6485b0783386371838 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Fri, 21 Jul 2017 13:29:47 -0400 Subject: cc-wrapper: Use two scripts instead of patch --- pkgs/build-support/cc-wrapper/default.nix | 22 ++-- .../cc-wrapper/macos-sierra-reexport-hack.bash | 95 ++++++++++++++ .../cc-wrapper/macos-sierra-reexport-hack.patch | 140 --------------------- 3 files changed, 103 insertions(+), 154 deletions(-) create mode 100644 pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash delete mode 100644 pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.patch (limited to 'pkgs/build-support') diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index c178204f9fb5..371db540b0ab 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -296,20 +296,14 @@ stdenv.mkDerivation { ln -s $ldPath/${prefix}as $out/bin/${prefix}as fi - wrap ${prefix}ld ${if !useMacosReexportHack - then preWrap ./ld-wrapper.sh - else stdenv.mkDerivation { - name = "patched-ld-wrapper-src"; - patches = [ ./macos-sierra-reexport-hack.patch ]; - unpackPhase = '' - src=$PWD - cp ${./ld-wrapper.sh} ld-wrapper.sh - ''; - buildPhase = ""; - installPhase = '' - cp ld-wrapper.sh $out - ''; - }} ''${ld:-$ldPath/${prefix}ld} + '' + (if !useMacosReexportHack then '' + wrap ${prefix}ld ${./ld-wrapper.sh} ''${ld:-$ldPath/${prefix}ld} + '' else '' + export ldWrapper="$out/bin/${prefix}ld" innerLd="${prefix}ld-reexport-delegate" + wrap "$innerLd" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${prefix}ld} + wrap "${prefix}ld" ${./ld-wrapper.sh} "$out/bin/$innerLd" + unset ldWrapper + '') + '' if [ -e ${binutils_bin}/bin/${prefix}ld.gold ]; then wrap ${prefix}ld.gold ${preWrap ./ld-wrapper.sh} ${binutils_bin}/bin/${prefix}ld.gold diff --git a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash new file mode 100644 index 000000000000..548be0c4dd45 --- /dev/null +++ b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash @@ -0,0 +1,95 @@ +#! @shell@ + +set -eu -o pipefail + +path_backup="$PATH" +if [ -n "@coreutils_bin@" ]; then + PATH="@coreutils_bin@/bin" +fi + +declare -r recurThreshold=300 + +declare overflowCount=0 +for ((n=0; n < $#; ++n)); do + case "${!n}" in + -l*) let overflowCount+=1 ;; + -reexport-l*) let overflowCount+=1 ;; + *) ;; + esac +done + +declare -a allArgs=() + +if (( "$overflowCount" <= "$recurThreshold" )); then + allArgs=("$@") +else + declare -a childrenLookup=() childrenLink=() + + while (( $# )); do + case "$1" in + -L/*) + childrenLookup+=("$1") + allArgs+=("$1") + ;; + -L) + echo "cctools LD does not support '-L foo' or '-l foo'" >&2 + exit 1 + ;; + -l) + echo "cctools LD does not support '-L foo' or '-l foo'" >&2 + exit 1 + ;; + -lto_library) allArgs+=("$1") ;; + # We aren't linking any "to_library" + -lSystem) allArgs+=("$1") ;; + # Special case as indirection seems like a bad idea for something + # so fundamental. Can be removed for simplicity. + -l?*) childrenLink+=("$1") ;; + -reexport-l?*) childrenLink+=("$1") ;; + *) allArgs+=("$1") ;; + esac + + shift + done + + declare n=0 + while (( $n < "${#childrenLink[@]}" )); do + if [[ "${childrenLink[n]}" = -l* ]]; then + childrenLink[n]="-reexport${childrenLink[n]}" + fi + let ++n + done + unset n + + declare -r outputNameLibless=$(basename $( \ + if [[ -z "${outputName:+isUndefined}" ]]; then + echo unnamed + elif [[ "${outputName:0:3}" = lib ]]; then + echo "${outputName:3}" + else + echo "${outputName}" + fi)) + declare -ra children=("$outputNameLibless-reexport-delegate-0" \ + "$outputNameLibless-reexport-delegate-1") + + mkdir -p "$out/lib" + + # first half of libs + @ldWrapper@ -macosx_version_min 10.10 -arch x86_64 -dylib \ + -o "$out/lib/lib${children[0]}.dylib" \ + -install_name "$out/lib/lib${children[0]}.dylib" \ + "${childrenLookup[@]}" \ + "${childrenLink[@]:0:$((${#childrenLink[@]} / 2 ))}" + + # second half of libs + @ldWrapper@ -macosx_version_min 10.10 -arch x86_64 -dylib \ + -o "$out/lib/lib${children[1]}.dylib" \ + -install_name "$out/lib/lib${children[1]}.dylib" \ + "${childrenLookup[@]}" \ + "${childrenLink[@]:$((${#childrenLink[@]} / 2 ))}" + + allArgs+=("-L$out/lib" "-l${children[0]}" "-l${children[1]}") +fi + +PATH="$path_backup" +exec @prog@ "${allArgs[@]}" diff --git a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.patch b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.patch deleted file mode 100644 index 031c5640f541..000000000000 --- a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.patch +++ /dev/null @@ -1,140 +0,0 @@ ---- a/ld-wrapper.sh -+++ b/ld-wrapper.sh -@@ -101,35 +101,115 @@ if [ "$NIX_DONT_SET_RPATH" != 1 ]; then - rpath="" - - # First, find all -L... switches. -- allParams=("${params[@]}" ${extra[@]}) -+ declare -ar allParams=("${extraBefore[@]}" "${params[@]}" "${extra[@]}") -+ declare -a allParamsPost=() childrenLookup=() childrenLink=() -+ -+ declare -r recurThreshold=300 -+ -+ declare overflowCount=0 -+ for p in "${allParams[@]}"; do -+ case "$p" in -+ -o) -+ declare -r outputName="$p2" -+ ;; -+ (-l*) -+ let overflowCount+=1 -+ ;; -+ *) ;; -+ esac -+ done -+ -+ if (( "$overflowCount" > "$recurThreshold" )); then -+ declare -r linkIndirect="1" -+ else -+ declare -r linkIndirect="" -+ fi -+ -+ function append_Ls() { -+ if [[ -n "$linkIndirect" ]]; then -+ childrenLookup+=("$@") -+ fi -+ allParamsPost+=("$@") -+ } -+ -+ function append_ls() { -+ local p -+ if (( $# == 2 )); then p="$2"; else p="${1:2}"; fi -+ if [[ -n "$linkIndirect" && "$p" != "-lto_library" && "$p" != "-lSystem" ]]; then -+ childrenLink+=("$@") -+ else -+ allParamsPost+=("$@") -+ fi -+ } -+ - n=0 - while [ $n -lt ${#allParams[*]} ]; do - p=${allParams[n]} - p2=${allParams[$((n+1))]} -+ - if [ "${p:0:3}" = -L/ ]; then - addToLibPath ${p:2} -+ append_Ls "$p" - elif [ "$p" = -L ]; then - addToLibPath ${p2} -+ append_Ls "$p" "$p2" - n=$((n + 1)) - elif [ "$p" = -l ]; then - addToLibs ${p2} -+ append_ls "$p" "$p2" - n=$((n + 1)) - elif [ "${p:0:2}" = -l ]; then - addToLibs ${p:2} -+ append_ls "$p" - elif [ "$p" = -dynamic-linker ]; then - # Ignore the dynamic linker argument, or it - # will get into the next 'elif'. We don't want - # the dynamic linker path rpath to go always first. -+ allParamsPost+=("$p" "$p2") - n=$((n + 1)) - elif [[ "$p" =~ ^[^-].*\.so($|\.) ]]; then - # This is a direct reference to a shared library, so add - # its directory to the rpath. - path="$(dirname "$p")"; - addToRPath "${path}" -+ allParamsPost+=("$p") -+ else -+ allParamsPost+=("$p") - fi -+ - n=$((n + 1)) - done - -+ if [[ "$linkIndirect" ]]; then -+ while (( $n < "${#childrenLink[@]}" )); do -+ childrenLink[n]="-reexport${childrenLink[n]}" -+ done -+ declare -r outputNameLibless=$(basename $( -+ if [[ "${outputName:0:3}" = lib ]]; then -+ echo "${outputName:3}" -+ else -+ echo "${outputName:-unnamed}" -+ fi)) -+ declare -ra children=("$outputNameLibless-reexport-delegate-0" \ -+ "$outputNameLibless-reexport-delegate-1") -+ -+ mkdir -p "$out/lib" -+ -+ # first half of libs -+ "$0" -dylib -o "$out/lib/lib${children[0]}.dylib" \ -+ -install_name "$out/lib/lib${children[0]}.dylib" \ -+ "${childrenLookup[@]}" \ -+ "${childrenLink[@]::$((${#childrenLink[@]} / 2 ))}" -+ -+ # second half of libs -+ "$0" -dylib -o "$out/lib/lib${children[1]}.dylib" \ -+ -install_name "$out/lib/lib${children[1]}.dylib" \ -+ "${childrenLookup[@]}" \ -+ "${childrenLink[@]:$((${#childrenLink[@]} / 2 ))}" -+ -+ allParamsPost+=("-L$out/lib" "-l${children[0]}" "-l${children[1]}") -+ fi -+ - # Second, for each directory in the library search path (-L...), - # see if it contains a dynamic library used by a -l... flag. If - # so, add the directory to the rpath. -@@ -170,12 +243,8 @@ fi - - # Optionally print debug info. - if [ -n "$NIX_DEBUG" ]; then -- echo "original flags to @prog@:" >&2 -- for i in "${params[@]}"; do -- echo " $i" >&2 -- done -- echo "extra flags to @prog@:" >&2 -- for i in ${extra[@]}; do -+ echo "flags to @prog@:" >&2 -+ for i in "${allParamsPost[@]}"; do - echo " $i" >&2 - done - fi -@@ -185,4 +254,4 @@ if [ -n "$NIX_LD_WRAPPER_EXEC_HOOK" ]; then - fi - - PATH="$path_backup" --exec @prog@ ${extraBefore[@]} "${params[@]}" ${extra[@]} -+exec @prog@ "${allParamsPost[@]}" -- cgit 1.4.1 From 1cd74ac70a69f60b826b20d2e31644f2a2be98ea Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 26 Jul 2017 20:26:57 -0400 Subject: cc-wrapper: Make sure symbol tables of child delegators is not empty As described in https://github.com/NixOS/nixpkgs/issues/18461, MacOS no longer accepts dylibs which only reexport other dylibs, because their symbol tables are empty. To get around this, we define an object file with a single "private extern" symbol, which hopefully won't clobber anything. --- pkgs/build-support/cc-wrapper/default.nix | 9 +++++---- .../cc-wrapper/macos-sierra-reexport-hack.bash | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) (limited to 'pkgs/build-support') diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index 371db540b0ab..43cf3b1cafeb 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -299,10 +299,11 @@ stdenv.mkDerivation { '' + (if !useMacosReexportHack then '' wrap ${prefix}ld ${./ld-wrapper.sh} ''${ld:-$ldPath/${prefix}ld} '' else '' - export ldWrapper="$out/bin/${prefix}ld" innerLd="${prefix}ld-reexport-delegate" - wrap "$innerLd" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${prefix}ld} - wrap "${prefix}ld" ${./ld-wrapper.sh} "$out/bin/$innerLd" - unset ldWrapper + export binPrefix=${prefix} + ldInner="${prefix}ld-reexport-delegate" + wrap "$ldInner" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${prefix}ld} + wrap "${prefix}ld" ${./ld-wrapper.sh} "$out/bin/$ldInner" + unset ldInner '') + '' if [ -e ${binutils_bin}/bin/${prefix}ld.gold ]; then diff --git a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash index 548be0c4dd45..ae920e4fdad1 100644 --- a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash +++ b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash @@ -74,18 +74,26 @@ else mkdir -p "$out/lib" + PATH="$PATH:@out@/bin" + + symbolBloatObject=$outputNameLibless-symbol-hack.o + if [[ ! -e $symbolBloatObject ]]; then + printf '.private_extern _______child_hack_foo\nchild_hack_foo:\n' \ + | @binPrefix@as -- -o $symbolBloatObject + fi + # first half of libs - @ldWrapper@ -macosx_version_min 10.10 -arch x86_64 -dylib \ + @binPrefix@ld -macosx_version_min 10.10 -arch x86_64 -dylib \ -o "$out/lib/lib${children[0]}.dylib" \ -install_name "$out/lib/lib${children[0]}.dylib" \ - "${childrenLookup[@]}" \ + "${childrenLookup[@]}" "$symbolBloatObject" \ "${childrenLink[@]:0:$((${#childrenLink[@]} / 2 ))}" # second half of libs - @ldWrapper@ -macosx_version_min 10.10 -arch x86_64 -dylib \ + @binPrefix@ld -macosx_version_min 10.10 -arch x86_64 -dylib \ -o "$out/lib/lib${children[1]}.dylib" \ -install_name "$out/lib/lib${children[1]}.dylib" \ - "${childrenLookup[@]}" \ + "${childrenLookup[@]}" "$symbolBloatObject" \ "${childrenLink[@]:$((${#childrenLink[@]} / 2 ))}" allArgs+=("-L$out/lib" "-l${children[0]}" "-l${children[1]}") -- cgit 1.4.1 From 86d9b09c9b2f0f76da0cfa5ea420ae476983d7a3 Mon Sep 17 00:00:00 2001 From: Mathias Schreck Date: Wed, 2 Aug 2017 19:27:19 +0200 Subject: dockerTools: fix image json and manifest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The image json is not exactly the same as the layer json, therefore I changed the implementation to use the `baseJson` which doesn’t include layer specific details like `id`, `size` or the checksum of the layer. Also the `history` entry was missing in the image json. I’m not totally sure if this field is required, but a I got an error from a docker registry when I’ve tried to receive the distribution manifest of an image without those `history` entry: GET: `http:///v2//manifests/` ```json { "errors": [ { "code": "MANIFEST_INVALID", "message": "manifest invalid", "detail": {} } ] } ``` I’ve also used a while loop to iterate over all layers which should make sure that the order of the layers is correct. Previously `find` was used and I’m not sure if the order was always correct. --- pkgs/build-support/docker/default.nix | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'pkgs/build-support') diff --git a/pkgs/build-support/docker/default.nix b/pkgs/build-support/docker/default.nix index 160c3f85977b..17d7f2da035c 100644 --- a/pkgs/build-support/docker/default.nix +++ b/pkgs/build-support/docker/default.nix @@ -497,16 +497,23 @@ rec { # Use the temp folder we've been working on to create a new image. mv temp image/$layerID - # Create image configuration file (used by registry v2) by using - # the configuration of the last layer - SHA_ARRAY=$(find ./ -name layer.tar | xargs sha256sum | cut -d" " -f1 | xargs -I{} echo -n '"sha256:{}" ' | sed 's/" "/","/g' | awk '{ print "["$1"]" }') - jq ". + {\"rootfs\": {\"diff_ids\": $SHA_ARRAY, \"type\": \"layers\"}}" image/$layerID/json > config.json - CONFIG_SHA=$(sha256sum config.json | cut -d ' ' -f1) - mv config.json image/$CONFIG_SHA.json - - # Create image manifest - LAYER_PATHS=$(find image/ -name layer.tar -printf '"%P" ' | sed 's/" "/","/g') - jq -n "[{\"Config\":\"$CONFIG_SHA.json\",\"RepoTags\":[\"$imageName:$imageTag\"],\"Layers\":[$LAYER_PATHS]}]" > image/manifest.json + # Create image json and image manifest + imageJson=$(cat ${baseJson} | jq ". + {\"rootfs\": {\"diff_ids\": [], \"type\": \"layers\"}}") + manifestJson=$(jq -n "[{\"RepoTags\":[\"$imageName:$imageTag\"]}]") + currentID=$layerID + while [[ -n "$currentID" ]]; do + layerChecksum=$(sha256sum image/$currentID/layer.tar | cut -d ' ' -f1) + imageJson=$(echo "$imageJson" | jq ".history |= [{\"created\": \"${created}\"}] + .") + imageJson=$(echo "$imageJson" | jq ".rootfs.diff_ids |= [\"sha256:$layerChecksum\"] + .") + manifestJson=$(echo "$manifestJson" | jq ".[0].Layers |= [\"$currentID/layer.tar\"] + .") + + currentID=$(cat image/$currentID/json | (jshon -e parent -u 2>/dev/null || true)) + done + + imageJsonChecksum=$(echo "$imageJson" | sha256sum | cut -d ' ' -f1) + echo "$imageJson" > "image/$imageJsonChecksum.json" + manifestJson=$(echo "$manifestJson" | jq ".[0].Config = \"$imageJsonChecksum.json\"") + echo "$manifestJson" > image/manifest.json # Store the json under the name image/repositories. jshon -n object \ -- cgit 1.4.1 From 2e61d8b71cb2f24fd71bb811f8a504451366f2e2 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Tue, 1 Aug 2017 16:31:38 -0400 Subject: cc-wrapper: Handle more -l.... gotchas --- .../cc-wrapper/macos-sierra-reexport-hack.bash | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'pkgs/build-support') diff --git a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash index ae920e4fdad1..9829179a97c4 100644 --- a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash +++ b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash @@ -39,14 +39,17 @@ else echo "cctools LD does not support '-L foo' or '-l foo'" >&2 exit 1 ;; - -lto_library) allArgs+=("$1") ;; - # We aren't linking any "to_library" - -lSystem) allArgs+=("$1") ;; + -lazy_library | -lazy_framework | -lto_library) + # We aren't linking any "azy_library", "to_library", etc. + allArgs+=("$1") + ;; + -lazy-l | -weak-l) allArgs+=("$1") ;; + # We can't so easily prevent header issues from these. + -lSystem) allArgs+=("$1") ;; # Special case as indirection seems like a bad idea for something # so fundamental. Can be removed for simplicity. - -l?*) childrenLink+=("$1") ;; - -reexport-l?*) childrenLink+=("$1") ;; - *) allArgs+=("$1") ;; + -l?* | -reexport-l?*) childrenLink+=("$1") ;; + *) allArgs+=("$1") ;; esac shift -- cgit 1.4.1 From cd6c452ade3a309050f56c36c27d41b0abb0eef7 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Tue, 1 Aug 2017 16:31:38 -0400 Subject: cc-wrapper: Don't hardcode MacOS min version for delegates --- pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'pkgs/build-support') diff --git a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash index 9829179a97c4..b7aa7ea5c092 100644 --- a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash +++ b/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash @@ -86,14 +86,14 @@ else fi # first half of libs - @binPrefix@ld -macosx_version_min 10.10 -arch x86_64 -dylib \ + @binPrefix@ld -macosx_version_min $MACOSX_DEPLOYMENT_TARGET -arch x86_64 -dylib \ -o "$out/lib/lib${children[0]}.dylib" \ -install_name "$out/lib/lib${children[0]}.dylib" \ "${childrenLookup[@]}" "$symbolBloatObject" \ "${childrenLink[@]:0:$((${#childrenLink[@]} / 2 ))}" # second half of libs - @binPrefix@ld -macosx_version_min 10.10 -arch x86_64 -dylib \ + @binPrefix@ld -macosx_version_min $MACOSX_DEPLOYMENT_TARGET -arch x86_64 -dylib \ -o "$out/lib/lib${children[1]}.dylib" \ -install_name "$out/lib/lib${children[1]}.dylib" \ "${childrenLookup[@]}" "$symbolBloatObject" \ -- cgit 1.4.1 From ef5ba4d5b29e329ab4240120870ef4d860ebd54e Mon Sep 17 00:00:00 2001 From: Michael Alan Dorman Date: Thu, 3 Aug 2017 20:24:55 -0400 Subject: Fix emacs wrapper expression to honor bash array use In 8d76eff, @Ericson2314 changed the representation of the value that `findInputs` generated from a whitespace-separated bunch strings to an actual array of strings. Expressions that *consume* that value, however, also needed to be changed to iterate over all the contents of the array, else they would only select the first value, which turns out to be somewhat limiting. Fixes #27873 --- pkgs/build-support/emacs/wrapper.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'pkgs/build-support') diff --git a/pkgs/build-support/emacs/wrapper.nix b/pkgs/build-support/emacs/wrapper.nix index e41b1fd6a215..bd733f1b9baf 100644 --- a/pkgs/build-support/emacs/wrapper.nix +++ b/pkgs/build-support/emacs/wrapper.nix @@ -80,7 +80,8 @@ stdenv.mkDerivation { linkPath "$1" "share/emacs/site-lisp" "share/emacs/site-lisp" } - for pkg in $requires; do + # Iterate over the array of inputs (avoiding nix's own interpolation) + for pkg in "''${requires[@]}"; do linkEmacsPackage $pkg done -- cgit 1.4.1