From 48380b48c2ef672b5139f9fe94ce3bc89e08f95c Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Sun, 13 Jan 2013 16:51:31 -0500 Subject: [PATCH] Lots of improvements to DMG creation. * Remove lots of sudoing, and instead use one to change the contents (of non-simple DMGs). Perhaps that's not needed too. (I think that there used to be some problem when the owner was a specific user in the installer script days, perhaps it caused some mess in the pre/post flight scripts. Maybe it's safe to not do this anymore.) * There was a fundamental weakness in the Finder script -- it tweaks the DMG by openning its mount, but the way to specify a disk is via its displayed name which is not unique. This can be problematic if there is already a mount that has the same name, and given that the DMG machine can be used by PLT people, it's even likely to happen. It is tricky to solve this, since there is no way that I see to refer to the disk by its mount point or device in the Finder, and no way to find out the name in the shell. I spent a ton of time searching the webs for a solution, but it seems that practically nobody is concerned (or even aware of this problem). Eventually, the hack I did is to mount the image onto a randomly named directory, then iterate over all disks and look for one whose `name' property is that directory name (apparently the `name' property is the name of the last component of the mount point). For safety, throw an error if no such disk is found, or if more than one is found. Incidentally, using a known mount point also simplifies things since there is no need to know the device name of the mount. * Use UDBZ instead of UDZO for the compressed image. The savings are not as big as I expected them to be for some reason, but the compatibility issues should be all gone now (UDBZ works only from 10.4 and up). * Unset $LD_LIBRARY_PATH to avoid some 10.8 bug. * Switch the build to happen on dublin, running 10.8. At least code-signing is broken on the 10.5.8 machine, and possibly also the osascript to identify the desired image disk. (cherry picked from commit 368ee6d8b563b5576699d46cdb16120237a994f4) --- collects/meta/build/build | 51 ++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/collects/meta/build/build b/collects/meta/build/build index 3b914e1be1..542fd1229a 100755 --- a/collects/meta/build/build +++ b/collects/meta/build/build @@ -53,7 +53,7 @@ workmachine="winooski" maindir="/home/scheme" # machines for specific installer creations -dmgmachine="weatherwax" +dmgmachine="dublin" nsismachine="pitcairn" # list of environment variables that should be carried over to ssh jobs @@ -1726,10 +1726,7 @@ make_dmg() { # inputs: dir, dmg, bg-image show "Making \"$tgtdmg\" from \"$srcdir\"" if [[ "x$tmpbg" != "x-" ]]; then _cp "$tmpbg" "$srcdir"; fi _cd "$(dirname "$srcdir")" - _run sudo rm -f "$tgtdmg" "$tmpdmg" - # It should be possible to create dmgs normally, but they'd be created with - # the same user id of whoever runs this script... - _run sudo chown -R root:admin "$src" + _rm "$tgtdmg" "$tmpdmg" # The following command should work fine, but it looks like hdiutil in 10.4 # is miscalculating the needed size, making it too big in our case (and too # small with >8GB images). It seems that it works to first generate an @@ -1737,31 +1734,46 @@ make_dmg() { # inputs: dir, dmg, bg-image # _run sudo hdiutil create -format UDZO -imagekey zlib-level=9 -ov \ # -mode 555 -volname "$src" -srcfolder "$src" "$tgtdmg" # so: [1] create an uncompressed image - _run sudo hdiutil create -format UDRW -ov \ - -mode 755 -volname "$src" -srcfolder "$src" "$tmpdmg" + _run hdiutil create -format UDRW -ov \ + -mode 755 -volname "$src" -srcfolder "$src" "$tmpdmg" # [2] remove the source tree - _run sudo rm -rf "$src" + _rm "$src" # [3] do the expected dmg layout (see below) if [[ "x$tmpbg" != "x-" ]]; then easy_dmg_layout "$tmpdmg" "$src" "$(basename "$tmpbg")" fi # [4] create the compressed image from the uncompressed image - _run sudo hdiutil convert -format UDZO -imagekey zlib-level=9 -ov \ + _run hdiutil convert -format UDBZ -imagekey zlib-level=9 -ov \ "$tmpdmg" -o "$tgtdmg" # [5] remove the uncompressed image - _run sudo chown "$myself" "$tgtdmg" "$tmpdmg" _rm "$tmpdmg" } easy_dmg_layout() { local tmpdmg="$1" volname="$2" bg="$3"; shift 3 show "Mounting image for layout" - local vol_dev="$( - sudo hdiutil attach -readwrite -noverify -noautoopen "$tmpdmg" \ - | grep '/dev/' | head -1 | awk '{print $1}')" + local mnt="mounted-dmg-$$" + _run hdiutil attach -readwrite -noverify -noautoopen \ + -mountpoint "$tmpdir/$mnt" "$tmpdmg" show "Creating layout via Finder" - sudo /usr/bin/osascript <<-EOF + # see also https://github.com/andreyvit/yoursway-create-dmg + /usr/bin/osascript <<-EOF tell application "Finder" - tell disk "$volname" + -- look for a single disk with the mount point as its name + -- (maybe this works only on newer osx versions?) + set myDisks to every disk of desktop + set theDMGDisk to "" + repeat with d in myDisks + if name of d = "$mnt" + if theDMGDisk = "" + set theDMGDisk to d + else + error "Too many attached DMGs found!" + end if + end if + end repeat + if theDMGDisk = "" then error "Attached DMG not found!" + -- found a single matching disk, continue + tell theDMGDisk open set current view of container window to icon view set toolbar visible of container window to false @@ -1786,7 +1798,9 @@ easy_dmg_layout() { end tell EOF sync; sync - _run sudo hdiutil detach "$vol_dev" + _run sudo chown -R root:admin "$tmpdir/$mnt/"* "$tmpdir/$mnt/".[^.]* + sync; sync + _run hdiutil detach "$tmpdir/$mnt" } #---------------------------------------- do_tgz_to_dmg() { @@ -1799,6 +1813,7 @@ do_tgz_to_dmg() { distname="$distname $(name_of_dist_type "$ptype")" fi local savedpwd="$(pwd)" + unset LD_LIBRARY_PATH # no warnings (http://openradar.appspot.com/11894054) _rm "$tmpdmg" _rmcd "$tmpdir/tgz-to-dmg-$$" _mcd "$distname" @@ -1825,7 +1840,9 @@ tgz_to_dmg() { _scp "$PLTHOME/$dmgbackground" "${dmgmachine}:$tmpbg" fi local script="-" - if [[ -e "$dmgscriptname" ]]; then script="$(cat "$dmgscriptname")"; fi + if [[ "$simpledmg" = "no" && -e "$dmgscriptname" ]]; then + script="$(cat "$dmgscriptname")" + fi run_part "$dmgmachine" "do_tgz_to_dmg" \ "$tmptgz" "$tmpdmg" "$tmpbg" "$script" \ "$version" "$pname" "$ptype" "$srcplatform"