File mullvadvpn.spec of Package mullvadvpn
#
# spec file for package mullvadvpn
#
%define ver 2025.9
%define srcext tar.zst
Name: mullvadvpn
Summary: Privacy is a universal right
License: GPL-3.0-only
Group: Productivity/Networking/Security
Url: https://mullvad.net/
Version: %{ver}
Release: 0
Source0: mullvadvpn-app-%{ver}.%{srcext}
# cargo run --bin relay_list --release > relays.json
Source1: relays.json
# pushd wireguard-go-rs/libwg; go mod vendor; tar czvf wireguard-vendor.tar.gz vendor
Source2: wireguard-vendor.tar.gz
# cargo vendor; tar czvf mullvadvpn-app-vendor.tar.gz vendor
Source3: mullvadvpn-app-vendor.tar.gz
# Gui app
Source4: MullvadVPN-%{ver}_x86_64.rpm
# RPM Sig
Source5: MullvadVPN-%{ver}_x86_64.rpm.asc
# cargo vendoring config
Source6: cargo-config
Patch1: 0001-commit-date.patch
# buildrequires
BuildRequires: rpm
BuildRequires: cpio
BuildRequires: rust
BuildRequires: cargo
BuildRequires: go1.21
BuildRequires: nodejs
BuildRequires: npm-default
BuildRequires: dbus-1-devel
BuildRequires: libmnl-devel
BuildRequires: libnftnl-devel
BuildRequires: protobuf-devel
# GUI app build requirements
BuildRequires: zsh
BuildRequires: fish
BuildRequires: hicolor-icon-theme
%description
You have a right to privacy.
In a society increasingly determined to erode that right, a fast, trustworthy and easy-to-use VPN is a good first step toward reclaiming it.
%prep
%autosetup -n mullvadvpn-app-%{ver} -p2
echo "Copying relays file..."
# update relay
cp %{S:1} dist-assets/relays.json
# decompress wireguard vendor
tar xzvf %{S:2} -C wireguard-go-rs/libwg
# add softlink to maybenot
pushd wireguard-go-rs/libwg/vendor/golang.zx2c4.com/wireguard/
ln -s ../../../wireguard-go/maybenot .
ln -s ../../../wireguard-go/maybenot-ffi .
popd
# decompress mullvadvpn vendor
tar xzvf %{S:3} -C "$PWD"
# decompress gui app
rpm -K --nosignature %{S:4}
mkdir ../guiapp; pushd ../guiapp
rpm2cpio %{S:4} | cpio -idmv
popd
# setup cargo vendoring home
mkdir cargo-home
cp %{S:6} cargo-home/config
%build
RUSTC_VERSION=$(rustc --version)
PRODUCT_VERSION=$(node -p "require('./gui/package.json').version" | sed -Ee 's/\.0//g')
BUILD_MODE="release"
HOST="x86_64-unknown-linux-gnu"
ENV_TARGET=$HOST
MULLVAD_ADD_MANIFEST="1"
# echo "Updating version in metadata files..."
# ./version-metadata.sh inject "$PRODUCT_VERSION" --desktop
echo "Building Mullvad VPN $PRODUCT_VERSION"
################################################################################
# Compile wireguard-go (vendored)
################################################################################
# TARGET=x86_64-unknown-linux-gnu GO_NO_VENDOR_CHECKS=1 bash ./wireguard-go-rs/build-wireguard-go.sh
pushd ./wireguard-go-rs
ln -s ../vendor .
CARGO_HOME="$PWD/../cargo-home" TARGET=x86_64-unknown-linux-gnu GO_NO_VENDOR_CHECKS=1 cargo build --release
popd
echo "Building Rust code in release mode using $RUSTC_VERSION..."
CARGO_HOME="$PWD/cargo-home" cargo build --release
%install
CARGO_TARGET_DIR=${CARGO_TARGET_DIR:-"target"}
BINARIES=(
mullvad-daemon
mullvad
)
BIN_BINARIES=(
mullvad
mullvad-daemon
)
DIST_ASSETS=(
relays.json
ca.crt
)
################################################################################
# Move files to correct locations buildroot
################################################################################
install -d %{buildroot}%{_libdir}/mullvadvpn/resources/
for binary in ${BINARIES[*]}; do
SRC="$CARGO_TARGET_DIR/release/$binary"
DST="%{buildroot}%{_libdir}/mullvadvpn/resources/$binary"
strip "$SRC" -o "$DST"
chmod 755 "$DST"
done
for asset in ${DIST_ASSETS[*]}; do
SRC="dist-assets/$asset"
DST="%{buildroot}%{_libdir}/mullvadvpn/resources/$asset"
install -m644 "$SRC" "$DST"
done
sed -i 's,/opt/Mullvad\\x20VPN/resources,%{_libdir}/mullvadvpn/resources,' \
dist-assets/linux/mullvad-daemon.service
install -Dm644 dist-assets/linux/mullvad-daemon.service \
"%{buildroot}%{_unitdir}/mullvad-daemon.service"
# Install bin soft links
install -d %{buildroot}%{_bindir}
for binary in ${BIN_BINARIES[*]}; do
ln -s %{_libdir}/mullvadvpn/resources/$binary %{buildroot}%{_bindir}/$binary
done
################################################################################
# Install GUI Application
################################################################################
pushd ../guiapp
mv "opt/Mullvad VPN" "opt/mullvadvpn"
install -Dm755 opt/mullvadvpn/*.* %{buildroot}%{_libdir}/mullvadvpn
install -Dm755 opt/mullvadvpn/mullvad* %{buildroot}%{_libdir}/mullvadvpn
install -Dm755 opt/mullvadvpn/chrome_crashpad_handler %{buildroot}%{_libdir}/mullvadvpn
install -Dm755 opt/mullvadvpn/chrome-sandbox %{buildroot}%{_libdir}/mullvadvpn
install -Dm644 opt/mullvadvpn/resources/app.asar %{buildroot}%{_libdir}/mullvadvpn/resources/app.asar
install -Dm755 opt/mullvadvpn/resources/openvpn %{buildroot}%{_libdir}/mullvadvpn/resources/openvpn
cp -r opt/mullvadvpn/locales %{buildroot}%{_libdir}/mullvadvpn
sed -i 's,/opt/Mullvad VPN/mullvad-vpn,%{_libdir}/mullvadvpn/mullvad-vpn,' \
usr/share/applications/mullvad-vpn.desktop
sed -i '/^Exec/ s/$/ --ozone-platform=wayland --enable-features=WaylandWindowDecorations /' \
usr/share/applications/mullvad-vpn.desktop
# Install GUI desktop files and icons
cp -r usr/share %{buildroot}/usr
popd
%pre
%service_add_pre mullvad-daemon.service
%post
%service_add_post mullvad-daemon.service
%preun
%service_del_preun mullvad-daemon.service
%postun
%service_del_postun mullvad-daemon.service
%files
%defattr(-,root,root,755)
%{_libdir}/mullvadvpn
%{_bindir}/mullvad
%{_bindir}/mullvad-daemon
%{_unitdir}/mullvad-daemon.service
%{_datadir}/applications/mullvad-vpn.desktop
%{_datadir}/icons/hicolor/*/apps/mullvad-vpn.png
%{_datadir}/bash-completion/completions/mullvad
%{_datadir}/fish/vendor_completions.d/mullvad.fish
%{_datadir}/zsh/site-functions/_mullvad
%{_datadir}/icons/hicolor/1024x1024
%ghost /var/log/mullvad-vpn