Bump version to 0.15.0
[GameHub.git] / scripts / build.sh
blob8bc4758fc353bfa4af053fd41f9d16cbb001e6c5
1 #!/bin/bash
3 _GH_RDNN="com.github.tkashkin.gamehub"
4 _GH_VERSION="0.15.0"
6 _GH_BRANCH="${APPVEYOR_REPO_BRANCH:-$(git symbolic-ref --short -q HEAD)}"
7 _GH_COMMIT="$(git rev-parse HEAD)"
8 _GH_COMMIT_SHORT="$(git rev-parse --short HEAD)"
10 _ROOT="`pwd`"
11 _SCRIPTROOT="$(dirname "$(readlink -f "$0")")"
12 _LINUXDEPLOYQT="linuxdeployqt-5-x86_64.AppImage"
14 _SOURCE="${APPVEYOR_BUILD_VERSION:-$_GH_VERSION-$_GH_BRANCH-local}"
15 _VERSION="$_SOURCE-$_GH_COMMIT_SHORT"
16 _BUILD_VERSION="${APPVEYOR_BUILD_VERSION:-$_VERSION}"
17 _DEB_TARGET_DISTRO_ID="ubuntu"
18 _DEB_TARGET_DISTRO_NAMES=()
19 _DEB_TARGET_DISTRO_VERSIONS=()
20 _BUILD_IMAGE="local"
21 _GPG_BINARY="gpg1"
22 _GPG_PACKAGE="gnupg1"
24 export CFLAGS="$CFLAGS -O0"
25 export DEB_BUILD_OPTIONS="noopt nostrip nocheck"
27 if [[ "$APPVEYOR_BUILD_WORKER_IMAGE" = "Ubuntu1604" ]]; then
28 _DEB_TARGET_DISTRO_NAMES=("xenial")
29 _DEB_TARGET_DISTRO_VERSIONS=("16.04")
30 _BUILD_IMAGE="xenial"
31 _GPG_BINARY="gpg"
32 _GPG_PACKAGE="gnupg"
33 elif [[ "$APPVEYOR_BUILD_WORKER_IMAGE" = "Ubuntu1804" ]]; then
34 _DEB_TARGET_DISTRO_NAMES=("bionic" "disco" "eoan")
35 _DEB_TARGET_DISTRO_VERSIONS=("18.04" "19.04" "19.10")
36 _BUILD_IMAGE="bionic"
37 else
38 source "/etc/os-release"
39 _DEB_TARGET_DISTRO_ID="$ID"
40 _DEB_TARGET_DISTRO_NAMES=("$VERSION_CODENAME")
41 _DEB_TARGET_DISTRO_VERSIONS=("$VERSION_ID")
44 BUILDROOT="$_ROOT/build/appimage"
45 BUILDDIR="$BUILDROOT/build"
46 APPDIR="$BUILDROOT/appdir"
48 ACTION=${1:-build_local}
49 CHECKRT=${2:---checkrt}
51 _usr_patch()
53 set +e
54 file="$1"
55 echo "[scripts/build.sh] Patching $file"
56 sed -i -e 's#/usr#././#g' "$file"
59 _mv_deps()
61 set +e
62 lib="$1"
63 src="$2"
64 dest="$3"
65 recursive=${4:-true}
66 echo "[scripts/build.sh] Moving $lib"
67 [ -e "$src/$lib" ] && mv -f "$src/$lib" "$dest"
68 [ -e "$dest/$lib" ] && ldd "$dest/$lib" | awk '{print $1}' | while read dep; do
69 [ -e "$src/$dep" ] && echo "[scripts/build.sh] $dep <- $lib"
70 if [ "$recursive" = "true" ]; then
71 [ -e "$src/$dep" ] && _mv_deps "$dep" "$src" "$dest" "$recursive"
72 else
73 [ -e "$src/$dep" ] && mv -f "$src/$dep" "$dest"
75 done
78 import_keys()
80 set +e
81 cd "$_ROOT"
82 if [[ -n "$keys_enc_secret" ]]; then
83 echo "[scripts/build.sh] Importing keys"
84 sudo apt install -y "$_GPG_PACKAGE"
85 curl -sflL "https://raw.githubusercontent.com/appveyor/secure-file/master/install.sh" | bash -e -
86 ./appveyor-tools/secure-file -decrypt "$_SCRIPTROOT/launchpad/key_pub.gpg.enc" -secret $keys_enc_secret
87 ./appveyor-tools/secure-file -decrypt "$_SCRIPTROOT/launchpad/key_sec.gpg.enc" -secret $keys_enc_secret
88 ./appveyor-tools/secure-file -decrypt "$_SCRIPTROOT/launchpad/passphrase.enc" -secret $keys_enc_secret
89 "$_GPG_BINARY" --no-use-agent --import "$_SCRIPTROOT/launchpad/key_pub.gpg"
90 "$_GPG_BINARY" --no-use-agent --allow-secret-key-import --import "$_SCRIPTROOT/launchpad/key_sec.gpg"
91 sudo apt-key add "$_SCRIPTROOT/launchpad/key_pub.gpg"
92 rm -f "$_SCRIPTROOT/launchpad/key_pub.gpg" "$_SCRIPTROOT/launchpad/key_sec.gpg"
96 deps()
98 set +e
99 echo "[scripts/build.sh] Installing dependencies"
100 sudo DEBIAN_FRONTEND="noninteractive" add-apt-repository ppa:elementary-os/stable -y
101 sudo DEBIAN_FRONTEND="noninteractive" add-apt-repository ppa:elementary-os/os-patches -y
102 sudo DEBIAN_FRONTEND="noninteractive" add-apt-repository ppa:elementary-os/daily -y
103 sudo DEBIAN_FRONTEND="noninteractive" add-apt-repository ppa:vala-team/next -y
104 sudo DEBIAN_FRONTEND="noninteractive" apt update -qq
105 sudo DEBIAN_FRONTEND="noninteractive" apt install -y meson valac checkinstall build-essential dput fakeroot moreutils git-buildpackage elementary-sdk libgtk-3-dev libglib2.0-dev libwebkit2gtk-4.0-dev libjson-glib-dev libgee-0.8-dev libsoup2.4-dev libsqlite3-dev libxml2-dev libpolkit-gobject-1-dev
106 #sudo apt full-upgrade -y
107 if [[ "$APPVEYOR_BUILD_WORKER_IMAGE" = "Ubuntu1604" ]]; then
108 sudo DEBIAN_FRONTEND="noninteractive" dpkg -i "$_SCRIPTROOT/deps/xenial/"*.deb
109 else
110 sudo DEBIAN_FRONTEND="noninteractive" apt install -y libmanette-0.2-dev libxtst-dev libx11-dev
114 gen_changelogs()
116 set +e
117 cd "$_ROOT"
118 echo "[scripts/build.sh] Generating changelogs"
120 if [[ -z `git config user.name` ]]; then
121 git config user.email "ci@localhost"
122 git config user.name "CI"
125 git fetch --tags
127 git tag -a $_BUILD_VERSION -m $_BUILD_VERSION
129 > "debian/changelog.in"
130 > "data/$_GH_RDNN.changelog.xml"
132 prevtag="initial"
133 git tag --sort v:refname | while read tag; do
134 if [[ "$prevtag" == "initial" ]]; then
135 prevtag="$tag"
136 continue
139 commitmsg=`git log --pretty=format:' * %s [%h]' $prevtag..$tag`
142 echo "$_GH_RDNN ($tag~\$VERSION_SUFFIX) \$DISTRO; urgency=low"
143 echo "${commitmsg:- * <no commit message>}"
144 git log -n1 --pretty='format:%n -- %aN <%aE> %aD%n%n' $tag^..$tag
145 ) | cat - "debian/changelog.in" | sponge "debian/changelog.in"
147 xml_r_type="development" && [[ "$tag" == *"-master" ]] && xml_r_type="stable"
148 xml_r_date=`git log -n1 --date=short --pretty='format:date="%cd" timestamp="%ct"' $tag^..$tag`
149 xml_r_end=" />" && [[ -n "$commitmsg" ]] && xml_r_end=">"
150 xml_ver=`echo "$tag" | sed -E "s|-|.|g"`
153 echo -e "\t\t<release type=\"$xml_r_type\" version=\"$xml_ver\" $xml_r_date$xml_r_end"
155 if [[ -n "$commitmsg" ]]; then
156 echo -e "\t\t\t<description>"
157 echo -e "\t\t\t\t<ul>"
159 echo "$commitmsg" | sed -E "s|<|\&lt;|g; s|>|\&gt;|g; s| \* (.*)|\t\t\t\t\t<li>\1</li>|g"
161 echo -e "\t\t\t\t</ul>"
162 echo -e "\t\t\t</description>"
163 echo -e "\t\t</release>"
165 ) | cat - "data/$_GH_RDNN.changelog.xml" | sponge "data/$_GH_RDNN.changelog.xml"
167 prevtag="$tag"
168 done
170 git tag -d $_BUILD_VERSION
173 build_deb()
175 set -e
176 cd "$_ROOT"
177 sed "s/\$_GH_BRANCH/$_GH_BRANCH/g; s/\$_GH_COMMIT_SHORT/$_GH_COMMIT_SHORT/g; s/\$_GH_COMMIT/$_GH_COMMIT/g" "debian/rules.in" > "debian/rules"
178 if [[ "$APPVEYOR_BUILD_WORKER_IMAGE" = "Ubuntu1604" ]]; then
179 sed "s/libmanette-0.2-dev,//g" "debian/control.in" > "debian/control"
180 else
181 cp -f "debian/control.in" "debian/control"
184 for i in "${!_DEB_TARGET_DISTRO_NAMES[@]}"; do
185 _DEB_TARGET_DISTRO_NAME="${_DEB_TARGET_DISTRO_NAMES[$i]}"
186 _DEB_TARGET_DISTRO_VERSION="${_DEB_TARGET_DISTRO_VERSIONS[$i]}"
187 _DEB_VERSION_SUFFIX="${_DEB_TARGET_DISTRO_ID}${_DEB_TARGET_DISTRO_VERSION}"
188 _DEB_VERSION="${_BUILD_VERSION}~${_DEB_VERSION_SUFFIX}"
189 sed "s/\$DISTRO/${_DEB_TARGET_DISTRO_NAME}/g; s/\$VERSION_SUFFIX/${_DEB_VERSION_SUFFIX}/g" "debian/changelog.in" > "debian/changelog"
191 if [[ $i = 0 ]]; then
192 echo "[scripts/build.sh] Building binary package for $_DEB_TARGET_DISTRO_ID $_DEB_TARGET_DISTRO_VERSION ($_DEB_TARGET_DISTRO_NAME)"
193 dpkg-buildpackage -F -sa -us -uc
194 mkdir -p "build/$_BUILD_IMAGE"
195 mv ../$_GH_RDNN*.deb "build/${_BUILD_IMAGE}/GameHub-${_BUILD_VERSION}-${_DEB_TARGET_DISTRO_NAME}-amd64.deb"
198 if [[ -e "$_SCRIPTROOT/launchpad/passphrase" && -n "$keys_enc_secret" ]]; then
199 set +e
200 echo "[scripts/build.sh] Building source package for $_DEB_TARGET_DISTRO_ID $_DEB_TARGET_DISTRO_VERSION ($_DEB_TARGET_DISTRO_NAME)"
201 dpkg-buildpackage -S -sa -us -uc
202 echo "[scripts/build.sh] Signing source package"
203 debsign -p"$_GPG_BINARY --no-use-agent --passphrase-file $_SCRIPTROOT/launchpad/passphrase --batch" -S -k2744E6BAF20BA10AAE92253F20442B9273408FF9 "../${_GH_RDNN}_${_DEB_VERSION}_source.changes"
204 echo "[scripts/build.sh] Uploading package to launchpad"
205 dput -u -c "$_SCRIPTROOT/launchpad/dput.cf" "gamehub_${_DEB_TARGET_DISTRO_NAME}" "../${_GH_RDNN}_${_DEB_VERSION}_source.changes"
206 rm "../${_GH_RDNN}_"*
207 set -e
209 done
210 rm -f "$_SCRIPTROOT/launchpad/passphrase"
211 cd "$_ROOT"
214 build()
216 set -e
217 echo "[scripts/build.sh] Building"
218 cd "$_ROOT"
219 mkdir -p "$BUILDROOT"
220 meson "$BUILDDIR" --prefix=/usr --buildtype=debug -Ddistro=generic -Dappimage=true -Dgit_branch=$_GH_BRANCH -Dgit_commit=$_GH_COMMIT -Dgit_commit_short=$_GH_COMMIT_SHORT
221 cd "$BUILDDIR"
222 ninja
223 DESTDIR="$APPDIR" ninja install
224 cd "$_ROOT"
227 appimage()
229 set -e
230 echo "[scripts/build.sh] Preparing AppImage"
231 cd "$BUILDROOT"
232 wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/5/$_LINUXDEPLOYQT"
233 chmod a+x "./$_LINUXDEPLOYQT"
234 unset QTDIR; unset QT_PLUGIN_PATH; unset LD_LIBRARY_PATH
235 export VERSION="${_BUILD_IMAGE}-${_VERSION}"
236 export LD_LIBRARY_PATH=$APPDIR/usr/lib:$LD_LIBRARY_PATH
237 "./$_LINUXDEPLOYQT" "$APPDIR/usr/share/applications/$_GH_RDNN.desktop" -appimage -no-plugins -no-copy-copyright-files
240 appimage_tweak()
242 set -e
243 echo "[scripts/build.sh] Tweaking AppImage"
244 cd "$BUILDROOT"
245 rm -f "$APPDIR/AppRun"
246 cp -f "$_SCRIPTROOT/AppRun" "$APPDIR/AppRun"
247 glib-compile-schemas "$APPDIR/usr/share/glib-2.0/schemas"
250 appimage_bundle_libs()
252 set +e
253 echo "[scripts/build.sh] Bundling additional libs"
254 cd "$BUILDROOT"
256 mkdir -p "$APPDIR/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/"
257 cp -rf "/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/injected-bundle/" "$APPDIR/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/"
258 cp -f "/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitNetworkProcess" "$APPDIR/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/"
259 cp -f "/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitStorageProcess" "$APPDIR/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/"
260 cp -f "/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitWebProcess" "$APPDIR/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/"
261 find "$APPDIR/usr/lib/" -maxdepth 1 -type f -name "libwebkit2gtk-4.0.so.*" -print0 | while read -d $'\0' file; do
262 _usr_patch "$file"
263 done
264 find "$APPDIR/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/" -maxdepth 1 -type f -print0 | while read -d $'\0' file; do
265 _usr_patch "$file"
266 done
269 appimage_checkrt()
271 set +e
272 echo "[scripts/build.sh] Bundling checkrt libs"
273 cd "$BUILDROOT"
274 cp -f "$_SCRIPTROOT/checkrt.sh" "$APPDIR/checkrt.sh"
275 cp -rf "$_SCRIPTROOT/optlib" "$APPDIR/usr/"
277 echo "[scripts/build.sh] Moving GTK and its dependencies"
278 mkdir -p "$APPDIR/usr/optlib/libgtk-3.so.0/"
279 _mv_deps "libgtk-3.so.0" "$APPDIR/usr/lib" "$APPDIR/usr/optlib/libgtk-3.so.0/"
281 echo "[scripts/build.sh] Moving back non-GTK-specific dependencies"
282 find "$APPDIR/usr/lib/" -maxdepth 1 -type f -not -name "libwebkit2gtk-4.0.so.*" -print0 | while read -d $'\0' dep; do
283 _mv_deps "$(basename $dep)" "$APPDIR/usr/optlib/libgtk-3.so.0" "$APPDIR/usr/lib/" "false"
284 done
286 if [[ "$APPVEYOR_BUILD_WORKER_IMAGE" = "Ubuntu1804" ]]; then
287 echo "[scripts/build.sh] Removing GTK and its dependencies"
288 rm -rf "$APPDIR/usr/optlib/libgtk-3.so.0"
291 for lib in 'libstdc++.so.6' 'libgcc_s.so.1'; do
292 echo "[scripts/build.sh] Bundling $lib"
293 mkdir -p "$APPDIR/usr/optlib/$lib"
294 for dir in "/lib" "/usr/lib"; do
295 libfile="$dir/x86_64-linux-gnu/$lib"
296 [ -e "$libfile" ] && cp "$libfile" "$APPDIR/usr/optlib/$lib/"
297 done
298 done
301 appimage_pack()
303 set -e
304 echo "[scripts/build.sh] Packing AppImage"
305 cd "$BUILDROOT"
306 unset QTDIR; unset QT_PLUGIN_PATH; unset LD_LIBRARY_PATH
307 export VERSION="${_BUILD_IMAGE}-${_VERSION}"
308 export LD_LIBRARY_PATH=$APPDIR/usr/lib:$LD_LIBRARY_PATH
309 "./$_LINUXDEPLOYQT" --appimage-extract
310 PATH=./squashfs-root/usr/bin:$PATH ./squashfs-root/usr/bin/appimagetool --no-appstream "$APPDIR"
313 build_flatpak()
315 set +e
316 echo "[scripts/build.sh] Building flatpak package"
317 cd "$_ROOT"
318 gen_changelogs
319 git add "debian/changelog" "data/$_GH_RDNN.changelog.xml"
320 git commit -m "Save generated changelog"
321 mkdir -p "$_ROOT/build/flatpak"
322 cd "$_ROOT/flatpak"
323 echo "[scripts/build.sh] Installing flatpak"
324 sudo DEBIAN_FRONTEND="noninteractive" apt install -y flatpak flatpak-builder
325 flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
326 sed "s/\$BRANCH/$_GH_BRANCH/g; s/\$COMMIT_SHORT/$_GH_COMMIT_SHORT/g; s/\$COMMIT/$_GH_COMMIT/g" "$_GH_RDNN.json.in" > "$_GH_RDNN.json"
327 echo "[scripts/build.sh] Autoinstalling dependencies"
328 flatpak-builder -y --user --install-deps-from=flathub --install-deps-only "$_ROOT/build/flatpak/build" "$_GH_RDNN.json"
329 echo "[scripts/build.sh] Building"
330 flatpak-builder -y --user --repo="$_ROOT/build/flatpak/repo" --force-clean "$_ROOT/build/flatpak/build" "$_GH_RDNN.json"
331 echo "[scripts/build.sh] Building bundle"
332 flatpak build-bundle "$_ROOT/build/flatpak/repo" "$_ROOT/build/flatpak/GameHub-${_BUILD_IMAGE}-${_VERSION}.flatpak" "$_GH_RDNN"
333 echo "[scripts/build.sh] Removing flatpak build and repo directories"
334 rm -rf ".flatpak-builder" "$_ROOT/build/flatpak/build" "$_ROOT/build/flatpak/repo"
335 return 0
338 set +e
339 cd "$_ROOT"
340 git submodule update --init
341 mkdir -p "$BUILDROOT"
343 if [[ "$ACTION" = "import_keys" ]]; then import_keys; fi
345 if [[ "$ACTION" = "deps" ]]; then deps; fi
347 if [[ "$ACTION" = "gen_changelogs" ]]; then gen_changelogs; fi
349 if [[ "$ACTION" = "build_deb" ]]; then build_deb; fi
351 if [[ "$ACTION" = "build" || "$ACTION" = "build_local" ]]; then build; fi
353 if [[ "$ACTION" = "appimage" || "$ACTION" = "build_local" ]]; then appimage; fi
354 if [[ "$ACTION" = "appimage_tweak" || "$ACTION" = "build_local" ]]; then appimage_tweak; fi
355 if [[ "$ACTION" = "appimage_bundle_libs" || "$ACTION" = "build_local" ]]; then appimage_bundle_libs; fi
356 if [[ "$ACTION" = "appimage_checkrt" || ( "$ACTION" = "build_local" && "$CHECKRT" = "--checkrt" ) ]]; then appimage_checkrt; fi
357 if [[ "$ACTION" = "appimage_pack" || "$ACTION" = "build_local" ]]; then appimage_pack; fi
359 if [[ "$ACTION" = "build_appimage" ]]; then
360 build
361 appimage
362 appimage_tweak
363 appimage_bundle_libs
364 appimage_checkrt
365 appimage_pack
368 if [[ "$ACTION" = "build_flatpak" && ! "$_BUILD_IMAGE" = "xenial" ]]; then build_flatpak; fi