diff --git a/meson.build b/meson.build index 917695d..793a9df 100644 --- a/meson.build +++ b/meson.build @@ -20,24 +20,25 @@ resources = gnome.compile_resources( 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" && cp "@OUTDIR@/target/release/libahfail_module.a" "@OUTPUT@"' + '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 resources needed, Cargo self-contained) +# 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', - 'cargo build --release -p ahfail-pam --target-dir "@OUTDIR@/target" && cp "@OUTDIR@/target/release/libahfail_pam.so" "@OUTPUT@"' + '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, @@ -45,14 +46,14 @@ pam_cargo = custom_target( install_mode: 'rwxr-xr-x' ) -# Display binary (embeds GResources via its own build.rs) +# 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" && cp "@OUTDIR@/target/release/ahfail-display" "@OUTPUT@"' + '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, @@ -81,3 +82,12 @@ smoke = executable( ) 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]]) diff --git a/tests/pam_smoke_test.c b/tests/pam_smoke_test.c new file mode 100644 index 0000000..82c1ec4 --- /dev/null +++ b/tests/pam_smoke_test.c @@ -0,0 +1,18 @@ +#include +#include + +int main(int argc, char *argv[]) { + if (argc < 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + void *lib = dlopen(argv[1], RTLD_NOW); + if (!lib) { fprintf(stderr, "dlopen: %s\n", dlerror()); return 1; } + if (!dlsym(lib, "pam_sm_authenticate")) { + fprintf(stderr, "pam_sm_authenticate not found\n"); + dlclose(lib); + return 1; + } + dlclose(lib); + return 0; +}