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
openSUSE Build Service is sponsored by