Commit 3bd5843f authored by Sebastiaan Lokhorst's avatar Sebastiaan Lokhorst Committed by Philipp Hörist

Add tool to create macOS .icns icon and .app bundle

parent 60b3a1d0
File added
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "">
<plist version="1.0">
#!/usr/bin/env python3
import os
import shutil
import sys
from string import Template
from os.path import join
import argparse
PLIST_TEMPLATE = 'mac/Info.plist.template'
ICNS_FILE = 'mac/Gajim.icns'
def fill_template(in_path, out_path, vars):
with open(in_path, 'r') as f:
templ = Template(
filled_templ = templ.substitute(vars)
with open(out_path, 'w') as f:
def create_executable(exec_path, bin_path):
fill_template(EXEC_TEMPLATE, exec_path, {
'bin_path': bin_path
os.chmod(exec_path, 0o755)
def create_plist(plist_path, version):
fill_template(PLIST_TEMPLATE, plist_path, {
'version': version,
'short_version_string': version
if __name__ == '__main__':
if not os.path.isdir('mac'):
sys.exit("can't find the 'mac' directory. make sure you run "
"this script from the project root")
parser = argparse.ArgumentParser(description='Create a macOS .app bundle.')
parser.add_argument('bundle', help='bundle output location')
parser.add_argument('--version', default='0.0.1',
help='version number of the .app bundle')
parser.add_argument('--bin-path', default='/usr/local/bin/gajim',
help='location of the actual executable')
args = parser.parse_args()
bundle = args.bundle
os.mkdir(join(bundle, 'Contents'))
os.mkdir(join(bundle, 'Contents/MacOS'))
os.mkdir(join(bundle, 'Contents/Resources'))
create_executable(join(bundle, 'Contents/MacOS/'), bin_path=args.bin_path)
create_plist(join(bundle, 'Contents/Info.plist'), version=args.version)
shutil.copy(ICNS_FILE, join(bundle, 'Contents/Resources/Gajim.icns'))
#!/usr/bin/env python3
import os
import shutil
from argparse import ArgumentParser
from subprocess import run
ICON_SVG = 'gajim/data/icons/hicolor/scalable/apps/org.gajim.Gajim.svg'
def create_icns(icon_path):
tmpdir = 'Gajim.iconset'
if os.path.isdir(tmpdir):
for size_pt in [16, 32, 128, 256, 512]:
for scale in [1, 2]:
size_px = scale * size_pt
scale_txt = '@{}'.format(scale) if scale != 1 else ''
png_fn = 'icon_{}x{}{}.png'.format(size_pt, size_pt, scale_txt)
png_path = os.path.join(tmpdir, png_fn)
run(['inkscape', '-z', '-e', png_path,
'-w', str(size_px), '-h', str(size_px), '-y', '0',
run(['iconutil', '-c', 'icns', '-o', icon_path, tmpdir])
if __name__ == '__main__':
parser = ArgumentParser(description='Create a macOS .icns icon. '
'Requires Inkscape and iconutil (macOS).')
parser.add_argument('output', help='bundle output location')
args = parser.parse_args()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment