-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathzegarek.nimble
219 lines (171 loc) · 8.35 KB
/
zegarek.nimble
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# Package
version = "0.4.5"
author = "konradmb"
description = "A simple clock with milisecond resolution"
license = "GPL-3.0"
srcDir = "src"
binDir = "src"
bin = @["zegarek"]
skipExt = @["nim"]
# Dependencies
requires "nim >= 1.2.0"
requires "gintro >= 0.7.3"
import strformat, strutils
import sequtils
import pegs
from os import splitFile, `/`
import macros
template runGorge(cmd: string): string =
gorge("cd " & system.getCurrentDir() & " && " & cmd)
template run(cmd: string) =
echo "+ ", cmd
echo runGorge(cmd)
proc convertImage(filePath: string) =
let filename = filePath.splitFile().name
for size in ["16x16", "32x32", "64x64", "128x128", "256x256"]:
let cmd = fmt"rsvg-convert {filePath} -w {size.split('x')[0]} -h {size.split('x')[1]} -o AppDir/usr/share/icons/hicolor/{size}/apps/{filename}.png"
echo cmd
run cmd
proc getPackageName(): string =
# TODO: packageName is empty when not specified. Is it a bug?
if packageName.len != 0:
return packageName
else:
return "zegarek"
proc downloadAndExtractAppImage(url: string, outputDir: string) =
let filename = runGorge fmt"""wget -cnv {url} 2>&1 |cut -d\" -f2"""
run fmt"""
chmod +x {filename} &&
printf '\x00' | dd bs=1 seek=8 count=1 conv=notrunc of={filename} &&
./{filename} --appimage-extract
mv ./squashfs-root {outputDir}
"""
proc copyRequiredLibs(baseDir: string, filename = "requiredLibs") =
if existsFile(filename):
var requiredLibs: seq[string]
for line in readFile(filename).splitLines():
# Ignore comments, empty lines and >
if line =~ peg"^\s*'#'.*" or line =~ peg"^\s*$" or line.contains(">"):
continue
requiredLibs.add(line.split("#")[0].replace(" ", ""))
writeFile("requiredLibsFiltered", requiredLibs.join("\n"))
echo "Libs to copy: ", requiredLibs
run "xargs -i cp -L {} " & baseDir & " < requiredLibsFiltered"
# Silence canberra error
var requiredSpecialLibs = readFile("requiredLibs").splitLines().filterIt(it.contains(">"))
for lib in requiredSpecialLibs:
echo fmt"Copying additional lib: {lib}"
let splitLib = lib.replace(" ", "").split(">")
mkdir baseDir/splitLib[1].splitFile().dir
cpFile splitLib[0], baseDir/splitLib[1]
macro repeatProc(procVar: untyped, args: varargs[untyped]): untyped =
result = newNimNode(nnkStmtList)
for arg in args:
let a = quote do:
`procVar`(`arg`)
result.add(a)
template rmDir(dirs: varargs[string]) =
repeatProc rmDir, dirs
template rmFile(files: varargs[string]) =
repeatProc rmFile, files
task updateL10n, "Update .pot and .po localisation files":
mkdir "build"
# Prevent translation of Name and Icon fields in .desktop
writeFile "build/zegarek.desktop.in",
"res/zegarek.desktop".readFile.
multiReplace([("Name=", "_Name="), ("Icon=", "_Icon=")])
run fmt"""xgettext --package-name={getPackageName()} --package-version={version}\
-f po/POTFILES.in -d {getPackageName()} -p po -o {getPackageName()}.pot"""
let linguas = readFile("po/LINGUAS").split("\n")
for lang in linguas:
run fmt"msgmerge po/{lang}.po po/{getPackageName()}.pot -o po/{lang}.po"
proc buildL10nMo() =
let linguas = readFile("po/LINGUAS").split("\n")
for lang in linguas:
mkDir fmt"build/locale/{lang}/LC_MESSAGES"
run fmt"msgfmt po/{lang}.po -o build/locale/{lang}/LC_MESSAGES/{getPackageName()}.mo"
proc buildL10nDesktop() =
run fmt"msgfmt --desktop --template=res/zegarek.desktop -d po -o build/zegarek.desktop"
task buildL10n, "Build files needed for localisation":
buildL10nMo()
buildL10nDesktop()
task appimage, "Build AppImage":
`buildL10n Task`()
mkdir("build/AppDir")
cd("build")
downloadAndExtractAppImage("https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage ", "linuxdeploy")
run "./linuxdeploy/AppRun --appdir AppDir"
run "nim c -d:release -d:nimDebugDlOpen -o:AppDir/usr/bin/zegarek ../src/zegarek.nim"
convertImage("../res/zegarek-icon.svg")
# Fix AppImage thumbnail creation
cpFile("AppDir/usr/share/icons/hicolor/256x256/apps/zegarek-icon.png", "AppDir/zegarek-icon.png")
run "cd AppDir && ln -s zegarek-icon.png .DirIcon"
writeFile("AppDir/AppRun","""
#!/bin/sh
SELF=$(readlink -f "$0")
HERE=${SELF%/*}
export PATH="${HERE}/usr/bin/:${HERE}/usr/sbin/:${HERE}/usr/games/:${HERE}/bin/:${HERE}/sbin/${PATH:+:$PATH}"
export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/:${HERE}/lib32/:${HERE}/lib64/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export PYTHONPATH="${HERE}/usr/share/pyshared/${PYTHONPATH:+:$PYTHONPATH}"
# export XDG_DATA_DIRS="${HERE}/usr/share/${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}"
export PERLLIB="${HERE}/usr/share/perl5/:${HERE}/usr/lib/perl5/${PERLLIB:+:$PERLLIB}"
export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas/${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}"
export QT_PLUGIN_PATH="${HERE}/usr/lib/qt4/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt4/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt4/plugins/:${HERE}/usr/lib32/qt4/plugins/:${HERE}/usr/lib64/qt4/plugins/:${HERE}/usr/lib/qt5/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt5/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt5/plugins/:${HERE}/usr/lib32/qt5/plugins/:${HERE}/usr/lib64/qt5/plugins/${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}"
EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2 | cut -d " " -f 1)
exec "${EXEC}" "$@"
""")
run "chmod +x AppDir/AppRun"
cpFile("../res/zegarek-icon.svg", "AppDir/usr/share/icons/hicolor/scalable/apps/zegarek-icon.svg")
cpFile("../res/zegarek.desktop", "AppDir/usr/share/applications/zegarek.desktop")
cpFile("../res/zegarek.desktop", "AppDir/zegarek.desktop")
cpFile("../src/main.css", "AppDir/usr/bin/main.css")
cpFile("../src/main.glade", "AppDir/usr/bin/main.glade")
cpDir("locale", "AppDir/usr/share/locale")
run fmt"VERSION={version} ./linuxdeploy/AppRun --appdir AppDir"
copyRequiredLibs("AppDir/usr/lib")
if existsFile("excludelist.local"):
for excludedLib in readFile("excludelist.local").splitLines():
if excludedLib =~ peg"^\s*'#'.*" or excludedLib =~ peg"^\s*$":
continue
echo "Removing ", excludedLib
rmFile "AppDir/usr/lib"/excludedLib
downloadAndExtractAppImage("https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage", "appimagetool")
run fmt"VERSION={version} ./appimagetool/AppRun AppDir"
task appimageDocker, "Build AppImage in Docker":
run "docker build -t zegarek ."
mkdir "build"
run fmt"docker run -i --rm zegarek sh -c 'cd build && tar -c Zegarek*AppImage' | tar -x -C build/"
task windows, "Build Windows binary":
buildL10nMo()
mkdir "build/Windows"
cd "build"
run "mkdir -p Windows/bin/"
run "nim c -d:release --app:gui -d:nimDebugDlOpen -d:mingw --cpu:amd64 --dynlibOverrideAll --passL:\"`x86_64-w64-mingw32-pkg-config --libs gtk+-3.0`\" -o:Windows/bin/zegarek ../src/zegarek.nim"
copyRequiredLibs("./Windows/bin/")
# TODO
run "cp /usr/x86_64-w64-mingw32/sys-root/mingw/bin/*.dll ./Windows/bin/"
cpFile("../res/zegarek-icon.svg", "Windows/bin/zegarek-icon.svg")
cpFile("../src/main.css", "Windows/bin/main.css")
cpFile("../src/main.glade", "Windows/bin/main.glade")
run "mkdir -p Windows/share/"
cpDir "locale", "Windows/share/locale"
run "cp -R /usr/x86_64-w64-mingw32/sys-root/mingw/share/icons/ Windows/share/"
run "cp -R /usr/x86_64-w64-mingw32/sys-root/mingw/share/glib-2.0/ Windows/share/"
run "mkdir -p Windows/lib/"
run "cp -R /usr/x86_64-w64-mingw32/sys-root/mingw/lib/gdk-pixbuf-2.0 Windows/lib/"
rmFile "Windows/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache"
mvDir "Windows", fmt"Zegarek-{version}-Windows-64"
run fmt"zip -r -9 Zegarek-{version}-Windows-64.zip Zegarek-{version}-Windows-64"
task windowsDocker, "Build Windows binary in Docker":
run "pwd"
run "docker build -t zegarek-windows -f ./Dockerfile-windows ."
mkdir "build"
run fmt"docker run -i --rm zegarek-windows sh -c 'cd build/ && tar -c Zegarek*Windows-64.zip' | tar -x -C build/"
task clean, "Clean build directory":
cd("build")
rmDir "AppDir", "locale", "squashfs-root"
rmFile "zegarek.desktop", "zegarek.desktop.in"
run("rm Zegarek*.AppImage")
before build:
buildL10nMo()
#not working now - nimble bug