# Copyright (C) Canonical Ltd. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License version 3, as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . name: thunderbird version: "147.0.1-1" summary: Mozilla Thunderbird email application description: | Thunderbird is a free email application that’s easy to set up and customize - and it’s loaded with great features! The latest track for this snap provides the recommended upstream experience. The esr track contains only extended supported releases. The monthly track contains only releases of the monthly cadence cycle. Read more about Thunderbird channels at https://developer.thunderbird.net/releases/channels. confinement: strict grade: stable base: core24 compression: lzo contact: https://www.thunderbird.net/contact/ donation: https://www.thunderbird.net/donate/ issues: https://bugzilla.mozilla.org/enter_bug.cgi?product=Thunderbird&op_sys=Linux&keywords=snap website: https://www.thunderbird.net/ apps: thunderbird: command-chain: [ bin/gpg-shim ] command: thunderbird.launcher extensions: [gnome] environment: DICPATH: "$SNAP_COMMON/snap-hunspell" GTK_USE_PORTAL: 1 HOME: "$SNAP_USER_COMMON" plugs: - avahi-observe - browser-sandbox - camera - cups-control - gsettings - gpg-keys - home - host-usr-share-hunspell - kerberos-tickets - network - network-control - opengl - pcscd - audio-playback - removable-media - u2f-devices slots: - dbus-daemon plugs: browser-sandbox: interface: browser-support allow-sandbox: true etc-thunderbird: interface: system-files read: [/etc/thunderbird] dot-thunderbird: interface: personal-files write: [$HOME/.thunderbird] host-usr-share-hunspell: interface: system-files read: [/var/lib/snapd/hostfs/usr/share/hunspell] layout: /usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/opensc-pkcs11.so: bind-file: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/opensc-pkcs11.so parts: # This is a temporary workaround to including the hunspell content # snap, which would cause breakage in the Ubuntu desktop image build # because of the Ubuntu policy. See: # https://bugzilla.mozilla.org/show_bug.cgi?id=1792006 # # The definition of this part is essentially a copy of the # corresponding part in hunspell-dictionaries-1-7-2004 by # Buo-ren, Lin. hunspell: plugin: nil override-pull: | set -eux mkdir -p $CRAFT_PART_INSTALL apt download $(apt-cache search '^hunspell-.*$' | awk '!/myspell|dbgsym|tools|transitional|dependency/{printf "%s ", $1}') find . -name "*.deb" -exec dpkg-deb -x {} "$CRAFT_PART_INSTALL" \; prime: - usr/share/hunspell rust: plugin: nil build-packages: - wget override-pull: | # Do not use rustup to work around https://forum.snapcraft.io/t/armhf-builds-on-launchpad-timing-out/31008 REQUIRED_RUST_VERSION=1.82.0 ROOT=https://static.rust-lang.org/dist/rust-$REQUIRED_RUST_VERSION if [ $CRAFT_ARCH_BUILD_FOR = "amd64" ]; then BINARIES_SUFFIX=x86_64-unknown-linux-gnu elif [ $CRAFT_ARCH_BUILD_FOR = "armhf" ]; then BINARIES_SUFFIX=armv7-unknown-linux-gnueabihf elif [ $CRAFT_ARCH_BUILD_FOR = "arm64" ]; then BINARIES_SUFFIX=aarch64-unknown-linux-gnu elif [ $CRAFT_ARCH_BUILD_FOR = "riscv64" ]; then BINARIES_SUFFIX=riscv64gc-unknown-linux-gnu fi wget -O - $ROOT-$BINARIES_SUFFIX.tar.gz | tar -x -z --strip-components=1 ./install.sh --prefix=/usr --destdir=$CRAFT_STAGE override-prime: '' # For thunderbird beta, the dump-syms git informations is pulled from the # mozilla-beta trees, because there seems to be no mozilla/ in the beta tree, dump-syms: plugin: nil after: - rust build-packages: - curl - git - jq - python3-yaml override-pull: | if [ $CRAFT_ARCH_BUILD_FOR = "amd64" ] || [ $CRAFT_ARCH_BUILD_FOR = "arm64" ]; then VERSION=$(craftctl get version | cut -d- -f1) BUILD=$(craftctl get version | cut -d- -f2) TBINFO=$(curl -s https://ftp.mozilla.org/pub/thunderbird/candidates/$VERSION-candidates/build$BUILD/linux-x86_64/en-US/thunderbird-$VERSION.json) TB_SOURCE_REPO=$(echo $TBINFO | jq -r .moz_source_repo) TB_SOURCE_STAMP=$(echo $TBINFO | jq -r .moz_source_stamp) GECKO_REV=$TB_SOURCE_REPO/raw-file/${TB_SOURCE_STAMP}/.gecko_rev.yml GECKO_REVS=$(curl -sSL "${GECKO_REV}" | grep -v "#") MOZ_SOURCE_REPO=$(echo "$GECKO_REVS" | grep GECKO_HEAD_REPOSITORY | sed -e 's/GECKO_HEAD_REPOSITORY: //g') MOZ_SOURCE_STAMP=$(echo "$GECKO_REVS" | grep GECKO_HEAD_REV | sed -e 's/GECKO_HEAD_REV: //g') FETCHES=$MOZ_SOURCE_REPO/raw-file/$MOZ_SOURCE_STAMP/taskcluster/kinds/fetch/toolchains.yml TOOLCHAINS=$(curl -sSL "${FETCHES}") unset PYTHONPATH REPO=$(echo "${TOOLCHAINS}" | /usr/bin/python3 -c 'import yaml, sys; fetches = yaml.safe_load(sys.stdin); print("{}".format(fetches["dump-syms"]["fetch"]["repo"]))') SHA1=$(echo "${TOOLCHAINS}" | /usr/bin/python3 -c 'import yaml, sys; fetches = yaml.safe_load(sys.stdin); print("{}".format(fetches["dump-syms"]["fetch"]["revision"]))') git clone "${REPO}" . && git checkout "${SHA1}" fi override-build: | craftctl default if [ $CRAFT_ARCH_BUILD_FOR = "amd64" ] || [ $CRAFT_ARCH_BUILD_FOR = "arm64" ]; then $CRAFT_STAGE/usr/bin/cargo build --release mkdir -p $CRAFT_STAGE/usr/bin/ cp target/release/dump_syms $CRAFT_STAGE/usr/bin/ fi cbindgen: plugin: nil after: - rust override-build: | craftctl default cargo install cbindgen override-prime: '' mozconfig: plugin: nil override-stage: | cp $CRAFT_PROJECT_DIR/mozconfig.in $CRAFT_STAGE/mozconfig override-prime: '' # Launchpad builders have a timeout for how long they are allowed to access # the internet (through a proxy) starting from the start of the build. # Since the thunderbird part takes a long time to build, we need to ensure # that all other parts that need to access the internet (to e.g. fetch build # or stage packages) are built before it (before the proxy authentication is # revoked). thunderbird: plugin: nil after: - cbindgen - distribution - dump-syms - mozconfig - rust - thunderbird-langpacks build-packages: - cargo - clang-20 - cmake - coreutils - file - git - libasound2-dev - libclang-20-dev - libdbus-glib-1-dev - llvm-20-dev - libpython3-dev - libx11-xcb-dev - libxt-dev - m4 - make - nasm - nodejs - quilt - rustc - unzip - wget - xvfb - zip build-environment: - RUST_BACKTRACE: "full" - CARGO_PROFILE_RELEASE_BUILD_OVERRIDE_DEBUG: "true" - NSS_DIR: "/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR" override-pull: | VERSION=$(craftctl get version | cut -d- -f1) BUILD=$(craftctl get version | cut -d- -f2) ROOT=https://ftp.mozilla.org/pub/thunderbird/candidates/$VERSION-candidates/build$BUILD wget -O - $ROOT/source/thunderbird-$VERSION.source.tar.xz | tar -x --xz --strip-components=1 mkdir -p $CRAFT_STAGE/debug-symbols cp toolkit/crashreporter/tools/upload_symbols.py $CRAFT_STAGE/debug-symbols/ # Remove .gitmodules from Cargo checksums. # https://bugzilla.mozilla.org/show_bug.cgi?id=2006630 find . -name '.cargo-checksum.json' -exec sh -c ' for f; do cp "$f" "$f.bak" jq . "$f.bak" | grep -vF .gitmodules > "$f" done ' _ {} + || : override-build: | craftctl default export PATH=$CRAFT_STAGE/usr/bin:/usr/lib/llvm-20/bin/:$PATH export MOZCONFIG="$CRAFT_STAGE/mozconfig" QUILT_PATCHES=$CRAFT_PROJECT_DIR/patches quilt push -a GNOME_SDK_SNAP=/snap/gnome-46-2404-sdk/current # XXX: Remove when the SDK finally builds reliably in Risc-V again. if [ $CRAFT_ARCH_BUILD_FOR = "riscv64" ]; then snap refresh --edge gnome-46-2404-sdk fi if [ $CRAFT_ARCH_BUILD_FOR = "amd64" ]; then # "clang -dumpmachine" returns "x86_64-unknown-linux-gnu" on # amd64 (at least the binaries they distribute), but what we # really need is "x86_64-pc-linux-gnu"; so let's hard-code it. export TARGET_TRIPLET="x86_64-pc-linux-gnu" else export TARGET_TRIPLET=$(clang-20 -dumpmachine) fi if [ $CRAFT_ARCH_BUILD_FOR != "riscv64" ]; then BUILD_DBGSYMS=true echo "ac_add_options --enable-crashreporter" >> $MOZCONFIG echo "ac_add_options --enable-debug-symbols" >> $MOZCONFIG else # Crash reporter does not build in Risc-V: # https://bugzilla.mozilla.org/show_bug.cgi?id=1980339 BUILD_DBGSYMS=false echo "ac_add_options --disable-debug-symbols" >> $MOZCONFIG fi export LDFLAGS="-Wl,-rpath-link=$GNOME_SDK_SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_ON -Wl,-rpath-link=$GNOME_SDK_SNAP/usr/lib" export LDFLAGS="-Wl,-rpath-link=$CRAFT_PART_BUILD/obj-$TARGET_TRIPLET/dist/bin${LDFLAGS:+ $LDFLAGS}" export LD_LIBRARY_PATH="$CRAFT_PART_BUILD/obj-$TARGET_TRIPLET/dist/bin${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" export MOZBUILD_STATE_PATH=$CRAFT_PART_BUILD/.mozbuild unset PYTHONPATH if [ $CRAFT_ARCH_BUILD_FOR = "amd64" ]; then # Needed for PGO-enabled builds that execute the built binaries. This should mirror the link paths in $LDFLAGS. export LD_LIBRARY_PATH="$GNOME_SDK_SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_ON:$GNOME_SDK_SNAP/usr/lib" # Ensure the instrumented binary is run against the right version of libssl3.so and libnss3.so # (locally-built versions are more recent than the ones in the gnome platform snap) export LD_LIBRARY_PATH="$CRAFT_PART_BUILD/obj-$TARGET_TRIPLET/instrumented/dist/bin${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" fi MACH="/usr/bin/python3 ./mach" $MACH configure --prefix=$CRAFT_PART_INSTALL/usr $MACH uniffi generate # workaround for https://bugzilla.mozilla.org/1797714 $MACH build -j$CRAFT_PARALLEL_BUILD_COUNT $MACH install DISTRIBUTION=$CRAFT_PART_INSTALL/usr/lib/thunderbird/distribution mkdir -p $DISTRIBUTION/extensions mkdir -p $CRAFT_PART_INSTALL/bin/ cp -p $CRAFT_PROJECT_DIR/gpg-shim $CRAFT_PART_INSTALL/bin/ cp -pr $CRAFT_PART_SRC/* $CRAFT_PART_INSTALL if [ $BUILD_DBGSYMS = "true" ]; then DUMP_SYMS=$CRAFT_STAGE/usr/bin/dump_syms $MACH buildsymbols cp obj-*/dist/thunderbird-*.crashreporter-symbols.zip $CRAFT_STAGE/debug-symbols/ fi override-stage: | # Workaround for LP: #2016358: create mount points for the gnome # content interface, while a proper fix is implemented in snapd. # Thanks to James Henstridge. mkdir $CRAFT_PART_INSTALL/{gnome-platform,data-dir,data-dir/{icons,sounds,themes}} craftctl default stage-packages: - opensc-pkcs11 prime: - bin - usr/lib/thunderbird - usr/lib/*/opensc-pkcs11.so - usr/lib/*/pkcs11/opensc-pkcs11.so # Workaround for LP: #2016358 (see the 'override-stage' above). - gnome-platform - data-dir/icons - data-dir/sounds - data-dir/themes thunderbird-langpacks: plugin: nil build-packages: - coreutils - sed - wget override-pull: | VERSION=$(craftctl get version | cut -d- -f1) BUILD=$(craftctl get version | cut -d- -f2) SERVER=https://ftp.mozilla.org ROOT=$SERVER/pub/thunderbird/candidates/$VERSION-candidates/build$BUILD XPIS=$(wget -O - $ROOT/linux-x86_64/xpi/ | sed -n 's/.* href="\(.*\.xpi\)".*/\1/p') for XPI in $XPIS; do wget $SERVER$XPI done override-prime: | INSTALLDIR=$CRAFT_PRIME/usr/lib/thunderbird/distribution/extensions mkdir -p $INSTALLDIR for XPI in $(ls $CRAFT_PART_SRC/*.xpi); do LANGCODE=$(basename $XPI .xpi) mkdir $INSTALLDIR/locale-$LANGCODE cp $XPI $INSTALLDIR/locale-$LANGCODE/langpack-$LANGCODE@thunderbird.mozilla.org.xpi done # Needed for smart card access gnupg: plugin: nil stage-packages: - gnupg - gnupg-agent - libgpgme11t64 - libgpg-error0 override-prime: | craftctl default # Fixes smart card key retrieval. Check LP: #2009825 and special thanks to # https://forum.snapcraft.io/t/thunderbird-snap-and-external-gnupg-for-smart-cards/39553 mv $CRAFT_PRIME/usr/bin/gpg $CRAFT_PRIME/usr/bin/real-gpg cp $CRAFT_PROJECT_DIR/gpg-wrapper $CRAFT_PRIME/usr/bin/gpg distribution: plugin: nil override-prime: | mkdir -p "$CRAFT_PRIME/usr/lib/thunderbird" cp -Rv "$CRAFT_PROJECT_DIR/distribution" "$CRAFT_PRIME/usr/lib/thunderbird" thunderbird-staged: plugin: nil stage-packages: - desktop-file-utils - libblkid1 - libcurl4 # Needed for the crash reporter (LP: #1983502) - libgcrypt20 - liblzma5 - libudev1 - libuuid1 - zlib1g - liblz4-1 - libxt6 prime: - -usr/lib/*/libgio* - -usr/lib/*/libglib* - -usr/lib/*/libgm* debug-symbols: plugin: nil build-packages: - python3 - python3-virtualenv after: - thunderbird override-build: | export SYMBOLS_ARCHIVE=$(find $CRAFT_STAGE/debug-symbols/ -type f -name "thunderbird-*.crashreporter-symbols.zip") if [ -f "$SYMBOLS_ARCHIVE" ]; then cp $SYMBOLS_ARCHIVE $CRAFT_PROJECT_DIR/$CRAFT_PROJECT_NAME_$(craftctl get version)_$CRAFT_ARCH_BUILD_FOR.debug fi launcher: plugin: nil override-prime: | cp "$CRAFT_PROJECT_DIR/thunderbird.launcher" "$CRAFT_PRIME/" cp "$CRAFT_PROJECT_DIR/patch-default-profile.py" "$CRAFT_PRIME/" # Find files provided by the base and platform snap and ensure they aren't # duplicated in this snap cleanup: after: [thunderbird] plugin: nil build-snaps: [core24, gnome-46-2404] override-prime: | set -eux for snap in "core24" "gnome-46-2404"; do cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$CRAFT_PRIME/{}" \; done slots: dbus-daemon: interface: dbus bus: session name: org.mozilla.thunderbird hooks: post-refresh: plugs: [host-usr-share-hunspell]