#!/bin/bash set -e DIST_DIR="$PWD/windows-installer/win64-dist" JOBS=$NUMBER_OF_PROCESSORS msg() { echo -e "\e[32m$1\e[0m" } fatal() { echo -e "\e[31m$1\e[0m" exit 1 } download_yolort() { file_name=cppwinrt-2.0.210122.3+windows-10.0.19041+yolort-835cd4e.zip yolort_dir="$PWD/plugins/windows-notification/yolort" rm -rf "$yolort_dir" mkdir "$yolort_dir" curl -L -o "$file_name" "https://github.com/LAGonauta/YoloRT/releases/download/v1.0.0/$file_name" echo "675a6d943c97b4acdbfaa473f68d3241d1798b31a67b5529c8d29fc0176a1707 $file_name" | sha256sum --check --status unzip -o "$file_name" -d "$yolort_dir" rm -f "$file_name" } download_gtk4_git() { # FIXME: The bug fix https://gitlab.gnome.org/GNOME/gtk/-/issues/3749 is currently only available in the main branch, # so GTK4 was builded from it. Needs to be replaced with a package from the MSYS2 repository when the changes get there. url="https://github.com/mxlgv/mingw-w64-gtk4-git/releases/download/rel1" gtk_pkg="mingw-w64-x86_64-gtk4-git-4.14.1.r62.gb1eed1c153-1-any.pkg.tar.zst" gtk_gstreamer_pkg="mingw-w64-x86_64-gtk4-media-gstreamer-git-4.14.1.r62.gb1eed1c153-1-any.pkg.tar.zst" curl -L -o "$gtk_pkg" "$url/$gtk_pkg" curl -L -o "$gtk_gstreamer_pkg" "$url/$gtk_gstreamer_pkg" pacman -U --needed --noconfirm "$gtk_pkg" "$gtk_gstreamer_pkg" } prepare() { msg "Installing MINGW64 build dependencies" pacman -S --needed --noconfirm \ mingw64/mingw-w64-x86_64-gcc \ mingw64/mingw-w64-x86_64-cmake \ mingw64/mingw-w64-x86_64-ninja \ mingw64/mingw-w64-x86_64-libadwaita \ mingw64/mingw-w64-x86_64-sqlite3 \ mingw64/mingw-w64-x86_64-openssl \ mingw64/mingw-w64-x86_64-libgcrypt \ mingw64/mingw-w64-x86_64-libgee \ mingw64/mingw-w64-x86_64-vala \ mingw64/mingw-w64-x86_64-gsettings-desktop-schemas \ mingw64/mingw-w64-x86_64-qrencode \ mingw64/mingw-w64-x86_64-ntldd-git \ mingw64/mingw-w64-x86_64-gpgme \ mingw64/mingw-w64-x86_64-fontconfig \ mingw64/mingw-w64-x86_64-iso-codes \ mingw64/mingw-w64-x86_64-gstreamer \ mingw64/mingw-w64-x86_64-gst-plugins-bad \ mingw64/mingw-w64-x86_64-gst-plugins-good \ mingw64/mingw-w64-x86_64-gst-plugins-base \ mingw64/mingw-w64-x86_64-gst-plugins-ugly \ mingw64/mingw-w64-x86_64-nsis \ mingw64/mingw-w64-x86_64-libsignal-protocol-c \ mingw64/mingw-w64-x86_64-icu \ mingw64/mingw-w64-x86_64-webrtc-audio-processing \ git \ make \ unzip \ curl msg "Downloading and install git versions of gtk4 and gtk4-media-gstreamer packages" download_gtk4_git msg "Successfully installed!" msg "Download YoloRT headers" download_yolort msg "Successfully downloaded!" } configure() { msg "Running configuration for Windows" ./configure --program-prefix="$DIST_DIR" --no-debug --release --disable-fast-vapi --with-libsoup3 msg "Configured!" } build() { msg "Started building on $JOBS threads" make -j"$JOBS" msg "Successfully builded!" } dist_install() { msg "Installing Dino in '$DIST_DIR'!" make install msg "Copying MINGW64 dependencies" cp /mingw64/bin/gdbus.exe "$DIST_DIR/bin" cp /mingw64/bin/gspawn-win64-helper.exe "$DIST_DIR/bin" cp /mingw64/bin/libcrypto-*-x64.dll "$DIST_DIR/bin/" cp -r /mingw64/lib/gstreamer-1.0 "$DIST_DIR/lib" mkdir -p "$DIST_DIR/lib/gdk-pixbuf-2.0/" && cp -r /mingw64/lib/gdk-pixbuf-2.0 "$DIST_DIR/lib/" mkdir -p "$DIST_DIR/lib/gio/" && cp -r /mingw64/lib/gio "$DIST_DIR/lib/" list=`find "$DIST_DIR" -type f \( -name "*.exe" -o -name "*.dll" \) -exec \ ntldd -R {} + | \ grep "mingw64" | \ cut -f1 -d "=" | sort | uniq` for a in $list; do cp -fv "/mingw64/bin/$a" "$DIST_DIR/bin/" done msg "Removing debug information from all EXE and DLL files" find "$DIST_DIR" -iname "*.exe" -exec strip -s {} + find "$DIST_DIR" -iname "*.dll" -exec strip -s {} + find "$DIST_DIR" -iname "*.a" -exec rm {} + msg "Removing redudant header files" rm -rf "$DIST_DIR/include" msg "Copy LICENSE" cp -f "$PWD/LICENSE" "$DIST_DIR/LICENSE" msg "Copy icons, themes, locales and fonts" cp -f "$PWD/main/dino.ico" "$DIST_DIR/dino.ico" cp -rf "/mingw64/share/xml" "$DIST_DIR/share" mkdir -p "$DIST_DIR/etc/fonts" && cp -r /mingw64/etc/fonts "$DIST_DIR/etc/" mkdir -p "$DIST_DIR/share/icons" && cp -r /mingw64/share/icons "$DIST_DIR/share/" mkdir -p "$DIST_DIR/share/glib-2.0/schemas" && cp -rf /mingw64/share/glib-2.0/schemas "$DIST_DIR/share/glib-2.0/" msg "Successfully installed!" } build_installer() { msg "Building an installer for Windows using NSIS" cd windows-installer makensis dino.nsi msg "Installer successfully builded!" cd .. } clean() { rm -rf build "$DIST_DIR" msg "Build artifacts removed successfull!" } help() { cat << EOF usage: $0 [OPTION] --prepare install build dependencies --configure configure the project --build build the project --dist-install install the builded project --build-installer build installer (using NSIS) --clean remove build artifacts --help show this help Running without parameters is equivalent to running: '--configure', '--build' and '--dist-install' EOF } if [[ "$(uname)" != "MINGW64_NT"* ]]; then fatal "This is not a MINGW64 environment!" fi case $1 in "--prepare" ) prepare ;; "--configure" ) configure ;; "--build" ) build ;; "--dist-install" ) dist_install ;; "--build-installer") build_installer ;; "--clean" ) clean ;; "--help" ) help ;; "" ) configure build dist_install ;; *) fatal "Unknown argument!" esac