diff --git a/Cargo.lock b/Cargo.lock index 08ec019..6587802 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "ahfail" -version = "0.10.1" +version = "0.10.2" dependencies = [ "ahfail-ui", "cc", diff --git a/crates/ahfail/Cargo.toml b/crates/ahfail/Cargo.toml index 8976d76..5a78232 100644 --- a/crates/ahfail/Cargo.toml +++ b/crates/ahfail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ahfail" -version = "0.10.1" +version = "0.10.2" edition = "2021" description = "Screen locker that says ah ah ah when you get the password wrong" license = "AGPL-3.0-only" diff --git a/meson.build b/meson.build index c1c3922..2ed3158 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'ahfail', ['c', 'rust'], - version: '0.10.1', + version: '0.10.2', meson_version: '>=1.3.0', default_options: ['warning_level=3', 'c_std=c11'] ) @@ -9,17 +9,7 @@ project( 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' -) +is_linux = host_machine.system() == 'linux' # All Rust artefacts come from ONE cargo invocation with one target directory. # Four separate builds with four target directories compiled the whole GTK and @@ -30,19 +20,29 @@ resources = gnome.compile_resources( # 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')] : []) +# Linux builds everything: the ahfail locker, the gtklock module (Wayland), the +# PAM hook and its display binary. macOS only has the PAM hook + display binary: +# gtklock and the locker are Linux-only, and the module's GNU-ld link flags do +# not exist on macOS. # Cargo names a cdylib .dylib on macOS. The installed name stays # libahfail_pam.so: PAM loads the module by path, whatever the extension. pam_built = host_machine.system() == 'darwin' ? 'libahfail_pam.dylib' : 'libahfail_pam.so' -cargo_copy = (' && cp "@OUTDIR@/target/release/libahfail_module.a" "@OUTPUT0@"' - + ' && cp "@OUTDIR@/target/release/' + pam_built + '" "@OUTPUT1@"' - + ' && cp "@OUTDIR@/target/release/ahfail-display" "@OUTPUT2@"' - + (is_linux ? ' && cp "@OUTDIR@/target/release/ahfail" "@OUTPUT3@"' : '')) +if is_linux + cargo_pkgs = '-p ahfail-gtklock -p ahfail-pam -p ahfail-display -p ahfail' + cargo_outputs = ['libahfail_module.a', 'libahfail_pam.so', 'ahfail-display', 'ahfail'] + # module archive: linked below, not installed; PAM hook + display: libdir/ahfail; locker: bindir. + cargo_install_dirs = [false, get_option('libdir') / 'ahfail', get_option('libdir') / 'ahfail', 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@"' + + ' && cp "@OUTDIR@/target/release/ahfail" "@OUTPUT3@"') +else + cargo_pkgs = '-p ahfail-pam -p ahfail-display' + cargo_outputs = ['libahfail_pam.so', 'ahfail-display'] + cargo_install_dirs = [get_option('libdir') / 'ahfail', get_option('libdir') / 'ahfail'] + cargo_copy = (' && cp "@OUTDIR@/target/release/' + pam_built + '" "@OUTPUT0@"' + + ' && cp "@OUTDIR@/target/release/ahfail-display" "@OUTPUT1@"') +endif cargo_all = custom_target( 'ahfail-cargo-build', @@ -61,13 +61,10 @@ cargo_all = custom_target( 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] +pam_cargo = is_linux ? cargo_all[1] : cargo_all[0] # 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. @@ -78,33 +75,46 @@ if is_linux ) 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: '' -) +if is_linux + m_dep = cc.find_library('m', required : false) + gtk_dep = dependency('gtk+-3.0') + gstplayer_dep = dependency('gstreamer-player-1.0') + resources = import('gnome').compile_resources( + 'ahfail-resources', + 'assets/ahfail.gresource.xml', + source_dir: 'assets', + c_name: 'ahfail' + ) -smoke = executable( - 'module_smoke_test', - 'tests/module_test.c', - include_directories: ahfail_inc, - link_with: libahfail, - dependencies: [gtk_dep, gstplayer_dep] -) + # The gtklock module (Wayland): the Rust staticlib linked whole into a .so. + 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_all[0], + include_directories: ahfail_inc, + dependencies: [gtk_dep, gstplayer_dep, m_dep], + install: true, + install_dir: get_option('libdir') / 'gtklock', + name_prefix: '' + ) -test('module symbols', smoke) + 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) +endif # 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)] + dependencies: [cc.find_library('dl', required: false)] # part of libSystem on macOS ) test('pam symbols', pam_smoke,