From 904214378d00b9f1e111ca38bba3aa72ee95ad78 Mon Sep 17 00:00:00 2001 From: redtide Date: Mon, 9 Aug 2021 12:19:27 +0200 Subject: [PATCH] CI and custom build script utilities - macOS DMG image using AppDMG with custom background - Linux AppImage - Windows MSYS2 packaging - Source code tarball including subprojects source code - LHelper compatible build script --- .gitignore | 2 +- resources/macos/appdmg.png | Bin 0 -> 6167 bytes scripts/appdmg.sh | 30 +++++++ scripts/appimage.sh | 160 +++++++++++++++++++++++++++++++++++++ scripts/build.sh | 103 ++++++++++++++++++++++++ scripts/msys2-package.sh | 56 +++++++++++++ scripts/source-package.sh | 69 ++++++++++++++++ 7 files changed, 419 insertions(+), 1 deletion(-) create mode 100644 resources/macos/appdmg.png create mode 100644 scripts/appdmg.sh create mode 100644 scripts/appimage.sh create mode 100644 scripts/build.sh create mode 100644 scripts/msys2-package.sh create mode 100644 scripts/source-package.sh diff --git a/.gitignore b/.gitignore index aa8f4ba0..7dc39e42 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ submodules/ subprojects/lua/ subprojects/libagg/ subprojects/reproc/ +/appimage* .ccls-cache .lite-debug.log .run* @@ -13,7 +14,6 @@ subprojects/reproc/ *.zip *.DS_Store *App* -appimage* compile_commands.json error.txt lite-xl* diff --git a/resources/macos/appdmg.png b/resources/macos/appdmg.png new file mode 100644 index 0000000000000000000000000000000000000000..1df7b60d2a4a30c26f3a861ad2f93e89a2cbdee3 GIT binary patch literal 6167 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 lite-xl-dmg.json << EOF +{ + "title": "Lite XL", + "icon": "$(pwd)/resources/icons/icon.icns", + "background": "$(pwd)/resources/macos/appdmg.png", + "window": { + "position": { + "x": 360, + "y": 360 + }, + "size": { + "width": 480, + "height": 360 + } + }, + "contents": [ + { "x": 144, "y": 248, "type": "file", "path": "$(pwd)/Lite XL.app" }, + { "x": 336, "y": 248, "type": "link", "path": "/Applications" } + ] +} +EOF +~/node_modules/appdmg/bin/appdmg.js lite-xl-dmg.json "$(pwd)/$1.dmg" diff --git a/scripts/appimage.sh b/scripts/appimage.sh new file mode 100644 index 00000000..b2cc5cd7 --- /dev/null +++ b/scripts/appimage.sh @@ -0,0 +1,160 @@ +#!/bin/env bash +set -ex + +if [ ! -e "src/api/api.h" ]; then + echo "Please run this script from the root directory of Lite XL." + exit 1 +fi + +show_help(){ + echo + echo $0 + echo + echo "Available options:" + echo + echo "-h --help Show this help and exits." + echo "-b --builddir DIRNAME Sets the name of the build dir (no path)." + echo " Default: 'build'." + echo "-n --nobuild Skips the build step, use existing files." + echo "-s --static Specify if building using static libraries" + echo " by using lhelper tool." + echo "-v --version VERSION Specify a version, non whitespace separated string." + echo +} + +ARCH="$(uname -m)" +BUILD_DIR=build +RUN_BUILD=true +STATIC_BUILD=false + +for i in "$@"; do + case $i in + -h|--belp) + show_help + exit 0 + ;; + -b|--builddir) + BUILD_DIR="$2" + shift + shift + ;; + -n|--nobuild) + RUN_BUILD=false + shift + ;; + -s|--static) + STATIC_BUILD=true + shift + ;; + -v|--version) + VERSION="$2" + shift + shift + ;; + *) + # unknown option + ;; + esac +done + +# TODO: Versioning using git +#if [[ -z $VERSION && -d .git ]]; then +# VERSION=$(git describe --tags --long | sed 's/^v//; s/\([^-]*-g\)/r\1/; s/-/./g') +#fi + +if [[ -n $1 ]]; then + show_help + exit 1 +fi + +setup_appimagetool(){ + if ! which appimagetool > /dev/null ; then + if [ ! -e appimagetool ]; then + if ! wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-${ARCH}.AppImage" ; then + echo "Could not download the appimagetool for the arch '${ARCH}'." + exit 1 + else + chmod 0755 appimagetool + fi + fi + fi +} + +download_appimage_apprun(){ + if [ ! -e AppRun ]; then + if ! wget -O AppRun "https://github.com/AppImage/AppImageKit/releases/download/continuous/AppRun-${ARCH}" ; then + echo "Could not download AppRun for the arch '${ARCH}'." + exit 1 + else + chmod 0755 AppRun + fi + fi +} + +build_litexl(){ + if [ -e build ]; then + rm -rf build + fi + + if [ -e ${BUILD_DIR} ]; then + rm -rf ${BUILD_DIR} + fi + + echo "Build lite-xl..." + sleep 1 + meson setup --buildtype=release --prefix /usr ${BUILD_DIR} + meson compile -C ${BUILD_DIR} +} + +generate_appimage(){ + if [ -e LiteXL.AppDir ]; then + rm -rf LiteXL.AppDir + fi + + echo "Creating LiteXL.AppDir..." + + DESTDIR="$(realpath LiteXL.AppDir)" meson install --skip-subprojects -C ${BUILD_DIR} + mv AppRun LiteXL.AppDir/ + # These could be symlinks but it seems they doesn't work with AppimageLauncher + cp resources/icons/lite-xl.svg LiteXL.AppDir/ + cp resources/linux/org.lite-xl.lite-xl.desktop LiteXL.AppDir/ + + if [[ $STATIC_BUILD == false ]]; then + echo "Copying libraries..." + + mkdir -p LiteXL.AppDir/usr/lib/ + + local allowed_libs=( + libfreetype + libpcre2 + libSDL2 + libsndio + liblua + ) + + while read line; do + local libname="$(echo $line | cut -d' ' -f1)" + local libpath="$(echo $line | cut -d' ' -f2)" + for lib in "${allowed_libs[@]}" ; do + if echo "$libname" | grep "$lib" > /dev/null ; then + cp "$libpath" LiteXL.AppDir/usr/lib/ + continue 2 + fi + done + echo " Ignoring: $libname" + done < <(ldd build/src/lite-xl | awk '{print $1 " " $3}') + fi + + echo "Generating AppImage..." + local version="" + if [ -n "$VERSION" ]; then + version="-$VERSION" + fi + + ./appimagetool LiteXL.AppDir LiteXL${version}-${ARCH}.AppImage +} + +setup_appimagetool +download_appimage_apprun +if [[ $RUN_BUILD == true ]]; then build_litexl; fi +generate_appimage $1 diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100644 index 00000000..b0e013b1 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,103 @@ +#!/bin/bash +set -ex + +if [ ! -e "src/api/api.h" ]; then + echo "Please run this script from the root directory of Lite XL." + exit 1 +fi + +show_help(){ + echo + echo "Usage: $0 " + echo + echo "Available options:" + echo + echo "-b --builddir DIRNAME Sets the name of the build directory (not path)." + echo " Default: 'build'." + echo "-p --prefix Install directory prefix. Mandatory." + echo "-s --static Specify if building using static libraries" + echo " by using lhelper tool." + echo +} + +install_lhelper() { + if [[ ! -d lhelper ]]; then + git clone https://github.com/franko/lhelper.git + pushd lhelper; bash install-github; popd + + if [[ "$OSTYPE" == "darwin"* ]]; then + CC=clang CXX=clang++ lhelper create lite-xl -n + else + lhelper create lite-xl -n + fi + fi + + # Not using `lhelper activate lite-xl` + source "$(lhelper env-source lite-xl)" + + lhelper install freetype2 + lhelper install sdl2 2.0.14-wait-event-timeout-1 + lhelper install pcre2 + + # Help MSYS2 to find the SDL2 include and lib directories to avoid errors + # during build and linking when using lhelper. + if [[ "$OSTYPE" == "msys" ]]; then + CFLAGS=-I${LHELPER_ENV_PREFIX}/include/SDL2 + LDFLAGS=-L${LHELPER_ENV_PREFIX}/lib + fi +} + +build() { + CFLAGS=$CFLAGS LDFLAGS=$LDFLAGS meson setup \ + --buildtype=release \ + --prefix "$PREFIX" \ + --wrap-mode=forcefallback \ + "${BUILD_DIR}" + + meson compile -C build +} + +BUILD_DIR=build +STATIC_BUILD=false + +for i in "$@"; do + case $i in + -h|--belp) + show_help + exit 0 + ;; + -b|--builddir) + BUILD_DIR="$2" + shift + shift + ;; + -p|--prefix) + PREFIX="$2" + shift + shift + ;; + -s|--static) + STATIC_BUILD=true + shift + ;; + *) + # unknown option + ;; + esac +done + +if [[ -n $1 ]]; then + show_help + exit 1 +fi + +if [[ -z $PREFIX ]]; then + echo "ERROR: prefix argument is missing." + exit 1 +fi + +if [[ $STATIC_BUILD == true ]]; then + install_lhelper +fi + +build diff --git a/scripts/msys2-package.sh b/scripts/msys2-package.sh new file mode 100644 index 00000000..5138d8a3 --- /dev/null +++ b/scripts/msys2-package.sh @@ -0,0 +1,56 @@ +#!/bin/bash +set -ex + +if [ ! -e "src/api/api.h" ]; then + echo "Please run this script from the root directory of Lite XL." + exit 1 +fi + +# FIXME: For some strange reason sometimes an error occurs randomly on the +# MINGW32 build of GitHub Actions; the environment variable $INSTALL_NAME +# is correct, but it expands with a drive letter at the end (all builds). + +show_help(){ + echo + echo "Usage: $0 " + echo + echo "Available options:" + echo + echo "-b --builddir DIRNAME Sets the name of the build directory (not path)." + echo " Default: 'build'." + echo "-d --destdir DIRNAME Sets the name of the install directory (not path)." + echo +} + +BUILD_DIR=build + +for i in "$@"; do + case $i in + -h|--belp) + show_help + exit 0 + ;; + -b|--builddir) + BUILD_DIR="$2" + shift + shift + ;; + -d|--destdir) + DEST_DIR="$2" + shift + shift + ;; + *) + # unknown option + ;; + esac +done + +if [[ -n $1 ]]; then + show_help + exit 1 +fi + +DESTDIR="$(pwd)/${DEST_DIR}" meson install --skip-subprojects -C ${BUILD_DIR} + +zip -9rv ${DEST_DIR}.zip ${DEST_DIR}/* diff --git a/scripts/source-package.sh b/scripts/source-package.sh new file mode 100644 index 00000000..aff80c9d --- /dev/null +++ b/scripts/source-package.sh @@ -0,0 +1,69 @@ +#!/bin/bash +set -ex + +if [ ! -e "src/api/api.h" ]; then + echo "Please run this script from the root directory of Lite XL." + exit 1 +fi + +show_help(){ + echo + echo "Usage: $0 " + echo + echo "Available options:" + echo + echo "-b --builddir DIRNAME Sets the name of the build directory (no path)." + echo " Default: 'build'." + echo "-d --destdir DIRNAME Sets the name of the install directory (no path)." + echo +} + +BUILD_DIR=build +DEST_DIR=lite-xl-src + +for i in "$@"; do + case $i in + -h|--belp) + show_help + exit 0 + ;; + -b|--builddir) + BUILD_DIR="$2" + shift + shift + ;; + -d|--destdir) + DEST_DIR="$2" + shift + shift + ;; + *) + # unknown option + ;; + esac +done + +if [[ -n $1 ]]; then + show_help + exit 1 +fi + +if test -d ${BUILD_DIR}; then rm -rf ${BUILD_DIR}; fi +if test -d ${DEST_DIR}; then rm -rf ${DEST_DIR}; fi +if test -f ${DEST_DIR}.tar.gz; then rm ${DEST_DIR}.tar.gz; fi + +meson subprojects download +meson setup ${BUILD_DIR} + +rsync -arv \ + --exclude /*build*/ \ + --exclude *.git* \ + --exclude lhelper \ + --exclude lite-xl* \ + --exclude submodules \ + . ${DEST_DIR} + +cp "${BUILD_DIR}/start.lua" "${DEST_DIR}/data/core" + +tar rf ${DEST_DIR}.tar ${DEST_DIR} +gzip -9 ${DEST_DIR}.tar