From 11fd47946de68c580242121e5c07eabfcf2ec5b7 Mon Sep 17 00:00:00 2001 From: Christian Kauer Date: Sun, 22 Mar 2026 09:20:34 +0100 Subject: [PATCH] added linux build --- .claude/settings.local.json | 9 ++++++- build-linux.sh | 4 +++ build.py | 47 +++++++++++++++++++++++++----------- icon.png | Bin 0 -> 1621 bytes install.sh | 28 +++++++++++---------- start.sh | 6 ++--- whisper-dictation.spec | 45 +++++++++++++++++++++------------- 7 files changed, 91 insertions(+), 48 deletions(-) create mode 100644 build-linux.sh create mode 100644 icon.png diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 46e121c..21b9c57 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -29,7 +29,14 @@ "Bash(.venv-windows/Scripts/python.exe -c \"\nimport os, site\nsp = site.getsitepackages\\(\\)[0]\ncublas = os.path.join\\(sp, 'nvidia', 'cublas', 'bin'\\)\ncudnn = os.path.join\\(sp, 'nvidia', 'cudnn', 'bin'\\)\nprint\\('cublas:', os.path.exists\\(cublas\\), cublas\\)\nprint\\('cudnn:', os.path.exists\\(cudnn\\), cudnn\\)\n\")", "Bash(.venv-windows/Scripts/python.exe -c \"\nimport os\nsp = '.venv-windows/Lib/site-packages'\ncublas = os.path.join\\(sp, 'nvidia', 'cublas', 'bin'\\)\ncudnn = os.path.join\\(sp, 'nvidia', 'cudnn', 'bin'\\)\nprint\\('cublas:', os.path.exists\\(cublas\\), os.path.abspath\\(cublas\\)\\)\nprint\\('cudnn:', os.path.exists\\(cudnn\\), os.path.abspath\\(cudnn\\)\\)\n\")", "Bash(.venv-windows/Scripts/python.exe -c \"import site; print\\(site.getsitepackages\\(\\)\\)\")", - "Bash(git push:*)" + "Bash(git push:*)", + "Bash(find /run/media/chk/Ventoy/projects/chrka/whisper-dictation -type f \\\\\\(-name .github -o -name *.yml -o -name *.yaml \\\\\\))", + "Bash(chmod +x /run/media/chk/Ventoy/projects/chrka/whisper-dictation/build-linux.sh)", + "Bash(bash install.sh)", + "Bash(bash build-linux.sh)", + "Bash(.venv-linux/bin/python -c \"import tkinter; print\\(''tkinter OK''\\)\")", + "Bash(pacman -Q tk)", + "Bash(sudo pacman:*)" ] } } diff --git a/build-linux.sh b/build-linux.sh new file mode 100644 index 0000000..5162a25 --- /dev/null +++ b/build-linux.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -e +cd "$(dirname "$0")" +.venv-linux/bin/python build.py diff --git a/build.py b/build.py index 0051dac..1a6955c 100644 --- a/build.py +++ b/build.py @@ -3,29 +3,40 @@ import os import shutil import sys import subprocess -from PIL import Image +from PIL import Image, ImageDraw + +_IS_WINDOWS = sys.platform == "win32" +_PLATFORM_TAG = "windows" if _IS_WINDOWS else "linux" + + +def _make_icon_image(size: int) -> Image.Image: + """Create a green-dot icon at the given size.""" + img = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + d = ImageDraw.Draw(img) + margin = max(1, size // 16) + d.ellipse([margin, margin, size - margin, size - margin], fill=(40, 200, 80)) + return img + def generate_icon(): - """Generate icon.ico from tray icon colors (green dot on transparent).""" + """Generate platform-appropriate icon files.""" sizes = [16, 32, 48, 256] - frames = [] - for size in sizes: - img = Image.new("RGBA", (size, size), (0, 0, 0, 0)) - from PIL import ImageDraw - d = ImageDraw.Draw(img) - margin = max(1, size // 16) - d.ellipse([margin, margin, size - margin, size - margin], fill=(40, 200, 80)) - frames.append(img) - frames[0].save("icon.ico", format="ICO", sizes=[(s, s) for s in sizes], - append_images=frames[1:]) - print("icon.ico generated.") + frames = [_make_icon_image(s) for s in sizes] + if _IS_WINDOWS: + frames[0].save("icon.ico", format="ICO", sizes=[(s, s) for s in sizes], + append_images=frames[1:]) + print("icon.ico generated.") + else: + frames[-1].save("icon.png", format="PNG") + print("icon.png generated.") + def build(): generate_icon() subprocess.run([sys.executable, "-m", "PyInstaller", "whisper-dictation.spec", "--noconfirm"], check=True) - dist_dir = os.path.join("dist", "whisper-dictation") + dist_dir = os.path.join("dist", "whisper-dictation-" + _PLATFORM_TAG) for fname in ["config.json", "vocabulary.json"]: dest = os.path.join(dist_dir, fname) if not os.path.exists(dest): @@ -34,7 +45,15 @@ def build(): else: print(f"Skipped {fname} (already exists in dist — preserving user edits)") + # Copy icon.png into dist for Linux .desktop files + if not _IS_WINDOWS: + icon_dest = os.path.join(dist_dir, "icon.png") + if not os.path.exists(icon_dest): + shutil.copy("icon.png", icon_dest) + print(f"Copied icon.png -> {dist_dir}/") + print(f"\nBuild complete: {dist_dir}/") + if __name__ == "__main__": build() diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..506168baaa76f3979431c752bd5484993a4199e2 GIT binary patch literal 1621 zcmZuxX;4#F6h7~fKthTMpg?0JC@w8-Fvc1!lE_kEa1@1#3rZY{qL>j)sv=7sDKVgzUb!!xZ0grWG4%IDB-rqRAdF|8NE0|E;42N{$%Do=*&zdiBPpYDO)E z|ME0Z^gZ{rE7*jFkH@Ea^U>ho-czRUT$&dEQC6*E+NRtf@GiW#EJ}0wc?nQ1eD+kcsV4nE~NrTRp&(qJ@bYwE5}-G~#t5+Kz|t*maf?gyym4da5MNo!qtw_3a2)Q!5+ z9(yQ&|^8ezMOU z^5k@hXc60p;*mTJY)@*~5)I2ZJ)g4R5>qgT4yv=0);3soo$QpQVkGjZw*@Y6d`6(g zOn0kXZB#|^Ei{t_g4|tAafd#}N~qaaJLrv3*Fl(Y??vV6Z1pyzZ#=eM7{e;$qniGL zTgCO&6(p`yLhk6P@B>T(!lF-vIh_xYBBL(fz>wN-yCs%|4T8r21xV4(AU3~5Ma+NZ zBM#}k9tv01GuVlZK|~SJz>NmCP}K_g#{xlS(nQL`fwmE+ zzQ(J%)?J-Yz2%aDkWGh9Q`gB=6Agcd9PrTIoE?T9+yOcxY9`tN2U5oN4dmcv@G~xs z`@luBfa{K6JgSu<55W?hJ2-DU|0DTc<=<8RO|;%doH|8G*`qCc8IYu-CJbP%Q(P_jm#emel%YiU2C6F_C-!1PgM#<-NAXo0@6 zuy=#~1@v?no2Y*`O*%wa3P?G`G*id+l<7FlcUbG()-> zKCw4LXES_E#bKMB8Mac)(99j^loUH+Bt_Gs^)vT?iY>*yihN!uN(JabT6b><$T8R< zMI-Jm{HH1ckf_{?_|=k0t-0kAi$eABDhN#oh@WMSKQpzdup?tJG)x^U}$6D`3gZg$JFi8vn>d*ke&;YPK*p!$wiR@=STHQXmw< zCQ)4YVTKpS-_*0`+Vq>@_z8Kkb8S}|Q-CbI8S1=B+_TUP4y=@_=k6V~9m`Iv4@0*) za>mgUE5