build_icon.sh (2213B)
1 #!/usr/bin/env bash 2 set -euo pipefail 3 4 script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)" 5 platform_root="$(cd "${script_dir}/.." && pwd -P)" 6 source_artwork="${platform_root}/App/Resources/AppIconSource.png" 7 color_profile="/System/Library/ColorSync/Profiles/sRGB Profile.icc" 8 output_path="${1:-}" 9 10 require_command() { 11 if command -v "$1" >/dev/null 2>&1; then 12 return 13 fi 14 echo "missing required command: $1" >&2 15 exit 1 16 } 17 18 require_command sips 19 require_command iconutil 20 21 if [[ -z "${output_path}" ]]; then 22 echo "usage: $0 <output-icns-path>" >&2 23 exit 1 24 fi 25 26 if [[ ! -f "${source_artwork}" ]]; then 27 echo "missing source artwork: ${source_artwork}" >&2 28 exit 1 29 fi 30 31 if [[ ! -f "${color_profile}" ]]; then 32 echo "missing macos icon color profile: ${color_profile}" >&2 33 exit 1 34 fi 35 36 tmp_dir="$(mktemp -d)" 37 cleanup() { 38 rm -rf "${tmp_dir}" 39 } 40 trap cleanup EXIT 41 42 normalized_png="${tmp_dir}/source.normalized.png" 43 iconset_dir="${tmp_dir}/AppIcon.iconset" 44 45 mkdir -p "${iconset_dir}" "$(dirname "${output_path}")" 46 sips -s format png -m "${color_profile}" "${source_artwork}" --out "${normalized_png}" >/dev/null 47 48 source_width="$( 49 sips -g pixelWidth "${normalized_png}" | awk '/pixelWidth/ {print $2}' 50 )" 51 source_height="$( 52 sips -g pixelHeight "${normalized_png}" | awk '/pixelHeight/ {print $2}' 53 )" 54 55 if [[ "${source_width}" != "${source_height}" ]]; then 56 echo "macos icon source must be square: ${source_width}x${source_height}" >&2 57 exit 1 58 fi 59 60 if [[ "${source_width}" -lt 1024 ]]; then 61 echo "macos icon source must be at least 1024x1024: ${source_width}x${source_height}" >&2 62 exit 1 63 fi 64 65 generate_icon() { 66 local filename="$1" 67 local size_px="$2" 68 sips -z "${size_px}" "${size_px}" "${normalized_png}" \ 69 --out "${iconset_dir}/${filename}" >/dev/null 70 } 71 72 generate_icon "icon_16x16.png" 16 73 generate_icon "icon_16x16@2x.png" 32 74 generate_icon "icon_32x32.png" 32 75 generate_icon "icon_32x32@2x.png" 64 76 generate_icon "icon_128x128.png" 128 77 generate_icon "icon_128x128@2x.png" 256 78 generate_icon "icon_256x256.png" 256 79 generate_icon "icon_256x256@2x.png" 512 80 generate_icon "icon_512x512.png" 512 81 generate_icon "icon_512x512@2x.png" 1024 82 83 iconutil -c icns "${iconset_dir}" -o "${output_path}"