project( 'ahfail', ['c', 'rust'], version: '0.1.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' ) # Each cargo target uses its own --target-dir to avoid parallel lock contention. cargo_target = custom_target( 'ahfail-cargo-build', input: ['crates/ahfail-gtklock/src/lib.rs', 'Cargo.toml'], output: ['libahfail_module.a'], command: [ 'sh', '-c', 'cargo build --release -p ahfail-gtklock --target-dir "@OUTDIR@/target-gtklock" && cp "@OUTDIR@/target-gtklock/release/libahfail_module.a" "@OUTPUT@"' ], build_by_default: true ) # PAM module (.so with C ABI — no GResources needed, Cargo self-contained via build.rs) pam_cargo = custom_target( 'ahfail-pam-cargo-build', input: ['crates/ahfail-pam/src/lib.rs', 'Cargo.toml'], output: ['libahfail_pam.so'], command: [ 'sh', '-c', # Pass libdir so build.rs emits the correct AHFAIL_INSTALL_DIR (needed for multiarch). 'AHFAIL_LIBDIR=' + get_option('libdir') + ' cargo build --release -p ahfail-pam --target-dir "@OUTDIR@/target-pam" && cp "@OUTDIR@/target-pam/release/libahfail_pam.so" "@OUTPUT@"' ], build_by_default: true, install: true, install_dir: get_option('libdir') / 'ahfail', install_mode: 'rwxr-xr-x' ) # Display binary (embeds GResources via its own build.rs using glib-compile-resources) display_cargo = custom_target( 'ahfail-display-cargo-build', input: ['crates/ahfail-display/src/main.rs', 'Cargo.toml'], output: ['ahfail-display'], command: [ 'sh', '-c', 'cargo build --release -p ahfail-display --target-dir "@OUTDIR@/target-display" && cp "@OUTDIR@/target-display/release/ahfail-display" "@OUTPUT@"' ], build_by_default: true, install: true, install_dir: get_option('libdir') / 'ahfail', install_mode: 'rwxr-xr-x' ) 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: [pam_cargo[0]])