blob: 2ad0bb1bc2fa4e3e8f73782b91d1c420460e3967 [file] [log] [blame]
#!/bin/bash -eu
# Copyright 2016 The Tulsi Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Build script to generate a dmg image for Tulsi.
if [[ $# < 1 ]]; then
echo "Usage: $0 <source_bundle> [options]"
echo "Options:"
echo " -o <output_file>: Full path to the target .dmg file. Defaults to"
echo " source_bundle with .app replaced by .dmg."
echo " --volume <name>: Name for the dmg volume. Defaults to source_bundle"
echo " with no path or file extension."
echo " -f <absolute_file_path>: An additional file to be added to the dmg."
echo " May be used multiple times."
exit 1
fi
readonly src_bundle_path="$1"
readonly src_bundle_file=$(basename "${src_bundle_path}")
readonly app_name="${src_bundle_file%.*}"
if [[ "${app_name}" == "" ]]; then
echo "Invalid source bundle ${src_bundle_file} (must end with .app)."
exit 1
fi
shift
additional_files=()
while [[ $# > 0 ]]; do
case "$1" in
-f)
shift
if [[ ! "$1" = /* ]]; then
echo "Error: -f files must be absolute paths, \"$1\" is invalid."
exit 1
fi
additional_files+=("$1")
;;
-o)
shift
output_file="$1"
;;
--volume)
volname="$1"
;;
*)
echo "WARNING: Unknown option '$1'"
;;
esac
shift
done
if [[ "${output_file:-}" == "" ]]; then
output_file="${app_name}.dmg"
fi
readonly tmp_file="${output_file}.tmp.dmg"
if [[ "${volname:-}" == "" ]]; then
volname="${app_name}"
fi
if [[ -e "${output_file}" ]]; then
rm "${output_file}"
fi
# Grab the absolute path to the temp file for cleanup in case an error occurs
# while in a subdirectory.
readonly tmp_file_dirname=$(dirname "${tmp_file}")
readonly tmp_file_basename=$(basename "${tmp_file}")
if [[ ! -d "${tmp_file_dirname}" ]]; then
mkdir -p "${tmp_file_dirname}"
fi
pushd "${tmp_file_dirname}" > /dev/null
readonly tmp_file_abs_path="$(pwd)/${tmp_file_basename}"
popd > /dev/null
function cleanup {
rm -f "${tmp_file_abs_path}"
}
trap cleanup exit
# Echo commands for the log.
set -x
# Create a dmg from the source bundle.
hdiutil create -ov \
-srcfolder "${src_bundle_path}" \
-volname "${volname}" \
-fs HFS+ \
-format UDRW "${tmp_file}"
# Open the dmg and add a link to /Applications and any additional files.
readonly devs=$(hdiutil attach "${tmp_file}" | cut -f 1)
readonly dev=$(echo ${devs} | cut -f 1 -d ' ')
# The following actions are performed in a subshell to ensure that the mounted
# image is detached in the case of an error (via a separate exit trap).
(
function close_dmg {
hdiutil detach $dev
}
trap close_dmg exit
pushd "/Volumes/${volname}" > /dev/null
ln -s /Applications .
if [[ ${#additional_files[@]} > 0 ]]; then
readonly files_dir="Tulsi Additional Files"
mkdir "${files_dir}"
pushd "${files_dir}" > /dev/null
for f in "${additional_files[@]}"; do
cp "${f}" .
done
popd > /dev/null
additional_files_command="set position of item \"${files_dir}\" of container window to {80, 230}"
window_bottom=470
else
additional_files_command=""
window_bottom=340
fi
popd > /dev/null
)
# Convert the dmg to a compressed read-only one.
hdiutil convert "${tmp_file}" \
-format UDZO \
-imagekey zlib-level=9 \
-o "${output_file}"