Skip to content

Instantly share code, notes, and snippets.

@oubiwann
Forked from advorak/appify.sh
Last active April 29, 2023 10:32
Show Gist options
  • Star 48 You must be signed in to star a gist
  • Fork 15 You must be signed in to fork a gist
  • Save oubiwann/453744744da1141ccc542ff75b47e0cf to your computer and use it in GitHub Desktop.
Save oubiwann/453744744da1141ccc542ff75b47e0cf to your computer and use it in GitHub Desktop.
appify — create the simplest possible Mac app from a shell script (adds an application icon)
#!/usr/bin/env bash
VERSION=4.0.1
SCRIPT=`basename "$0"`
APPNAME="My App"
APPICONS="/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/GenericApplicationIcon.icns"
OSX_VERSION=`sw_vers -productVersion`
PWD=`pwd`
function usage {
cat <<EOF
$SCRIPT v${VERSION} for for Mac OS X - https://gist.github.com/oubiwann/453744744da1141ccc542ff75b47e0cf
Usage:
$SCRIPT [options]
Options:
-h, --help Prints this help message, then exits
-s, --script Name of the script to 'appify' (required)
-n, --name Name of the application (default "$APPNAME")
-i, --icons Name of the icons file to use when creating the app
(defaults to $APPICONS)
-v, --version Prints the version of this script, then exits
Description:
Creates the simplest possible Mac app from a shell script.
Appify has one required parameter, the script to appify:
$SCRIPT --script my-app-script.sh
Note that you cannot rename appified apps. If you want to give your app
a custom name, use the '--name' option
$SCRIPT --script my-app-script.sh --name "Sweet"
Copyright:
Copyright (c) Thomas Aylott <http://subtlegradient.com/>
Modified by Mathias Bynens <http://mathiasbynens.be/>
Modified by Andrew Dvorak <http://OhReally.net/>
Rewritten by Duncan McGreggor <http://github.com/oubiwann/>
EOF
exit 1
}
function version {
echo "v${VERSION}"
exit 1
}
function error {
echo
echo "ERROR: $1"
echo
usage
}
while :; do
case $1 in
-h | --help ) usage;;
-s | --script ) APPSCRIPT="$2"; shift ;;
-n | --name ) APPNAME="$2"; shift ;;
-i | --icons ) APPICONS="$2"; shift ;;
-v | --version ) version;;
-- ) shift; break ;;
* ) break ;;
esac
shift
done
if [ -z ${APPSCRIPT+nil} ]; then
error "the script to appify must be provided!"
fi
if [ ! -f "$APPSCRIPT" ]; then
error "the can't find the script '$APPSCRIPT'"
fi
if [ -a "$APPNAME.app" ]; then
error "the bundle '$PWD/$APPNAME.app' already exists"
fi
APPDIR="$APPNAME.app/Contents"
mkdir -vp "$APPDIR"/{MacOS,Resources}
cp -v "$APPICONS" "$APPDIR/Resources/$APPNAME.icns"
cp -v "$APPSCRIPT" "$APPDIR/MacOS/$APPNAME"
chmod +x "$APPDIR/MacOS/$APPNAME"
cat <<EOF > "$APPDIR/Info.plist"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>$APPNAME</string>
<key>CFBundleGetInfoString</key>
<string>$APPNAME</string>
<key>CFBundleIconFile</key>
<string>$APPNAME</string>
<key>CFBundleName</key>
<string>$APPNAME</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>4242</string>
</dict>
</plist>
EOF
echo "Application bundle created at '$PWD/$APPNAME.app'"
echo
@denwald
Copy link

denwald commented Jul 28, 2022

Thank you for this convenient script. It works like a charm on my Intel iMac running Monterey. On my MacBook Air M1 (Apple Silicon) on the other hand I only get a pop up which offers to install Rosetta emulation. This does not make a lot of sense to me, since I've only packaged a bash script. Any idea if this is a general limitation of macOS and the M1 SOC?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment