diff --git a/Makefile b/Makefile index 2a134d1..b4ad471 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ PY_FILES = $(wildcard *.py) $(wildcard gui/*.py) UI_COMPILED = $(UI_FILES:.ui=.py) TS_COMPILED = $(TS_FILES:.ts=.qm) +# python3.6 on Windows is only available as python.exe ifeq (, $(shell which python3)) PY ?= python else @@ -26,13 +27,26 @@ clean: run: all $(PY) luftdaten-tool.py -dist: all - $(PY) -m PyInstaller -y luftdaten-tool.spec +# Updates all translation files in i18n/ directory +i18n-update: $(UI_COMPILED) + @for f in $(TS_FILES) ; do \ + pylupdate5 $(PY_FILES) -ts $$f -verbose; \ + done deps: $(PY) -m pip install -U -r requirements.txt -i18n-update: - @for f in $(TS_FILES) ; do \ - pylupdate5 *.py gui/*.py -ts $$f -verbose; \ - done +# Here go platform-specific buildsteps +UNAME_S := $(shell uname -s) + +ifeq ($(UNAME_S),Darwin) +PLATFORM_DEPS := assets/logo.icns +assets/logo.icns: assets/logo.png + deploy/mkicns $< +endif + +dist: all $(PLATFORM_DEPS) + $(PY) -m PyInstaller -y luftdaten-tool.spec + +dmg: dist + dmgbuild -s deploy/dmgbuild_settings.py -D app=dist/Luftdaten.info\ Flashing\ Tool.app "Luftdaten.info Flashing Tool" dist/luftdaten-tool.dmg diff --git a/README.md b/README.md index 33e3c5d..e8ca06c 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Currently Windows builds require *Python 3.6* installed system-wide and added to `%PATH%`. To install python and cygwin dependencies and build everything use -`windows-build.bat` batch script. +`deploy\windows-build.bat` batch script. ### MacOS Currently MacOS builds require *Python 3.6* and Qt SDK installed (just the "Qt > @@ -34,7 +34,7 @@ Currently MacOS builds require *Python 3.6* and Qt SDK installed (just the "Qt > Then just install dependencies and build everything using: - make deps dist + make deps dmg Development ----------- diff --git a/assets/logo.ico b/assets/logo.ico new file mode 100644 index 0000000..2120810 Binary files /dev/null and b/assets/logo.ico differ diff --git a/assets/logo.png b/assets/logo.png index 5ae9b7c..d3320af 100644 Binary files a/assets/logo.png and b/assets/logo.png differ diff --git a/deploy/dmgbuild_settings.py b/deploy/dmgbuild_settings.py new file mode 100644 index 0000000..c7588ad --- /dev/null +++ b/deploy/dmgbuild_settings.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import biplist +import os.path + +# +# Example settings file for dmgbuild +# + +# Use like this: dmgbuild -s settings.py "Test Volume" test.dmg + +# You can actually use this file for your own application (not just TextEdit) +# by doing e.g. +# +# dmgbuild -s settings.py -D app=/path/to/My.app "My Application" MyApp.dmg + +# .. Useful stuff .............................................................. + +application = defines.get('app', '/Applications/TextEdit.app') +appname = os.path.basename(application) + +def icon_from_app(app_path): + plist_path = os.path.join(app_path, 'Contents', 'Info.plist') + plist = biplist.readPlist(plist_path) + icon_name = plist['CFBundleIconFile'] + icon_root,icon_ext = os.path.splitext(icon_name) + if not icon_ext: + icon_ext = '.icns' + icon_name = icon_root + icon_ext + return os.path.join(app_path, 'Contents', 'Resources', icon_name) + +# .. Basics .................................................................... + +# Uncomment to override the output filename +# filename = 'test.dmg' + +# Uncomment to override the output volume name +# volume_name = 'Test' + +# Volume format (see hdiutil create -help) +format = defines.get('format', 'UDBZ') + +# Volume size (must be large enough for your files) +size = defines.get('size', '100M') + +# Files to include +files = [ application ] + +# Symlinks to create +symlinks = { 'Applications': '/Applications' } + +# Volume icon +# +# You can either define icon, in which case that icon file will be copied to the +# image, *or* you can define badge_icon, in which case the icon file you specify +# will be used to badge the system's Removable Disk icon +# +#icon = '/path/to/icon.icns' +badge_icon = icon_from_app(application) + +# Where to put the icons +icon_locations = { + appname: (140, 120), + 'Applications': (500, 120) + } + +# .. Window configuration ...................................................... + +# Background +# +# This is a STRING containing any of the following: +# +# #3344ff - web-style RGB color +# #34f - web-style RGB color, short form (#34f == #3344ff) +# rgb(1,0,0) - RGB color, each value is between 0 and 1 +# hsl(120,1,.5) - HSL (hue saturation lightness) color +# hwb(300,0,0) - HWB (hue whiteness blackness) color +# cmyk(0,1,0,0) - CMYK color +# goldenrod - X11/SVG named color +# builtin-arrow - A simple built-in background with a blue arrow +# /foo/bar/baz.png - The path to an image file +# +# The hue component in hsl() and hwb() may include a unit; it defaults to +# degrees ('deg'), but also supports radians ('rad') and gradians ('grad' +# or 'gon'). +# +# Other color components may be expressed either in the range 0 to 1, or +# as percentages (e.g. 60% is equivalent to 0.6). +background = 'builtin-arrow' + +show_status_bar = False +show_tab_view = False +show_toolbar = False +show_pathbar = False +show_sidebar = False +sidebar_width = 180 + +# Window position in ((x, y), (w, h)) format +window_rect = ((100, 100), (640, 280)) + +# Select the default view; must be one of +# +# 'icon-view' +# 'list-view' +# 'column-view' +# 'coverflow' +# +default_view = 'icon-view' + +# General view configuration +show_icon_preview = False + +# Set these to True to force inclusion of icon/list view settings (otherwise +# we only include settings for the default view) +include_icon_view_settings = 'auto' +include_list_view_settings = 'auto' + +# .. Icon view configuration ................................................... + +arrange_by = None +grid_offset = (0, 0) +grid_spacing = 100 +scroll_position = (0, 0) +label_pos = 'bottom' # or 'right' +text_size = 16 +icon_size = 128 + +# .. List view configuration ................................................... + +# Column names are as follows: +# +# name +# date-modified +# date-created +# date-added +# date-last-opened +# size +# kind +# label +# version +# comments +# +list_icon_size = 16 +list_text_size = 12 +list_scroll_position = (0, 0) +list_sort_by = 'name' +list_use_relative_dates = True +list_calculate_all_sizes = False, +list_columns = ('name', 'date-modified', 'size', 'kind', 'date-added') +list_column_widths = { + 'name': 300, + 'date-modified': 181, + 'date-created': 181, + 'date-added': 181, + 'date-last-opened': 181, + 'size': 97, + 'kind': 115, + 'label': 100, + 'version': 75, + 'comments': 300, + } +list_column_sort_directions = { + 'name': 'ascending', + 'date-modified': 'descending', + 'date-created': 'descending', + 'date-added': 'descending', + 'date-last-opened': 'descending', + 'size': 'descending', + 'kind': 'ascending', + 'label': 'ascending', + 'version': 'ascending', + 'comments': 'ascending', + } diff --git a/deploy/mkicns b/deploy/mkicns new file mode 100755 index 0000000..e30b348 --- /dev/null +++ b/deploy/mkicns @@ -0,0 +1,20 @@ +#!/bin/sh +# +# Builds .icns file from a single .png file +# + +set -e + +filename="${1%.*}" +mkdir "$filename".iconset +for i in 16 32 128 256 ; do + n=$(( i * 2 )) + sips -z $i $i "$1" --out "$filename".iconset/icon_${i}x${i}.png + sips -z $n $n "$1" --out "$filename".iconset/icon_${i}x${i}@2x.png + [[ $n -eq 512 ]] && \ + sips -z $n $n "$1" --out "$filename".iconset/icon_${n}x${n}.png + (( i++ )) +done +cp "$1" "$filename".iconset/icon_512x512@2x.png +iconutil -c icns "$filename".iconset +rm -r "$filename".iconset diff --git a/windows-build.bat b/deploy/windows-build.bat similarity index 96% rename from windows-build.bat rename to deploy/windows-build.bat index dfae8af..905cee9 100644 --- a/windows-build.bat +++ b/deploy/windows-build.bat @@ -1,3 +1,5 @@ +cd .. + if not exist build mkdir build rem Download cygwin installer diff --git a/luftdaten-tool.spec b/luftdaten-tool.spec index 2852b67..c4eb8c4 100644 --- a/luftdaten-tool.spec +++ b/luftdaten-tool.spec @@ -26,10 +26,11 @@ exe = EXE(pyz, strip=False, upx=True, runtime_tmpdir=None, - console=False ) + console=False, + icon='assets/logo.ico') # This is used on MacOS only app = BUNDLE(exe, name='Luftdaten.info Flashing Tool.app', - icon=None, + icon='assets/logo.icns', bundle_identifier=None)