Files
gtk-ahfail/meson.build
T
Asger Geel Weirsøe b71eb201b6 Add a disclaimer to the PKGBUILD and build the locker on Linux only
The PKGBUILD states what the package is: a real screen locker provided
as is, and parody media from Jurassic Park that the AGPL does not cover.
The ahfail command has only been tested on Linux, so macOS builds keep
the PAM hook and skip it; the README no longer promises it there.

Claude-Session: https://claude.ai/code/session_012LCTmU2ewo8tnM1dByYAoG
2026-09-30 20:03:00 +02:00

110 lines
3.8 KiB
Meson

project(
'ahfail',
['c', 'rust'],
version: '0.10.0',
meson_version: '>=1.3.0',
default_options: ['warning_level=3', 'c_std=c11']
)
ahfail_inc = include_directories('include')
cc = meson.get_compiler('c')
m_dep = cc.find_library('m', required : false)
gtk_dep = dependency('gtk+-3.0')
gstplayer_dep = dependency('gstreamer-player-1.0')
gnome = import('gnome')
resources = gnome.compile_resources(
'ahfail-resources',
'assets/ahfail.gresource.xml',
source_dir: 'assets',
c_name: 'ahfail'
)
# All Rust artefacts come from ONE cargo invocation with one target directory.
# Four separate builds with four target directories compiled the whole GTK and
# GStreamer binding stack four times over (about an hour for a package build).
#
# -Dupdate_check=false (distro packages) builds without the ahfail-ui feature
# `update-check`, so the binaries never ask Gitea for new releases and the HTTP
# client is not compiled in at all.
cargo_features = get_option('update_check') ? '' : '--no-default-features'
# The ahfail command is the Linux locker (Wayland/X11 + its own PAM service).
# macOS keeps the PAM hook and is built without it until it has been tested there.
is_linux = host_machine.system() == 'linux'
cargo_pkgs = '-p ahfail-gtklock -p ahfail-pam -p ahfail-display' + (is_linux ? ' -p ahfail' : '')
cargo_outputs = ['libahfail_module.a', 'libahfail_pam.so', 'ahfail-display'] + (is_linux ? ['ahfail'] : [])
cargo_install_dirs = [false, get_option('libdir') / 'ahfail', get_option('libdir') / 'ahfail'] + (is_linux ? [get_option('bindir')] : [])
cargo_copy = (' && cp "@OUTDIR@/target/release/libahfail_module.a" "@OUTPUT0@"'
+ ' && cp "@OUTDIR@/target/release/libahfail_pam.so" "@OUTPUT1@"'
+ ' && cp "@OUTDIR@/target/release/ahfail-display" "@OUTPUT2@"'
+ (is_linux ? ' && cp "@OUTDIR@/target/release/ahfail" "@OUTPUT3@"' : ''))
cargo_all = custom_target(
'ahfail-cargo-build',
input: ['Cargo.toml', 'Cargo.lock'],
output: cargo_outputs,
command: [
'sh', '-c',
# The PAM module's build.rs needs the absolute libdir to know where
# ahfail-display is installed; get_option('libdir') alone is relative.
'AHFAIL_LIBDIR=' + get_option('prefix') / get_option('libdir')
+ ' cargo build --release --locked'
+ ' ' + cargo_pkgs + ' ' + cargo_features
+ ' --target-dir "@OUTDIR@/target"'
+ cargo_copy
],
build_by_default: true,
build_always_stale: true, # cargo decides what is out of date, not meson
install: true,
# module archive: linked below, not installed; PAM module + display binary:
# libdir/ahfail; the ahfail command: bindir.
install_dir: cargo_install_dirs,
install_mode: 'rwxr-xr-x'
)
cargo_target = cargo_all[0]
pam_cargo = cargo_all[1]
# The locker's own PAM service. Shipped as its own file, like swaylock and
# gtklock do, so no other package's PAM configuration is ever touched.
if is_linux
install_data('data/pam.d/ahfail',
install_dir: get_option('sysconfdir') / 'pam.d',
install_mode: 'rw-r--r--'
)
endif
libahfail = shared_library(
'ahfail-module',
resources,
link_args: ['-Wl,--whole-archive', meson.current_build_dir() / 'libahfail_module.a', '-Wl,--no-whole-archive'],
link_depends: cargo_target,
include_directories: ahfail_inc,
dependencies: [gtk_dep, gstplayer_dep, m_dep],
install: true,
install_dir: get_option('libdir') / 'gtklock',
name_prefix: ''
)
smoke = executable(
'module_smoke_test',
'tests/module_test.c',
include_directories: ahfail_inc,
link_with: libahfail,
dependencies: [gtk_dep, gstplayer_dep]
)
test('module symbols', smoke)
# PAM module smoke test: dlopen libahfail_pam.so and verify pam_sm_authenticate is exported.
pam_smoke = executable(
'pam_smoke_test',
'tests/pam_smoke_test.c',
dependencies: [cc.find_library('dl', required: true)]
)
test('pam symbols', pam_smoke,
args: [meson.current_build_dir() / 'libahfail_pam.so'],
depends: pam_cargo)