]> git.proxmox.com Git - proxmox-perl-rs.git/blob - Proxmox/Lib/template.pm
9eb10cfbe4b2c61bddedaf3bda2b8921c15ee153
[proxmox-perl-rs.git] / Proxmox / Lib / template.pm
1 package Proxmox::Lib::{{PRODUCT}};
2
3 =head1 NAME
4
5 Proxmox::Lib::{{PRODUCT}} - base module for {{PRODUCT}} rust bindings
6
7 =head1 SYNOPSIS
8
9 package {{PRODUCT}}::RS::SomeBindings;
10
11 use base 'Proxmox::Lib::{{PRODUCT}}';
12
13 BEGIN { __PACKAGE__->bootstrap(); }
14
15 1;
16
17 =head1 DESCRIPTION
18
19 This is the base module of all {{PRODUCT}} bindings.
20 Its job is to ensure the 'lib{{LIBRARY}}.so' library is loaded and provide a 'bootstrap' class
21 method to load the actual code.
22
23 =cut
24
25 use DynaLoader;
26
27 sub library {
28 return '{{LIBRARY}}';
29 }
30
31 # Keep on a single line, modified by testsuite!
32 sub libdirs { return (map "-L$_/auto", @INC); }
33
34 sub load : prototype($) {
35 my ($pkg) = @_;
36
37 my $mod_name = $pkg->library();
38
39 my @dirs = $pkg->libdirs();
40 my $mod_file = DynaLoader::dl_findfile({{DEBUG_LIBPATH}}@dirs, $mod_name);
41 die "failed to locate shared library for $mod_name (lib${mod_name}.so)\n" if !$mod_file;
42
43 my $lib = DynaLoader::dl_load_file($mod_file)
44 or die "failed to load library '$mod_file'\n";
45
46 my $data = ($::{'proxmox-rs-library'} //= {});
47 $data->{$mod_name} = $lib;
48 $data->{-current} //= $lib;
49 $data->{-package} //= $pkg;
50 }
51
52 sub bootstrap {
53 my ($pkg) = @_;
54
55 my $mod_name = $pkg->library();
56
57 my $bootstrap_name = 'boot_' . ($pkg =~ s/::/__/gr);
58
59 my $lib = $::{'proxmox-rs-library'}
60 or die "rust library not available for '{PRODUCT}'\n";
61 $lib = $lib->{$mod_name};
62
63 my $sym = DynaLoader::dl_find_symbol($lib, $bootstrap_name);
64 die "failed to locate '$bootstrap_name'\n" if !defined $sym;
65 my $boot = DynaLoader::dl_install_xsub($bootstrap_name, $sym, "src/FIXME.rs");
66 $boot->();
67 }
68
69 BEGIN {
70 __PACKAGE__->load();
71 __PACKAGE__->bootstrap();
72 init();
73 }
74
75 1;