| #!/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}" |