Use xargs to parallelize calls to codesign for much faster results. The thread count should really be turned into an env variable or auto detected.
1136 lines
33 KiB
Bash
Executable File
1136 lines
33 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
# script for pulling together a MacOSX app bundle.
|
|
|
|
GTKSTACK_ROOT=$HOME/gtk/inst
|
|
BUILD_ROOT=../../build
|
|
|
|
# where harvid and xjadeo binaries are cached
|
|
if test -z "$CACHEDIR" -o ! -d "$CACHEDIR"; then
|
|
CACHEDIR=/var/tmp
|
|
fi
|
|
mkdir -p "$CACHEDIR"
|
|
|
|
MIXBUS=
|
|
MIXBUS32C=
|
|
WITH_HARVID=1
|
|
WITH_HARRISON_LV2=
|
|
WITH_COMMERCIAL_X42_LV2=
|
|
WITH_GRATIS_X42_LV2=
|
|
STRIP=1
|
|
PRINT_SYSDEPS=
|
|
WITH_NLS=1
|
|
|
|
: ${HARRISONCHANNELSTRIP=harrison_channelstrip}
|
|
: ${HARRISONLV2=harrison_lv2s-n}
|
|
: ${HARRISONDSPURL=http://rsrc.harrisonconsoles.com/plugins/releases/public}
|
|
|
|
. ../define_versions.sh
|
|
|
|
while [ $# -gt 0 ] ; do
|
|
echo "arg = $1"
|
|
case $1 in
|
|
|
|
#
|
|
# top level build targets
|
|
#
|
|
|
|
--mixbus) MIXBUS=1;
|
|
WITH_HARRISON_LV2=1 ;
|
|
WITH_COMMERCIAL_X42_LV2=1
|
|
WITH_GRATIS_X42_LV2=1
|
|
STRIP= ;
|
|
PRODUCT_PKG_DIR=Mixbus;
|
|
APPNAME=Mixbus ;
|
|
BUNDLENAME=Mixbus${major_version} ;
|
|
lower_case_appname=mixbus;
|
|
BUNDLE_ID_BASE=com.harrisonconsoles
|
|
shift ;;
|
|
--mixbus32c) MIXBUS=1;
|
|
MIXBUS32C=1;
|
|
WITH_HARRISON_LV2=1 ;
|
|
WITH_COMMERCIAL_X42_LV2=1
|
|
WITH_GRATIS_X42_LV2=1
|
|
STRIP= ;
|
|
PRODUCT_PKG_DIR=Mixbus32C;
|
|
lower_case_appname=mixbus32c;
|
|
BUNDLE_ID_BASE=com.harrisonconsoles
|
|
APPNAME=Mixbus32C ;
|
|
BUNDLENAME=Mixbus32C-${major_version} ;
|
|
shift ;;
|
|
--public)
|
|
WITH_HARRISON_LV2=1 ;
|
|
PRODUCT_PKG_DIR=Ardour;
|
|
APPNAME=Ardour ;
|
|
BUNDLENAME=Ardour${major_version} ;
|
|
lower_case_appname=ardour;
|
|
BUNDLE_ID_BASE=org.ardour
|
|
shift ;;
|
|
|
|
#
|
|
# specific build flags
|
|
#
|
|
|
|
--noharvid) WITH_HARVID= ; shift ;;
|
|
--nostrip) STRIP= ; shift ;;
|
|
--sysdeps) PRINT_SYSDEPS=1; shift ;;
|
|
--no-nls) WITH_NLS= ; shift ;;
|
|
--nls) WITH_NLS=1 ; shift ;;
|
|
--chanstrip) HARRISONCHANNELSTRIP=$2 ; shift; shift ;;
|
|
--stack) GTKSTACK_ROOT=$2 ; shift; shift ;;
|
|
esac
|
|
done
|
|
|
|
if test -z "$PRODUCT_PKG_DIR" -o -z "$APPNAME"; then
|
|
echo "application or product-name was not specified"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Version is $release_version"
|
|
if [ "x$commit" != "x" ] ; then
|
|
info_string="$release_version ($commit) built on `hostname` by `whoami` on `date`"
|
|
else
|
|
info_string="$release_version built on `hostname` by `whoami` on `date`"
|
|
fi
|
|
echo "Info string is $info_string"
|
|
|
|
if [ x$DEBUG = xT ]; then
|
|
STRIP=
|
|
echo "Debug build, strip disabled"
|
|
else
|
|
if test x$STRIP != x ; then
|
|
echo "No debug build, strip enabled"
|
|
else
|
|
echo "No debug build, but strip disabled."
|
|
fi
|
|
fi
|
|
|
|
# setup directory structure
|
|
|
|
APPDIR=${BUNDLENAME}.app
|
|
APPROOT=$APPDIR/Contents
|
|
Frameworks=$APPROOT/lib
|
|
Resources=$APPROOT/Resources
|
|
#
|
|
# Since this is OS X, don't try to distinguish between etc and shared
|
|
# (machine dependent and independent data) - just put everything
|
|
# into Resources.
|
|
#
|
|
Shared=$Resources
|
|
Etc=$Resources
|
|
Locale=$Resources/locale
|
|
|
|
Surfaces=$Frameworks/surfaces
|
|
Panners=$Frameworks/panners
|
|
Backends=$Frameworks/backends
|
|
MidiMaps=$Shared/midi_maps
|
|
PluginMetadata=$Shared/plugin_metadata
|
|
MixerSettings=$Shared/mixer_settings
|
|
ExportFormats=$Shared/export
|
|
Templates=$Shared/templates
|
|
PatchFiles=$Shared/patchfiles
|
|
LuaScripts=$Shared/scripts
|
|
MediaClips=$Shared/media
|
|
WebSurfaces=$Shared/web_surfaces
|
|
MackieControl=$Shared/mcp
|
|
OSC=$Shared/osc
|
|
Themes=$Shared/themes
|
|
|
|
if [ x$PRINT_SYSDEPS != x ] ; then
|
|
#
|
|
# print system dependencies
|
|
#
|
|
|
|
for file in $APPROOT/MacOS/* $Frameworks/* ; do
|
|
if ! file $file | grep -qs Mach-O ; then
|
|
continue
|
|
fi
|
|
otool -L $file | awk '{print $1}' | egrep -v "(^@executable_path|^Ardour[0-9][.0-9]*.app)"
|
|
done | sort | uniq
|
|
exit 0
|
|
fi
|
|
|
|
echo "Removing old $APPDIR tree ..."
|
|
|
|
rm -rf $APPDIR
|
|
|
|
echo "Building new app directory structure ..."
|
|
|
|
# only bother to make the longest paths
|
|
|
|
mkdir -p $APPROOT/MacOS
|
|
mkdir -p $APPROOT/Resources
|
|
mkdir -p $Surfaces
|
|
mkdir -p $Panners
|
|
mkdir -p $Backends
|
|
mkdir -p $MidiMaps
|
|
mkdir -p $ExportFormats
|
|
mkdir -p $Etc
|
|
mkdir -p $MackieControl
|
|
mkdir -p $OSC
|
|
mkdir -p $PatchFiles
|
|
mkdir -p $LuaScripts
|
|
mkdir -p $Themes
|
|
|
|
EXECUTABLE=${BUNDLENAME}
|
|
|
|
#
|
|
# if we're not going to bundle JACK, make sure we can find
|
|
# jack in the places where it might be
|
|
#
|
|
|
|
env=""
|
|
env="$env<key>PATH</key><string>/usr/local/bin:/opt/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>"
|
|
env="$env<key>DYLIB_FALLBACK_LIBRARY_PATH</key><string>/usr/local/lib:/opt/lib</string>"
|
|
|
|
env="<key>LSEnvironment</key><dict>$env<key>ARDOUR_BUNDLED</key><string>true</string></dict>"
|
|
|
|
|
|
# edit plist
|
|
sed -e "s?@ENV@?$env?g" \
|
|
-e "s?@VERSION@?$release_version?g" \
|
|
-e "s?@INFOSTRING@?$info_string?g" \
|
|
-e "s?@IDBASE@?$BUNDLE_ID_BASE?g" \
|
|
-e "s?@IDSUFFIX@?$EXECUTABLE?g" \
|
|
-e "s?@BUNDLENAME@?$BUNDLENAME?g" \
|
|
-e "s?@EXECUTABLE@?$EXECUTABLE?g" < Info.plist.in > Info.plist
|
|
# and plist strings
|
|
sed -e "s?@APPNAME@?$appname?" \
|
|
-e "s?@ENV@?$env?g" \
|
|
-e "s?@VERSION@?$release_version?g" \
|
|
-e "s?@INFOSTRING@?$info_string?g" < InfoPlist.strings.in > Resources/InfoPlist.strings || exit 1
|
|
|
|
# copy static files
|
|
|
|
cp Info.plist $APPROOT
|
|
cp -R Resources $APPROOT
|
|
|
|
# ..and clean up
|
|
rm -f Info.plist
|
|
rm -f Resources/InfoPlist.strings
|
|
|
|
# if we build a bundle without jack, then
|
|
# make the Ardour executable a helper
|
|
# script that checks to see if JACK is
|
|
# installed.
|
|
#
|
|
#cp startup_script $APPROOT/MacOS/$EXECUTABLE
|
|
#chmod 775 $APPROOT/MacOS/$EXECUTABLE
|
|
#MAIN_EXECUTABLE=Ardour.bin ## used in startup_script
|
|
|
|
# For Catalina we cannot use a shell script wrapper
|
|
# the binary mentioned in the .plist must match
|
|
# the actual executable, otherwise the user is
|
|
# not prompted to grant permissions to access the audio-device
|
|
|
|
MAIN_EXECUTABLE=$EXECUTABLE
|
|
|
|
echo "Copying ardour executable ...."
|
|
cp $BUILD_ROOT/gtk2_ardour/ardour-$release_version $APPROOT/MacOS/$MAIN_EXECUTABLE
|
|
if test x$MIXBUS32C != x ; then
|
|
cp Mixbus32C.icns $Resources/appIcon.icns
|
|
elif test x$MIXBUS != x ; then
|
|
cp Mixbus.icns $Resources/appIcon.icns
|
|
else
|
|
cp Ardour.icns $Resources/appIcon.icns
|
|
fi
|
|
cp typeArdour.icns $Resources/
|
|
|
|
set +e # things below are not error-free (optional files etc) :(
|
|
|
|
# copy locale files
|
|
if test x$WITH_NLS != x ; then
|
|
echo "NLS support ..."
|
|
echo "I hope you remembered to run waf i18n"
|
|
LINGUAS=
|
|
|
|
for pkg in gtk2_ardour libs/ardour libs/gtkmm2ext ; do
|
|
files=`find ../../$pkg -name "*.mo"`
|
|
|
|
#
|
|
# the package name is appended with a number so that
|
|
# it can be parallel installed during a regular install
|
|
# with older (and newer) versions. it is just the major
|
|
# number of the release (i.e. leading digits)
|
|
#
|
|
|
|
vsuffix=`echo $release_version | sed 's/^\([0-9][0-9]*\).*/\1/'`
|
|
|
|
if [ -z "$files" ]; then
|
|
echo ""
|
|
echo "!!!! WARNING !!!! - Did not find any .mo files in ../../$pkg"
|
|
echo ""
|
|
fi
|
|
|
|
for file in $files
|
|
do
|
|
echo $file
|
|
lang=`basename $file | sed 's/\.mo//'`
|
|
mkdir -p $Locale/$lang/LC_MESSAGES
|
|
cp $file $Locale/$lang/LC_MESSAGES/`basename $pkg`$vsuffix.mo
|
|
echo copy $file to $Locale/$lang/LC_MESSAGES/`basename $pkg`$vsuffix.mo
|
|
if echo $LINGUAS | grep $lang >/dev/null 2>&1 ; then
|
|
:
|
|
else
|
|
LINGUAS="$LINGUAS $lang"
|
|
fi
|
|
done
|
|
done
|
|
|
|
for l in $LINGUAS
|
|
do
|
|
if [ -d $GTKSTACK_ROOT/share/locale/$l ] ; then
|
|
echo "Copying GTK i18n files for $l..."
|
|
cp -r $GTKSTACK_ROOT/share/locale/$l $Locale
|
|
else
|
|
# try with just the language spec
|
|
just_lang=`echo $l | sed 's/_[A-Z][A-Z]$//'`
|
|
if [ -d $GTKSTACK_ROOT/share/locale/$just_lang ] ; then
|
|
echo "Copying GTK i18n files for $l..."
|
|
cp -r $GTKSTACK_ROOT/share/locale/$just_lang $Locale
|
|
fi
|
|
fi
|
|
done
|
|
else
|
|
echo "Skipping NLS support"
|
|
fi
|
|
|
|
#
|
|
# Copy stuff that may be dynamically loaded
|
|
#
|
|
|
|
#cp -R $GTKSTACK_ROOT/etc/* $Etc
|
|
#cp -R $GTKSTACK_ROOT/lib/charset.alias $Resources
|
|
|
|
# We rely on clearlooks, so include a version from our own build tree
|
|
# this one is special - we will set GTK_PATH to $Frameworks/gtkengines
|
|
|
|
GTK_ENGINE_DIR=$Frameworks/gtkengines/engines
|
|
mkdir -p $GTK_ENGINE_DIR
|
|
|
|
echo "Copying GTK engines ..."
|
|
cp $BUILD_ROOT/libs/clearlooks-newer/libclearlooks.dylib $GTK_ENGINE_DIR/libclearlooks.so
|
|
|
|
# Control Surface shared libraries
|
|
cp $BUILD_ROOT/libs/surfaces/*/libardour_*.dylib $Surfaces
|
|
cp $BUILD_ROOT/libs/surfaces/control_protocol/libardourcp*.dylib $Frameworks
|
|
|
|
# Panners
|
|
cp $BUILD_ROOT/libs/panners/*/lib*.dylib $Panners
|
|
|
|
# Backends
|
|
cp $BUILD_ROOT/libs/backends/*/lib*.dylib $Backends
|
|
|
|
# Export Formats/Presets
|
|
for f in $BUILD_ROOT/../share/export/*.preset $BUILD_ROOT/../share/export/*.format ; do
|
|
cp "$f" $ExportFormats ;
|
|
done
|
|
|
|
#Session templates
|
|
cp -R $BUILD_ROOT/../share/templates $Templates
|
|
|
|
# PluginMetadata
|
|
cp -R $BUILD_ROOT/../share/plugin_metadata $PluginMetadata
|
|
|
|
# MidiMaps
|
|
# got to be careful with names here
|
|
for x in $BUILD_ROOT/../share/midi_maps/*.map ; do
|
|
cp "$x" $MidiMaps
|
|
done
|
|
|
|
# MIDNAM Patch Files
|
|
# got to be careful with names here
|
|
for x in $BUILD_ROOT/../share/patchfiles/*.midnam ; do
|
|
cp "$x" $PatchFiles
|
|
done
|
|
|
|
# Lua Script Files
|
|
# got to be careful with names here
|
|
for x in $BUILD_ROOT/../share/scripts/*.lua ; do
|
|
BN=$(basename $x)
|
|
if test "${BN:0:1}" = "_"; then
|
|
continue;
|
|
fi
|
|
cp "$x" $LuaScripts
|
|
done
|
|
|
|
# recusively copy web-surface html/js
|
|
cp -R $BUILD_ROOT/../share/web_surfaces $WebSurfaces
|
|
rm $WebSurfaces/wscript
|
|
|
|
# recusively copy clips/media
|
|
cp -R $BUILD_ROOT/../share/media $MediaClips
|
|
rm $MediaClips/wscript
|
|
|
|
# MackieControl data
|
|
# got to be careful with names here
|
|
for x in $BUILD_ROOT/../share/mcp/*.device $BUILD_ROOT/../share/mcp/*.profile ; do
|
|
cp "$x" $MackieControl
|
|
done
|
|
|
|
# OSC data
|
|
# got to be careful with names here
|
|
for x in $BUILD_ROOT/../share/osc/*.preset ; do
|
|
cp "$x" $OSC
|
|
done
|
|
|
|
# Mixbus MixerSettings (if any)
|
|
for x in $BUILD_ROOT/../mixer_settings/*.lua ; do
|
|
mkdir -p $MixerSettings # create on demand
|
|
cp "$x" $MixerSettings
|
|
done
|
|
|
|
# VAMP plugins that we use
|
|
cp $BUILD_ROOT/libs/vamp-plugins/libardourvampplugins.dylib $Frameworks
|
|
cp $BUILD_ROOT/libs/vamp-pyin/libardourvamppyin.dylib $Frameworks
|
|
|
|
# Suil modules (new dir 'build-stack')
|
|
if test -d $GTKSTACK_ROOT/lib/suil-0/ ; then
|
|
cp $GTKSTACK_ROOT/lib/suil-0/lib* $Frameworks
|
|
fi
|
|
|
|
# VST scanner app and wrapper script, if they exist
|
|
if test -d $BUILD_ROOT/libs/fst ; then
|
|
cp $BUILD_ROOT/libs/fst/ardour-vst-scanner* $Frameworks/ || true
|
|
cp $BUILD_ROOT/libs/fst/ardour-vst3-scanner* $Frameworks/ || true
|
|
fi
|
|
if test -d $BUILD_ROOT/libs/auscan ; then
|
|
cp $BUILD_ROOT/libs/auscan/ardour-au-scanner* $Frameworks/ || true
|
|
fi
|
|
|
|
# vfork wrapper
|
|
if test -f $BUILD_ROOT/libs/vfork/ardour-exec-wrapper ; then
|
|
cp $BUILD_ROOT/libs/vfork/ardour-exec-wrapper $Frameworks/
|
|
fi
|
|
|
|
# session utils start script (temp file)
|
|
cat >> $Frameworks/ardour-util.sh << EOF
|
|
#!/bin/sh
|
|
|
|
BIN_DIR=\$(dirname "\$0")
|
|
BUNDLE_DIR=\$(dirname "\$BIN_DIR")
|
|
|
|
export ARDOUR_DATA_PATH="\$BUNDLE_DIR/Resources"
|
|
export ARDOUR_CONFIG_PATH="\$BUNDLE_DIR/Resources"
|
|
export ARDOUR_DLL_PATH="\$BUNDLE_DIR/lib"
|
|
export VAMP_PATH="\$BUNDLE_DIR/lib"\${VAMP_PATH:+:\$VAMP_PATH}
|
|
|
|
SELF=\$(basename "\$0")
|
|
exec "\$BUNDLE_DIR/lib/\$SELF" "\$@"
|
|
EOF
|
|
chmod +x $Frameworks/ardour-util.sh
|
|
|
|
# session-utils
|
|
HAVE_SESSION_UTILS=false
|
|
for file in $BUILD_ROOT/session_utils/${lower_case_appname}${major_version}-*; do
|
|
BN=$(basename $file)
|
|
cp $file $Frameworks/
|
|
if test x$STRIP = xall ; then
|
|
strip -s $Frameworks/${BN}
|
|
fi
|
|
cp -R $Frameworks/ardour-util.sh ${APPROOT}/MacOS/${BN}
|
|
HAVE_SESSION_UTILS=true
|
|
done
|
|
|
|
if test -x $BUILD_ROOT/luasession/luasession; then
|
|
BN=${lower_case_appname}${major_version}-lua
|
|
cp $BUILD_ROOT/luasession/luasession $Frameworks/$BN
|
|
if test x$STRIP = xall ; then
|
|
strip -s $Frameworks/${BN}
|
|
fi
|
|
cp -R $Frameworks/ardour-util.sh ${APPROOT}/MacOS/${BN}
|
|
HAVE_SESSION_UTILS=true
|
|
fi
|
|
|
|
# dynamically loaded NSS/SSL libs
|
|
nsslibs="libsoftokn3.dylib libnsspem.dylib libnssckbi.dylib libfreebl3.dylib libnssdbm3.dylib libplds4.dylib"
|
|
for nsslib in $nsslibs; do
|
|
cp $GTKSTACK_ROOT/lib/$nsslib $Frameworks/ 2>/dev/null || true
|
|
done
|
|
|
|
# TODO check if this is still needed, even when building on 10.5
|
|
if file $BUILD_ROOT/gtk2_ardour/ardour-$release_version | grep -q ppc; then
|
|
STDCPP='|libstdc\+\+'
|
|
else
|
|
STDCPP=
|
|
fi
|
|
|
|
while [ true ] ; do
|
|
missing=false
|
|
for file in $APPROOT/MacOS/* $Frameworks/* $Panners/*.dylib $Backends/*.dylib $Surfaces/*.dylib $GTK_ENGINE_DIR/*.dylib ; do
|
|
if ! file $file | grep -qs Mach-O ; then
|
|
continue
|
|
fi
|
|
# libffi contains "S" (other section symbols) that should not be stripped.
|
|
if [[ $file = *"libffi"* ]] ; then
|
|
continue
|
|
fi
|
|
|
|
if test x$STRIP != x ; then
|
|
# NSS is dynamically loaded, symbols cannot be stripped
|
|
if test "`basename $file`" = "libnspr4.dylib" -o "`basename $file`" = "libplds4.dylib"; then
|
|
# only remove debug and local symbols
|
|
strip -S -x -u -r -arch all $file &>/dev/null
|
|
else
|
|
strip -u -r -arch all $file &>/dev/null
|
|
fi
|
|
fi
|
|
|
|
deps=`otool -L $file | awk '{print $1}' | egrep "($GTKSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | grep -v 'libjack\.' | grep -v "$(basename $file)"`
|
|
# echo -n "."
|
|
for dep in $deps ; do
|
|
base=`basename $dep`
|
|
if ! test -f $Frameworks/$base; then
|
|
if echo $dep | grep -sq '^libs' ; then
|
|
cp $BUILD_ROOT/$dep $Frameworks
|
|
else
|
|
cp $dep $Frameworks
|
|
fi
|
|
missing=true
|
|
chmod 755 $Frameworks/$base
|
|
fi
|
|
done
|
|
done
|
|
if test x$missing = xfalse ; then
|
|
# everything has been found
|
|
break
|
|
fi
|
|
done
|
|
echo
|
|
|
|
echo "Copying other stuff to $APPDIR ..."
|
|
|
|
cp $BUILD_ROOT/gtk2_ardour/ardour.keys $Resources
|
|
cp $BUILD_ROOT/gtk2_ardour/ardour.menus $Resources
|
|
cp $BUILD_ROOT/gtk2_ardour/default_ui_config $Resources
|
|
cp $BUILD_ROOT/gtk2_ardour/clearlooks.rc $Resources
|
|
|
|
# Copied directly from source tree
|
|
|
|
mkdir ${Resources}/icons
|
|
mkdir ${Resources}/resources
|
|
cp ../../system_config $Resources/system_config
|
|
cp ../../gtk2_ardour/icons/*.png ${Resources}/icons/
|
|
cp -r ../../gtk2_ardour/icons/cursor_* ${Resources}/icons/
|
|
cp ../../gtk2_ardour/ArdourMono.ttf $Shared
|
|
cp ../../gtk2_ardour/ArdourSans.ttf $Shared
|
|
cp ../../gtk2_ardour/resources/${PRODUCT_PKG_DIR}-* ${Resources}/resources/
|
|
|
|
|
|
# Themes: only install those named for this app
|
|
cp ../../gtk2_ardour/themes/*-${lower_case_appname}.colors $Themes
|
|
|
|
# go through and recursively remove any .svn dirs in the bundle
|
|
for svndir in `find $APPDIR -name .svn -type dir`; do
|
|
rm -rf $svndir
|
|
done
|
|
|
|
# remove temp session utils start script
|
|
rm $Frameworks/ardour-util.sh
|
|
|
|
# install bundled LV2s to <app>/Contents/lib/LV2/
|
|
cp -R $BUILD_ROOT/libs/LV2 $Frameworks/
|
|
|
|
# lv2 core, classifications
|
|
for file in $GTKSTACK_ROOT/lib/lv2/*.lv2; do
|
|
BN=$(basename $file)
|
|
mkdir -p $Frameworks/LV2/$BN
|
|
cp $GTKSTACK_ROOT/lib/lv2/${BN}/*.ttl $Frameworks/LV2/${BN}/
|
|
done
|
|
|
|
|
|
# now fix up the executables
|
|
echo "Fixing up executable dependency names ..."
|
|
executables=$MAIN_EXECUTABLE
|
|
if test "$HAVE_SESSION_UTILS" = true ; then
|
|
for file in $Frameworks/${lower_case_appname}${major_version}-*; do
|
|
BN=$(basename $file)
|
|
executables="$executables ../lib/${BN}"
|
|
done
|
|
fi
|
|
|
|
if test -f "$Frameworks/ardour-vst-scanner"; then
|
|
executables="$executables ../lib/ardour-vst-scanner"
|
|
fi
|
|
|
|
if test -f "$Frameworks/ardour-vst3-scanner"; then
|
|
executables="$executables ../lib/ardour-vst3-scanner"
|
|
fi
|
|
|
|
if test -f "$Frameworks/ardour-au-scanner"; then
|
|
executables="$executables ../lib/ardour-au-scanner"
|
|
fi
|
|
|
|
for exe in $executables; do
|
|
echo "Processing Executable: $exe"
|
|
EXE=$APPROOT/MacOS/$exe
|
|
changes=""
|
|
for lib in `otool -L $EXE | egrep "($GTKSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
|
|
base=`basename $lib`
|
|
changes="$changes -change $lib @executable_path/../lib/$base"
|
|
done
|
|
if test "x$changes" != "x" ; then
|
|
install_name_tool $changes $EXE
|
|
fi
|
|
done
|
|
|
|
echo "Fixing up library names ..."
|
|
# now do the same for all the libraries we include
|
|
for libdir in $Frameworks $Surfaces $Panners $Backends $Frameworks/LV2/* $GTK_ENGINE_DIR; do
|
|
|
|
libbase=`echo "$libdir" | sed 's#^'$Frameworks'##'`
|
|
|
|
for dylib in $libdir/*.dylib $libdir/*.so ; do
|
|
|
|
# skip symlinks
|
|
if test -L $dylib ; then
|
|
echo "FOUND SYMLINK"
|
|
exit
|
|
fi
|
|
if ! test -f $dylib ; then
|
|
continue
|
|
fi
|
|
|
|
# change all the dependencies
|
|
|
|
changes=""
|
|
for lib in `otool -L $dylib | egrep "($GTKSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | awk '{print $1}' | grep -v 'libjack\.'` ; do
|
|
base=`basename $lib`
|
|
if test -f $Frameworks/$base ; then
|
|
changes="$changes -change $lib @executable_path/../lib/$base"
|
|
fi
|
|
done
|
|
|
|
if test "x$changes" != x ; then
|
|
if install_name_tool $changes $dylib ; then
|
|
:
|
|
else
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# now the change what the library thinks its own name is
|
|
|
|
base=`basename $dylib`
|
|
install_name_tool -id @executable_path/../lib$libbase/$base $dylib
|
|
done
|
|
done
|
|
|
|
#
|
|
# and now ... the DMG
|
|
#
|
|
|
|
rm -rf $PRODUCT_PKG_DIR
|
|
mkdir $PRODUCT_PKG_DIR
|
|
|
|
DMGWINBOTTOM=440
|
|
DMGBACKGROUND=dmgbg
|
|
|
|
if [ x$MIXBUS != x ] ; then
|
|
|
|
# Mixbus packaging
|
|
|
|
echo "Creating Mixbus packaging directory"
|
|
mv $APPDIR $PRODUCT_PKG_DIR/
|
|
DMGBACKGROUND=dmgbgMB
|
|
else
|
|
|
|
echo "Creating $APPNAME packaging directory"
|
|
mv $APPDIR $PRODUCT_PKG_DIR/
|
|
|
|
fi
|
|
|
|
################################################################################
|
|
# from here on $PRODUCT_PKG_DIR/ prefix is needed
|
|
################################################################################
|
|
|
|
DMG_ARCH=""
|
|
if file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q x86_64; then
|
|
OSX_ARCH=x86_64
|
|
OSX_X42URI=x42-plugins.com/x42/osx
|
|
OSX_X42ID=osx
|
|
OSX_BENSID=osx64
|
|
elif file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q ppc; then
|
|
OSX_ARCH=ppc
|
|
OSX_X42URI=x42-plugins.com/x42/osx
|
|
OSX_X42ID=osx
|
|
OSX_BENSID=osxppc
|
|
elif file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q arm64; then
|
|
OSX_ARCH=arm64
|
|
OSX_X42URI=x42-plugins.com/x42/mac
|
|
OSX_X42ID="macOS-arm64"
|
|
DMG_ARCH="-arm64"
|
|
OSX_BENSID=macarm64
|
|
else
|
|
OSX_ARCH=i386
|
|
OSX_X42URI=x42-plugins.com/x42/osx
|
|
OSX_X42ID=osx
|
|
OSX_BENSID=osx32
|
|
fi
|
|
|
|
if test x$WITH_HARRISON_LV2 != x ; then
|
|
curl -s -S --fail -# \
|
|
-z "${CACHEDIR}/${HARRISONLV2}.${OSX_BENSID}.zip" \
|
|
-o "${CACHEDIR}/${HARRISONLV2}.${OSX_BENSID}.zip" \
|
|
"${HARRISONDSPURL}/${HARRISONLV2}.${OSX_BENSID}.zip"
|
|
|
|
mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2"
|
|
bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
|
|
"${CACHEDIR}/${HARRISONLV2}.${OSX_BENSID}.zip"
|
|
fi
|
|
|
|
if test x$WITH_HARVID != x ; then
|
|
echo "installing video tools.."
|
|
if test $OSX_ARCH = ppc; then
|
|
# EOL
|
|
HARVID_VERSION=v0.8.2
|
|
XJADEO_VERSION=v0.8.8
|
|
else
|
|
HARVID_VERSION=$(curl -s -S http://ardour.org/files/video-tools/harvid_version.txt)
|
|
XJADEO_VERSION=$(curl -s -S http://ardour.org/files/video-tools/xjadeo_version.txt)
|
|
fi
|
|
echo "copying harvid and xjadeo ..."
|
|
|
|
rsync -Pa \
|
|
rsync://ardour.org/video-tools/harvid-${OSX_X42ID}-${HARVID_VERSION}.tgz \
|
|
"$CACHEDIR/harvid-${OSX_X42ID}-${HARVID_VERSION}.tgz"
|
|
|
|
rsync -Pa \
|
|
rsync://ardour.org/video-tools/jadeo${DMG_ARCH}-${XJADEO_VERSION:1}.dmg \
|
|
"$CACHEDIR/jadeo${DMG_ARCH}-${XJADEO_VERSION:1}.dmg"
|
|
|
|
tar -x -z \
|
|
-C $PRODUCT_PKG_DIR/$APPROOT \
|
|
-f "$CACHEDIR/harvid-${OSX_X42ID}-${HARVID_VERSION}.tgz" || exit 1
|
|
|
|
JADEO=$(hdiutil attach "$CACHEDIR/jadeo${DMG_ARCH}-${XJADEO_VERSION:1}.dmg" | grep Apple_HFS | grep dev/ | cut -f 3)
|
|
cp -r "${JADEO}/Jadeo.app" "$PRODUCT_PKG_DIR/"
|
|
hdiutil detach "${JADEO}"
|
|
|
|
XJCONTENT=${PRODUCT_PKG_DIR}/Jadeo.app/Contents
|
|
HVLIBS=${PRODUCT_PKG_DIR}/$APPROOT/lib/harvid
|
|
|
|
for file in ${XJCONTENT}/MacOS/Jadeo-bin ${XJCONTENT}/Frameworks/*.dylib ${HVLIBS}/*.dylib ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/*harvid* ; do
|
|
lipo -extract_family ${OSX_ARCH} ${file} -output ${file}.thin 2>/dev/null && \
|
|
mv ${file}.thin ${file}
|
|
done
|
|
|
|
DMGWINBOTTOM=580
|
|
YPOS=$[ $DMGWINBOTTOM - 300 ]
|
|
XJADEOPOS="set position of item \"Jadeo.app\" of container window to {310, ${YPOS}}"
|
|
|
|
DMGBACKGROUND=${DMGBACKGROUND}xj
|
|
fi
|
|
|
|
################################################################################
|
|
### Mixbus plugins, etc
|
|
if true; then
|
|
echo "Bundling General MIDI Synth LV2"
|
|
mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2"
|
|
|
|
for proj in x42-gmsynth; do
|
|
X42_VERSION=$(curl -s -S http://${OSX_X42URI}/${proj}.latest.txt)
|
|
rsync -a -q --partial \
|
|
rsync://${OSX_X42URI}/${proj}-lv2-${OSX_X42ID}-${X42_VERSION}.zip \
|
|
"$CACHEDIR/${proj}-lv2-${OSX_X42ID}-${X42_VERSION}.zip"
|
|
bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
|
|
"$CACHEDIR/${proj}-lv2-${OSX_X42ID}-${X42_VERSION}.zip"
|
|
done
|
|
fi
|
|
|
|
if test x$WITH_COMMERCIAL_X42_LV2 != x ; then
|
|
echo "Adding commercial x42 plugins"
|
|
mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2"
|
|
|
|
for proj in x42-meters x42-eq x42-whirl; do
|
|
X42_VERSION=$(curl -s -S http://${OSX_X42URI}/${proj}.latest.txt)
|
|
rsync -a -q --partial \
|
|
rsync://${OSX_X42URI}/${proj}-lv2-${OSX_X42ID}-${X42_VERSION}.zip \
|
|
"$CACHEDIR/${proj}-lv2-${OSX_X42ID}-${X42_VERSION}.zip"
|
|
bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
|
|
"$CACHEDIR/${proj}-lv2-${OSX_X42ID}-${X42_VERSION}.zip"
|
|
done
|
|
fi
|
|
|
|
if test x$WITH_GRATIS_X42_LV2 != x ; then
|
|
echo "Adding gratis x42 plugins"
|
|
mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2"
|
|
|
|
for proj in x42-autotune x42-midifilter x42-stereoroute setBfree x42-avldrums x42-limiter x42-tuner; do
|
|
X42_VERSION=$(curl -s -S http://${OSX_X42URI}/${proj}.latest.txt)
|
|
rsync -a -q --partial \
|
|
rsync://${OSX_X42URI}/${proj}-lv2-${OSX_X42ID}-${X42_VERSION}.zip \
|
|
"$CACHEDIR/${proj}-lv2-${OSX_X42ID}-${X42_VERSION}.zip"
|
|
bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
|
|
"$CACHEDIR/${proj}-lv2-${OSX_X42ID}-${X42_VERSION}.zip"
|
|
done
|
|
fi
|
|
|
|
if test -d ${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/; then
|
|
echo "Removing unused achitectures from LV plugins"
|
|
for file in ${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/*/*.dylib ; do
|
|
lipo -extract_family ${OSX_ARCH} ${file} -output ${file}.thin 2>/dev/null && \
|
|
mv ${file}.thin ${file}
|
|
done
|
|
fi
|
|
|
|
if test -n "$MIXBUS"; then
|
|
echo "Deploying harrison channelstrip for $OSX_BENSID"
|
|
|
|
mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip"
|
|
|
|
curl -s -S --fail -# \
|
|
-z "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
|
|
-o "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
|
|
"${HARRISONDSPURL}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so"
|
|
|
|
cp "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
|
|
"${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip/${HARRISONCHANNELSTRIP}.so"
|
|
|
|
echo "deploying harrison vamp plugins for $OSX_BENSID"
|
|
|
|
curl -s -S --fail -# \
|
|
-z "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
|
|
-o "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
|
|
"${HARRISONDSPURL}/harrison_vamp.${OSX_BENSID}.dylib"
|
|
|
|
cp "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
|
|
"${PRODUCT_PKG_DIR}/${APPROOT}/lib/harrison_vamp.dylib"
|
|
|
|
# Mixbus Bundled Media Content
|
|
curl -s -S --fail -# \
|
|
-z "${CACHEDIR}/MixbusBundledMedia.zip" \
|
|
-o "${CACHEDIR}/MixbusBundledMedia.zip" \
|
|
"http://rsrc.harrisonconsoles.com/mixbus/mb8/content/MixbusBundledMedia.zip"
|
|
|
|
if test -f "${CACHEDIR}/MixbusBundledMedia.zip"; then
|
|
echo "Adding Mixbus Bundled Content"
|
|
rm -f "${PRODUCT_PKG_DIR}/${MediaClips}/"*.*
|
|
bsdtar -C "${PRODUCT_PKG_DIR}/${MediaClips}" -xf \
|
|
"${CACHEDIR}/MixbusBundledMedia.zip"
|
|
fi
|
|
fi
|
|
|
|
################################################################################
|
|
|
|
if test x$DEMO_SESSION_URL != x ; then
|
|
mkdir -p ${PRODUCT_PKG_DIR}/$Shared/sessions
|
|
DEMO_SESSIONS=$(curl -s -S --fail $DEMO_SESSION_URL/index.txt)
|
|
for demo in $DEMO_SESSIONS; do
|
|
curl -s -S --fail -# -o ${PRODUCT_PKG_DIR}/$Shared/sessions/$demo $DEMO_SESSION_URL/$demo
|
|
done
|
|
fi
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
##### App Signing ##############################################################
|
|
|
|
checkForSuccess() {
|
|
xcrun altool \
|
|
--notarization-info $1 \
|
|
-u ${ALTOOL_USERNAME} \
|
|
--password "@keychain:ALTOOL_PASSWORD" \
|
|
2>&1 | grep -o "Status: success";
|
|
}
|
|
|
|
if test $(sw_vers -productVersion | cut -d '.' -f 1) -lt 11 -a $(sw_vers -productVersion | cut -d '.' -f 2) -lt 14 -a $(sw_vers -productVersion | cut -d '.' -f 2) -lt 7; then
|
|
#less than 10.13.6 does not support notariztion
|
|
HARDENED_OPTIONS=
|
|
else
|
|
HARDENED_OPTIONS="--options runtime --entitlements entitlements.plist"
|
|
fi
|
|
|
|
echo "checking for signing credentials"
|
|
|
|
if test -n "${APPLE_DEVELOPER_ID_FOR_APPLICATION}"; then
|
|
####################
|
|
## Sign the main APP
|
|
|
|
echo "signing the main app"
|
|
|
|
# Sign everything from inside level working out.
|
|
find ${PRODUCT_PKG_DIR}/${APPROOT}/Resources -type f -print0 | xargs -0 -I {} -P 7 codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" "{}"
|
|
find ${PRODUCT_PKG_DIR}/${APPROOT}/lib -type f -print0 | xargs -0 -I {} -P 7 codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" "{}"
|
|
|
|
find ${PRODUCT_PKG_DIR}/${APPROOT}/MacOS -name "${lower_case_appname}${major_version}-*" -print0 | xargs -0 -I {} -P 7 codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" "{}"
|
|
codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" ${PRODUCT_PKG_DIR}/${APPROOT}/MacOS/ffmpeg_harvid
|
|
codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" ${PRODUCT_PKG_DIR}/${APPROOT}/MacOS/ffprobe_harvid
|
|
codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" ${PRODUCT_PKG_DIR}/${APPROOT}/MacOS/harvid
|
|
|
|
codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" ${PRODUCT_PKG_DIR}/${APPROOT}/MacOS/${MAIN_EXECUTABLE}
|
|
|
|
codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" ${PRODUCT_PKG_DIR}/${APPDIR}
|
|
|
|
# Notarize
|
|
if test -n "${HARDENED_OPTIONS}"; then
|
|
echo "Notarizing the main app"
|
|
OK=0
|
|
|
|
ZIP_PATH=${PRODUCT_PKG_DIR}/${BUNDLENAME}.zip
|
|
/usr/bin/ditto -c -k --keepParent ${PRODUCT_PKG_DIR}/${APPDIR} $ZIP_PATH
|
|
|
|
notarize_output=$(xcrun altool --notarize-app --primary-bundle-id "${BUNDLE_ID_BASE}.${lower_case_appname}${major_version}.zip" --username ${ALTOOL_USERNAME} --password "@keychain:ALTOOL_PASSWORD" --file $ZIP_PATH 2>&1 | grep -o "RequestUUID = .*")
|
|
|
|
if [ $? = 0 ]; then
|
|
REQUEST_ID=$(echo ${notarize_output} | awk '{print $3}')
|
|
echo "Main app waiting on RequestUUID=${REQUEST_ID}"
|
|
|
|
count=360
|
|
while [ "$count" != 0 -a "$OK" == 0 ]
|
|
do
|
|
echo -n .
|
|
sleep 60
|
|
count=$((count - 1))
|
|
|
|
if checkForSuccess ${REQUEST_ID}; then
|
|
OK=1;
|
|
fi
|
|
done
|
|
|
|
if [ "$OK" == 1 ]; then
|
|
echo "Main app notarize success"
|
|
xcrun stapler staple ${PRODUCT_PKG_DIR}/${APPDIR}
|
|
else
|
|
echo "ERROR: Main app notarize not approved after 6 hours"
|
|
fi
|
|
|
|
else
|
|
echo "ERROR: Notarize upload failed"
|
|
exit 1;
|
|
fi
|
|
rm $ZIP_PATH
|
|
fi
|
|
|
|
#############
|
|
## Sign Jadeo
|
|
|
|
echo "signing the Jadeo app"
|
|
|
|
# Sign everything from inside level working out.
|
|
find ${PRODUCT_PKG_DIR}/Jadeo.app/Contents/Resources -type f -print0 | xargs -0 -I {} -P 7 codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" "{}"
|
|
find ${PRODUCT_PKG_DIR}/Jadeo.app/Contents/Frameworks -type f -print0 | xargs -0 -I {} -P 7 codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" "{}"
|
|
|
|
codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" ${PRODUCT_PKG_DIR}/Jadeo.app/Contents/MacOS/Jadeo-bin
|
|
codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" ${PRODUCT_PKG_DIR}/Jadeo.app/Contents/MacOS/xjremote
|
|
|
|
codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" ${PRODUCT_PKG_DIR}/Jadeo.app/Contents/MacOS/Jadeo
|
|
|
|
codesign --verbose --timestamp ${HARDENED_OPTIONS} --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" ${PRODUCT_PKG_DIR}/Jadeo.app
|
|
|
|
# Notarize
|
|
if test -n "${HARDENED_OPTIONS}"; then
|
|
echo "notarizing Jadeo app"
|
|
OK=0
|
|
|
|
ZIP_PATH=${PRODUCT_PKG_DIR}/Jadeo.zip
|
|
/usr/bin/ditto -c -k --keepParent ${PRODUCT_PKG_DIR}/Jadeo.app $ZIP_PATH
|
|
|
|
notarize_output=$(xcrun altool --notarize-app --primary-bundle-id "${BUNDLE_ID_BASE}.jadeo.zip" --username ${ALTOOL_USERNAME} --password "@keychain:ALTOOL_PASSWORD" --file $ZIP_PATH 2>&1 | grep -o "RequestUUID = .*")
|
|
|
|
if [ $? = 0 ]; then
|
|
REQUEST_ID=$(echo ${notarize_output} | awk '{print $3}')
|
|
echo "Jadeo waiting on RequestUUID=${REQUEST_ID}"
|
|
|
|
count=360
|
|
while [ "$count" != 0 -a "$OK" == 0 ]
|
|
do
|
|
echo -n .
|
|
sleep 60
|
|
count=$((count - 1))
|
|
|
|
if checkForSuccess ${REQUEST_ID}; then
|
|
OK=1;
|
|
fi
|
|
done
|
|
|
|
if [ "$OK" == 1 ]; then
|
|
echo "Jadeo notarize success"
|
|
xcrun stapler staple ${PRODUCT_PKG_DIR}/Jadeo.app
|
|
else
|
|
echo "ERROR: Jadeo notarize not approved after 6 hours"
|
|
fi
|
|
|
|
else
|
|
echo "ERROR: Notarize upload failed"
|
|
exit 1;
|
|
fi
|
|
rm $ZIP_PATH
|
|
fi
|
|
fi
|
|
|
|
################################################################################
|
|
|
|
( cd $PRODUCT_PKG_DIR ; find . ) > file_list.txt
|
|
|
|
echo "Building DMG ..."
|
|
|
|
# UC_DMG=$APPNAME-${release_version}-UC.dmg
|
|
# FINAL_DMG=$APPNAME-${release_version}.dmg
|
|
|
|
if [ x$DEBUG = xT ]; then
|
|
UC_DMG=$APPNAME-$release_version-dbg${DMG_ARCH}.dmg
|
|
else
|
|
UC_DMG=$APPNAME-$release_version${DMG_ARCH}.dmg
|
|
fi
|
|
VOLNAME=$APPNAME-$release_version
|
|
|
|
MNTPATH=`mktemp -d -t ardourimg`
|
|
TMPDMG=`mktemp -t ardour`
|
|
ICNSTMP=`mktemp -t ardouricon`
|
|
DMGMEGABYTES=$[ `du -sk "$PRODUCT_PKG_DIR" | cut -f 1` * 1024 / 1000000 ]
|
|
EXTRA_SPACE_MB=$[ ($DMGMEGABYTES * 25) / 100 ] #25 percent without using floating point math
|
|
DMGMEGABYTES=$[ $DMGMEGABYTES + $EXTRA_SPACE_MB ]
|
|
|
|
echo "DMG MB = " $DMGMEGABYTES
|
|
|
|
rm -f $UC_DMG "$TMPDMG" "${TMPDMG}.dmg" "$ICNSTMP"
|
|
rm -rf "$MNTPATH"
|
|
mkdir -p "$MNTPATH"
|
|
|
|
TMPDMG="${TMPDMG}.dmg"
|
|
|
|
trap "rm -rf $MNTPATH $TMPDMG $ICNSTMP" EXIT
|
|
|
|
hdiutil create -megabytes $DMGMEGABYTES -fs HFS+ -volname "${VOLNAME}" "$TMPDMG"
|
|
DiskDevice=$(hdid -nomount "$TMPDMG" | grep Apple_HFS | cut -f 1 -d ' ')
|
|
mount -t hfs -o nobrowse "${DiskDevice}" "${MNTPATH}"
|
|
|
|
cp -r ${PRODUCT_PKG_DIR}/* "${MNTPATH}" || exit
|
|
mkdir "${MNTPATH}/.background"
|
|
cp ${DMGBACKGROUND}.png "${MNTPATH}/.background/dmgbg.png"
|
|
|
|
echo "setting DMG background ..."
|
|
|
|
if test $(sw_vers -productVersion | cut -d '.' -f 1) -lt 11 -a $(sw_vers -productVersion | cut -d '.' -f 2) -lt 9; then
|
|
# OSX ..10.8.X
|
|
DISKNAME=${VOLNAME}
|
|
else
|
|
# OSX 10.9.X and later
|
|
DISKNAME=`basename "${MNTPATH}"`
|
|
fi
|
|
|
|
osascript << EOF
|
|
tell application "Finder"
|
|
activate
|
|
tell disk "${DISKNAME}"
|
|
open
|
|
delay 2
|
|
set current view of container window to icon view
|
|
set toolbar visible of container window to false
|
|
set statusbar visible of container window to false
|
|
set the bounds of container window to {400, 200, 800, ${DMGWINBOTTOM}}
|
|
set theViewOptions to the icon view options of container window
|
|
set arrangement of theViewOptions to not arranged
|
|
set icon size of theViewOptions to 64
|
|
set background picture of theViewOptions to file ".background:dmgbg.png"
|
|
make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
|
|
set position of item "${APPDIR}" of container window to {90, 100}
|
|
set position of item "Applications" of container window to {310, 100}
|
|
${MIXBUSPOS}
|
|
${HARVIDPOS}
|
|
${XJADEOPOS}
|
|
close
|
|
open
|
|
update without registering applications
|
|
delay 3
|
|
set position of item "${APPDIR}" of container window to {90, 100}
|
|
set position of item "Applications" of container window to {310, 100}
|
|
${MIXBUSPOS}
|
|
${HARVIDPOS}
|
|
${XJADEOPOS}
|
|
close
|
|
open
|
|
update without registering applications
|
|
delay 3
|
|
eject
|
|
end tell
|
|
end tell
|
|
EOF
|
|
|
|
chmod -Rf go-w "${MNTPATH}"
|
|
sync
|
|
|
|
set -e
|
|
echo "compressing Image ..."
|
|
|
|
# Umount the image ('eject' above may already have done that)
|
|
umount "${DiskDevice}" || true
|
|
hdiutil eject "${DiskDevice}" || true
|
|
# Create a read-only version, use zlib compression
|
|
hdiutil convert -format UDZO "${TMPDMG}" -imagekey zlib-level=9 -o "${UC_DMG}"
|
|
|
|
if test $(sw_vers -productVersion | cut -d '.' -f 2) -gt 5; then
|
|
echo "setting file icon ..."
|
|
|
|
cp ${PRODUCT_PKG_DIR}/$Resources/appIcon.icns ${ICNSTMP}.icns
|
|
if test $(sw_vers -productVersion | cut -d '.' -f 2) -lt 13; then
|
|
sips -i ${ICNSTMP}.icns
|
|
DeRez -only icns ${ICNSTMP}.icns > ${ICNSTMP}.rsrc
|
|
else
|
|
ICNSBASE=`basename ${ICNSTMP}.icns`
|
|
echo "read 'icns' (-16455) \"${ICNSBASE}\";" > ${ICNSTMP}.rsrc
|
|
fi
|
|
|
|
Rez -append ${ICNSTMP}.rsrc -o "$UC_DMG"
|
|
SetFile -a C "$UC_DMG"
|
|
|
|
rm ${ICNSTMP}.icns ${ICNSTMP}.rsrc
|
|
fi
|
|
|
|
rm -rf ${PRODUCT_PKG_DIR}
|
|
|
|
echo
|
|
echo "packaging suceeded."
|
|
ls -l "$UC_DMG"
|
|
|
|
echo "dmg: checking for signing credentials"
|
|
|
|
if test -n "${APPLE_DEVELOPER_ID_FOR_APPLICATION}"; then
|
|
echo "dmg: signing"
|
|
|
|
codesign --verbose --timestamp --force --sign "${APPLE_DEVELOPER_ID_FOR_APPLICATION}" ${UC_DMG}
|
|
|
|
if test -n "${HARDENED_OPTIONS}"; then
|
|
echo "dmg: notarizing"
|
|
OK=0
|
|
|
|
notarize_output=$(xcrun altool --notarize-app --primary-bundle-id "${BUNDLE_ID_BASE}.${lower_case_appname}${major_version}.dmg" --username ${ALTOOL_USERNAME} --password "@keychain:ALTOOL_PASSWORD" --file ${UC_DMG} 2>&1 | grep -o "RequestUUID = .*")
|
|
|
|
if [ $? = 0 ]; then
|
|
REQUEST_ID=$(echo ${notarize_output} | awk '{print $3}')
|
|
echo "dmg: waiting on RequestUUID=${REQUEST_ID}"
|
|
|
|
count=360
|
|
while [ "$count" != 0 -a "$OK" == 0 ]
|
|
do
|
|
echo -n .
|
|
sleep 60
|
|
count=$((count - 1))
|
|
|
|
if checkForSuccess ${REQUEST_ID}; then
|
|
OK=1;
|
|
fi
|
|
done
|
|
|
|
if [ "$OK" == 1 ]; then
|
|
echo "dmg: notarize success"
|
|
xcrun stapler staple ${UC_DMG}
|
|
else
|
|
echo "ERROR: dmg notarize not approved after 6 hours"
|
|
fi
|
|
|
|
else
|
|
echo "ERROR: Notarize upload failed"
|
|
exit 1;
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
|
|
echo "Done."
|
|
exit
|