Use brand new PKGBUILD for Aseprite Package (#1)

* Use brand new PKGBUILD instead

Attempting to fix the old one's jank

* Install third-party licenses as well

* Install .desktop file as well

* Add missing build-time dependencies

* Install icons in the icon theme directories instead

Also remove redundant `$srcdir`s in `package()`

* Put font license in the central directory as well

* Bump pkgrel

It was bumped during my work

* Ignore files in subdirectories

* Add missing resource files

* Use underscores for local variable names

https://wiki.archlinux.org/title/Arch_package_guidelines#Package_etiquette
https://github.com/ImperatorStorm/PKGBUILDs/pull/1#discussion_r777122781

* Use HTTPS for upstream URL

* Add myself as co-maintainer

Thanks!

* Remove ICU dependency

We are using a statically-linked version instead, apparently

* Avoid interactive prompts when patching fails

* Clean up $srcdir

Extract Aseprite's sources into a separate directory
Configure Aseprite out-of-tree
Configure Skia in a fresh directory (apparently `gn` does not support out-of-tree)

* Disable Skottie in Skia

This functionality doesn't appear to be used by Aseprite,
and excluding it should reduce build time

* Only pull Skia dependencies that we need

This significantly reduces initial build time (from syncing large repos)
and storage use.
The only remaining dependency that has a chance to be axed is `dng_sdk`,
for which more investigation is needed.

* Avoid printing redundant flags in `gn` args

Brainfart.
"static" flags like `is_debug` were re-printed for each "non-static"
(e.g. `skia_use_*`) variant.
Doing it this way also allows getting rid of weird quote shenanigans.

* Simplify `gn` configure line

`is_official_build=true` sets Skia up to use system libs by default,
so only specify those that we *don't* want

* Pull `gn` version ourselves

That way, we can additionally check its integrity via the SHA256

* Add forgotten `libgl` dependency

What's weird is that the lib seems not to be linked to dynamically,
but I can't see it not being required at run time. Right?

* Maybe use system libwebp? Based on https://patch-diff.githubusercontent.com/raw/aseprite/aseprite/pull/2535.patch

* Fix system `libwebp`, add `pixman` as makedep

* possibly fix shared-libwebp.patch?

* Disable updater

https://github.com/ImperatorStorm/PKGBUILDs/pull/1#issuecomment-1003838784

* Avoid creating symlinks to Skia deps in their dirs

Would occur if they were already symlinked

* Use system HarfBuzz and FreeType

I remember getting build errors, but cannot reproduce them anymore.
So use the system libs more where possible!

* Find all WebP libs

* Mark libwebp as runtime dep

* Remove CMake variables used by libwebp build

They do nothing now that we are using shared libwebp

* Remove build-time dep on Pixman

It doesn't wind up being used at all in the end

* Trim off a bunch of dependencies from Skia

Only libpng is required to render some of the images, it seems,
so this reduces build time and the amount of sources, which is good!

Co-authored-by: ImperatorStorm <30777770+ImperatorStorm@users.noreply.github.com>
This commit is contained in:
Eldred Habert
2022-01-06 00:52:22 +01:00
committed by ImperatorStorm
parent e576abc19c
commit 4bf904749f
7 changed files with 322 additions and 300 deletions

300
PKGBUILD
View File

@@ -1,4 +1,5 @@
# Maintainer: Imperator Storm <30777770+ImperatorStorm@users.noreply.github.com>
# Co-Maintainer: Eldred Habert <me@eldred.fr>
# Contributor: Fredrick Brennan <copypaste@kittens.ph>
# Contributor: Andrew Bueide <abueide@protonmail.com>
# Contributor: rouhannb <rouhannb@protonmail.com>
@@ -9,213 +10,132 @@
pkgname=aseprite
pkgver=1.2.30
pkgrel=3
pkgrel=4
pkgdesc='Create animated sprites and pixel art'
arch=('x86_64')
url="http://www.aseprite.org/"
url="https://www.aseprite.org/"
license=('custom')
depends=('cmark' 'curl' 'giflib' 'zlib' 'libpng' 'tinyxml' 'freetype2' 'fontconfig' 'libxcursor'
'hicolor-icon-theme')
makedepends=('cmake' 'ninja' 'git' 'python2' 'python' 'freeglut' 'xorgproto' 'libxi' 'harfbuzz-icu'
'nettle')
conflicts=("aseprite-git" "aseprite-gpl" "skia-git")
source=("https://github.com/${pkgname}/${pkgname}/releases/download/v${pkgver}/${pkgname^}-\
v${pkgver}-Source.zip"
"${pkgname}.desktop"
"git+https://chromium.googlesource.com/chromium/tools/depot_tools.git"
"git+https://github.com/${pkgname}/skia.git#branch=${pkgname}-m81"
"${pkgname}-${pkgver}-buildtools.tar.gz::https://chromium.googlesource.com/chromium/buildtools.git/+archive/\
505de88083136eefd056e5ee4ca0f01fe9b33de8.tar.gz"
"${pkgname}-${pkgver}-common.tar.gz::https://skia.googlesource.com/common.git/+archive/\
9737551d7a52c3db3262db5856e6bcd62c462b92.tar.gz"
"${pkgname}-${pkgver}-angle2.tar.gz::https://chromium.googlesource.com/angle/angle.git/+archive/\
ee07cb317579dfda40dabb5d6d9c209e0e9e0643.tar.gz"
"${pkgname}-${pkgver}-dawn.tar.gz::https://dawn.googlesource.com/dawn.git/+archive/\
604072bc2ed01018eb03bcbbf9d94042f679af63.tar.gz"
"${pkgname}-${pkgver}-dng_sdk.tar.gz::https://android.googlesource.com/platform/external/dng_sdk.git/\
+archive/c8d0c9b1d16bfda56f15165d39e0ffa360a11123.tar.gz"
"${pkgname}-${pkgver}-egl-registry.tar.gz::https://skia.googlesource.com/external/github.com/KhronosGroup\
/EGL-Registry/+archive/a0bca08de07c7d7651047bedc0b653cfaaa4f2ae.tar.gz"
"${pkgname}-${pkgver}-expat.tar.gz::https://android.googlesource.com/platform/external/expat.git/+archive/\
e5aa0a2cb0a5f759ef31c0819dc67d9b14246a4a.tar.gz"
"${pkgname}-${pkgver}-freetype.tar.gz::https://skia.googlesource.com/third_party/freetype2.git/+archive/\
0a3d2bb99b45b72e1d45185ab054efa993d97210.tar.gz"
"${pkgname}-${pkgver}-harfbuzz.tar.gz::https://chromium.googlesource.com/external/github.com/harfbuzz/\
harfbuzz.git/+archive/3a74ee528255cc027d84b204a87b5c25e47bff79.tar.gz"
"${pkgname}-${pkgver}-icu.tar.gz::https://chromium.googlesource.com/chromium/deps/icu.git/+archive/\
dbd3825b31041d782c5b504c59dcfb5ac7dda08c.tar.gz"
"${pkgname}-${pkgver}-imgui.tar.gz::https://skia.googlesource.com/external/github.com/ocornut/imgui.git\
/+archive/d38d7c6628bebd02692cfdd6fa76b4d992a35b75.tar.gz"
"${pkgname}-${pkgver}-libgifcodec.tar.gz::https://skia.googlesource.com/libgifcodec/+archive/\
38d9c73f49b861bb4a9829371ac311544b120023.tar.gz"
"${pkgname}-${pkgver}-libjpeg-turbo.tar.gz::https://skia.googlesource.com/external/github.com/libjpeg-turbo\
/libjpeg-turbo.git/+archive/574f3a772c96dc9db2c98ef24706feb3f6dbda9a.tar.gz"
"${pkgname}-${pkgver}-libpng.tar.gz::https://skia.googlesource.com/third_party/libpng.git/+archive/\
386707c6d19b974ca2e3db7f5c61873813c6fe44.tar.gz"
"${pkgname}-${pkgver}-libwebp.tar.gz::https://chromium.googlesource.com/webm/libwebp.git/+archive/\
0fe1a89dbf1930fc2554dbe76adad5d962054ead.tar.gz"
"${pkgname}-${pkgver}-lua.tar.gz::https://skia.googlesource.com/external/github.com/lua/lua.git/+archive/\
e354c6355e7f48e087678ec49e340ca0696725b1.tar.gz"
"${pkgname}-${pkgver}-microhttpd.tar.gz::https://android.googlesource.com/platform/external/libmicrohttpd\
/+archive/748945ec6f1c67b7efc934ab0808e1d32f2fb98d.tar.gz"
"${pkgname}-${pkgver}-opencl-lib.tar.gz::https://skia.googlesource.com/external/github.com/GPUOpen-Tools/\
common-lib-amd-APPSDK-3.0/+archive/4e6d30e406d2e5a65e1d65e404fe6df5f772a32b.tar.gz"
"${pkgname}-${pkgver}-opencl-registry.tar.gz::https://skia.googlesource.com/external/github.com/\
KhronosGroup/OpenCL-Registry/+archive/932ed55c85f887041291cef8019e54280c033c35.tar.gz"
"${pkgname}-${pkgver}-opengl-registry.tar.gz::https://skia.googlesource.com/external/github.com/\
KhronosGroup/OpenGL-Registry/+archive/14b80ebeab022b2c78f84a573f01028c96075553.tar.gz"
"${pkgname}-${pkgver}-piex.tar.gz::https://android.googlesource.com/platform/external/piex.git/+archive/\
bb217acdca1cc0c16b704669dd6f91a1b509c406.tar.gz"
"${pkgname}-${pkgver}-sdl.tar.gz::https://skia.googlesource.com/third_party/sdl/+archive/\
5d7cfcca344034aff9327f77fc181ae3754e7a90.tar.gz"
"${pkgname}-${pkgver}-sfntly.tar.gz::https://chromium.googlesource.com/external/github.com/googlei18n/\
sfntly.git/+archive/b55ff303ea2f9e26702b514cf6a3196a2e3e2974.tar.gz"
"${pkgname}-${pkgver}-spirv-cross.tar.gz::https://chromium.googlesource.com/external/github.com/\
KhronosGroup/SPIRV-Cross/+archive/53ab2144b90abede33be5161aec5dfc94ddc3caf.tar.gz"
"${pkgname}-${pkgver}-spirv-headers.tar.gz::https://skia.googlesource.com/external/github.com/KhronosGroup/\
SPIRV-Headers.git/+archive/29c11140baaf9f7fdaa39a583672c556bf1795a1.tar.gz"
"${pkgname}-${pkgver}-spirv-tools.tar.gz::https://skia.googlesource.com/external/github.com/KhronosGroup\
/SPIRV-Tools.git/+archive/0c4feb643b89d1792b02f7cbef315e9d95633bd7.tar.gz"
"${pkgname}-${pkgver}-swiftshader.tar.gz::https://swiftshader.googlesource.com/SwiftShader/+archive/\
430def835f9f85d52f4a96db9b715cd9a7403c9c.tar.gz"
"${pkgname}-${pkgver}-wuffs.tar.gz::https://skia.googlesource.com/external/github.com/google/wuffs.git\
/+archive/4080840928c0b05a80cda0d14ac2e2615f679f1a.tar.gz"
"${pkgname}-${pkgver}-zlib.tar.gz::https://chromium.googlesource.com/chromium/src/third_party/zlib/+archive/\
ea3ba903faac98b64b2bf8de5e98cd97b335a474.tar.gz"
"gn::https://chromium-gn.storage-download.googleapis.com/3523d50538357829725d4ed74b777a572ce0ac74"
)
_gitsrc=("${source[@]:4:29}")
noextract=("${_gitsrc[@]%%::*}")
depends=(# ~ Aseprite's direct dependencies ~
# pixman is not linked to because we use Skia instead
# harfbuzz is linked statically because Aseprite expects an older version
cmark libcurl.so libgif.so libjpeg.so zlib libpng tinyxml libfreetype.so libarchive.so
libwebp.so libwebpmux.so libwebpdemux.so
hicolor-icon-theme # For installing Aseprite's icons
# ~ Skia deps ~
# (Skia links dynamically to HarfBuzz, only Aseprite itself doesn't. >_<)
libexpat.so=1-64 libharfbuzz.so=0-64 libgl
# Already required by Aseprite: libjpeg-turbo libpng zlib freetype2
# These two are only reported by Namcap, but don't seem to be direct dependencies?
libfontconfig.so libxcursor)
makedepends=(# "Meta" dependencies
cmake ninja git python
# Aseprite (including e.g. LAF)
libxi pixman
# Skia
harfbuzz-icu)
source=("https://github.com/aseprite/aseprite/releases/download/v$pkgver/Aseprite-v$pkgver-Source.zip"
# Which branch a given build of Aseprite requires is noted in its `INSTALL.md`
"git+https://github.com/aseprite/skia.git#branch=aseprite-m81"
# `gn` executable required to configure Skia, pulled from `skia/bin/fetch-gn`
# Normally we'd use the Arch-provided one, but it has API incompatibilities
"gn::https://chromium-gn.storage-download.googleapis.com/3523d50538357829725d4ed74b777a572ce0ac74"
# Skia dependencies, determined from `skia/DEPS`
# Only pulling what we need, though
"git+https://chromium.googlesource.com/chromium/buildtools.git#commit=505de88083136eefd056e5ee4ca0f01fe9b33de8"
"git+https://skia.googlesource.com/common.git#commit=9737551d7a52c3db3262db5856e6bcd62c462b92"
"$pkgname.desktop"
# Python 3-compliant version of the script
is_clang.py
# Based on https://patch-diff.githubusercontent.com/raw/aseprite/aseprite/pull/2535.patch
shared-libarchive.patch
# Based on https://patch-diff.githubusercontent.com/raw/aseprite/aseprite/pull/2523.patch
shared-libwebp.patch
optional-pixman.patch)
noextract=("${source[0]##*/}") # Don't extract Aseprite sources at the root
sha256sums=('9f4b098fe2327f2e9d73eb9f2aeebecad63e87ff2cf6fb6eeeee3c0778bb8874'
'SKIP'
'c8c2d617f1a33d6eb27f25ebcc30bd8ba1e6a0aa980cada21dda2ad1401fa4a2'
'SKIP'
'SKIP'
'deaf646a615c79a4672b087562a09c44beef37e7acfc6f5f66a437d4f3b97a25'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP')
'cb901aaf479bcf1a2406ce21eb31e43d3581712a9ea245672ffd8fbcd9190441'
'e42675504bfbc17655aef1dca957041095026cd3dd4e6981fb6df0a363948aa7'
'9a85e9b1b52c1d33d128cb87c12395d9a245049cfc10e148659ae2acd4cab3e6'
'c2d14f9738a96a9db3695c00ac3d14b1312b6a595b151bd56e19422c86517654')
prepare() {
cd "${srcdir}"
# Extract Aseprite's sources
mkdir -p aseprite
bsdtar -xf "${noextract[0]}" -C aseprite
# Install skia deps (essentially runs git-sync-deps with the files already downloaded)
mkdir --parents --verbose skia/third_party/externals
# Symlink Skia's build dependencies
# Sort of emulating `skia/tools/git-sync-deps`, but only grabbing what we need
mkdir -p skia/third_party/externals
# Key = repo name (from above), value = path under `src/skia/`
local -A _skiadeps=([buildtools]=buildtools
[common]=common) _dep
for _dep in "${!_skiadeps[@]}"; do
ln -svfT "$(realpath $_dep)" "skia/${_skiadeps[$_dep]}"
done
chmod 755 gn
for _dep in buildtools common
do
mkdir --parents --verbose "skia/${_dep}"
tar --verbose --extract --file "${pkgname}-${pkgver}-${_dep}.tar.gz" --directory "skia/${_dep}"
done
# Replace `is_clang.py` with Python 3-compliant version
cp -v is_clang.py skia/gn
for _dep in angle2 dawn dng_sdk egl-registry expat freetype harfbuzz icu imgui opencl-registry \
libjpeg-turbo libpng libwebp lua microhttpd opencl-lib opengl-registry piex \
sdl sfntly spirv-cross spirv-headers spirv-tools swiftshader zlib wuffs
do
mkdir --parents --verbose "skia/third_party/externals/${_dep}"
tar --verbose --extract --file "${pkgname}-${pkgver}-${_dep}.tar.gz" --directory \
"skia/third_party/externals/${_dep}"
done
chmod u=rwx,g=rx,o=rx --verbose gn
mv --verbose gn skia/bin/gn
cp --verbose skia/bin/gn skia/buildtools/linux64/gn
mkdir --parents --verbose binsub
ln --force --symbolic $(which python2) binsub/python
# Allow using shared libarchive (the bundled version prevents using the `None` build type...)
env -C aseprite patch -tp1 <shared-libarchive.patch
# Allow using shared libarchive (breaks builds otherwise...)
env -C aseprite patch -tp1 <shared-libwebp.patch
# Skip the build-time dependency on Pixman since it doesn't get used in the end
env -C aseprite patch -tp1 <optional-pixman.patch
}
build() {
cd "${srcdir}"
echo Building Skia...
local _skiadir="$PWD/skia/obj"
# Must use the bundled `gn` executable and HarfBuzz libraries because of incompatibilities
# Flags can typically be found in `src/skia/gn/skia.gni`... but you're kind of on your own
env -C skia ../gn gen "$_skiadir" --args="`printf '%s ' \
is_debug=false is_official_build=true skia_enable_{skottie,pdf}=false \
skia_use_{expat,libjpeg_turbo,libwebp,xps,zlib,libgifcodec,sfntly}=false`"
ninja -C "$_skiadir" skia modules
# Build skia
_skiapath="${srcdir}/binsub:${srcdir}/depot_tools:${PATH}"
cd skia
PATH="${_skiapath}" gn gen out/Release-x64 \
--args="is_debug=false is_official_build=true skia_use_system_expat=false \
skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false \
skia_use_system_libwebp=false skia_use_system_zlib=false"
PATH="${_skiapath}" ninja -C out/Release-x64 skia modules
echo Building Aseprite...
# Suppress install messages since we install to a temporary area; `install -v` will do the job
cmake -S aseprite -B build -G Ninja -Wno-dev -DCMAKE_INSTALL_MESSAGE=NEVER -DCMAKE_BUILD_TYPE=None \
-DENABLE_UPDATER=NO -DLAF_WITH_EXAMPLES=OFF -DLAF_WITH_TESTS=OFF -DLAF_BACKEND=skia \
-DSKIA_DIR="$PWD/skia" -DSKIA_LIBRARY_DIR="$_skiadir" -DSKIA_LIBRARY="$_skiadir/libskia.a" \
-DUSE_SHARED_{CMARK,CURL,GIFLIB,JPEGLIB,ZLIB,LIBPNG,TINYXML,PIXMAN,FREETYPE,HARFBUZZ,LIBARCHIVE,WEBP}=YES
ninja -C build
}
# Build aseprite
cd "${srcdir}"
mkdir --parents --verbose build && cd build
cmake \
-DWITH_WEBP_SUPPORT=ON \
-DUSE_SHARED_CURL=ON \
-DUSE_SHARED_GIFLIB=ON \
-DUSE_SHARED_HARFBUZZ=ON \
-DUSE_SHARED_ZLIB=ON \
-DUSE_SHARED_LIBPNG=ON \
-DUSE_SHARED_TINYXML=ON \
-DUSE_SHARED_CMARK=ON \
-DENABLE_UPDATER=OFF \
-DUSE_SHARED_FREETYPE=ON \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE=Release \
-DLAF_BACKEND=skia \
-DSKIA_DIR="${srcdir}/skia" \
-DSKIA_LIBRARY_DIR="${srcdir}/skia/out/Release-x64" \
-DSKIA_LIBRARY="${srcdir}/skia/out/Release-x64/libskia.a" \
-G Ninja \
..
ninja aseprite
check() {
env -C build ctest --output-on-failure
}
package() {
cd "${srcdir}"/build
# Now the fun part: components of e.g. `libwebp` get installed as well,
# since we've had to compile it. But we don't want them.
# So, install normally, and then cherry-pick Aseprite's files out of that.
# Use a whitelist to prefer installing not enough (breakage goes noticed),
# instead of too much (cruft rarely goes noticed). Also hope that it doesn't break :)
cmake --install build --prefix=staging --strip
install -D --verbose "bin/${pkgname}" "${pkgdir}/usr/bin/${pkgname}"
# Aseprite, by default, doesn't install a few files on its own. So, they are installed manually.
install --directory --verbose "${pkgdir}/usr/share/${pkgname}/data"
cp --recursive --verbose 'bin/data' "${pkgdir}/usr/share/${pkgname}"
install --directory --verbose "${pkgdir}/usr/share/doc/${pkgname}"
cp --recursive --verbose '../docs' "${pkgdir}/usr/share/doc/${pkgname}"
install --mode=644 --verbose 'bin/data/EULA.txt' "${pkgdir}/usr/share/doc/${pkgname}"
install --mode=644 --verbose '../README.md' "${pkgdir}/usr/share/doc/${pkgname}"
install -D --mode=644 --verbose "../${pkgname}.desktop" \
"${pkgdir}/usr/share/applications/${pkgname}.desktop"
for _size in 32 48 64
do
install -D --mode=644 --verbose "../data/icons/ase${_size}.png" \
"${pkgdir}/usr/share/icons/hicolor/${_size}x${_size}/apps/${pkgname}.png"
done
install -D --mode=644 --verbose --target-directory "${pkgdir}/usr/share/licenses/${pkgname}" \
'bin/data/EULA.txt'
install --mode=644 --verbose '../docs/LICENSES.md' "${pkgdir}/usr/share/licenses/${pkgname}"
# Install the binary and its `.desktop` file
install -vDm 755 staging/bin/aseprite "$pkgdir/usr/bin/aseprite"
install -vDm 644 aseprite.desktop "$pkgdir/usr/share/applications/$pkgname.desktop"
# Install the icons in the correct directory (which is not the default)
local _size
for _size in 16 32 48 64 128 256; do
# The installed icon's name is taken from the `.desktop` file
install -vDm 644 staging/share/aseprite/data/icons/ase$_size.png "$pkgdir/usr/share/icons/hicolor/${_size}x$_size/apps/aseprite.png"
done
# Delete the icons to avoid copying them in two places (they aren't used by Aseprite itself)
rm -rf staging/share/aseprite/data/icons
# Install all of the program's data
cp -vrt "$pkgdir/usr/share" staging/share/aseprite
# Also install the licenses
install -vDm 644 -t "$pkgdir/usr/share/licenses/$pkgname" aseprite/{EULA.txt,docs/LICENSES.md}
# Copy the font's license, but leave it in the font directory as well (probably doesn't hurt)
install -vm 644 aseprite/data/fonts/LICENSE.txt "$pkgdir/usr/share/licenses/$pkgname/font.txt"
}
# vim:set ts=2 sw=2 et: