Я немного поиграю с NativeCall, чтобы познакомиться с этой стороной Perl6. Конечно, я сначала пытаюсь загрузить libstatgrab (что еще?).
Итак, я начну с самого простого - информации о хосте. Поскольку пока нет поддержки кластеров, это всего лишь один результат - никаких сложностей.
Код:
#!/usr/bin/env perl6
use v6;
use NativeCall;
enum sg_error (
SG_ERROR_NONE => 0,
SG_ERROR_INVALID_ARGUMENT => 1,
...
);
class sg_error_details is repr('CStruct') {
has int32 $.error;
has int32 $.errno_value;
has Str $.error_arg;
};
sub sg_init(int32 $ignore_errors) returns int32 is native('statgrab') { * };
enum sg_host_state (
sg_unknown_configuration => 0,
sg_physical_host => 1,
sg_virtual_machine => 2,
sg_paravirtual_machine => 3,
sg_hardware_virtualized => 4
);
class sg_host_info is repr('CStruct') {
has Str $.os_name;
has Str $.os_release;
has Str $.os_version;
has Str $.platform;
has Str $.hostname;
has uint32 $.bitwidth;
has int32 $.host_state;
has uint32 $.ncpus;
has uint32 $.maxcpus;
has uint64 $.uptime;
has uint64 $.systime;
};
sub sg_get_host_info(size_t is rw) returns Pointer is native('statgrab') is symbol('sg_get_host_info_r') { * };
sub sg_free_host_info(Pointer) is native('statgrab') is symbol('sg_free_stats_buf') { * };
sub MAIN() {
my int32 $ignore_errors = 0;
my $error = sg_init($ignore_errors);
if $error != SG_ERROR_NONE {
say "Maeh: $error";
exit 1;
}
my size_t $num_host_infos = 0;
my $res = sg_get_host_info($num_host_infos);
if $num_host_infos > 0 {
my $host_info = nativecast(sg_host_info, $res);
with $host_info {
say "You're using ", $_.os_name, " on ", $_.hostname;
}
}
sg_free_host_info($res);
}
Его запуск (тупой) приводит к ошибке загрузки библиотеки:
$ perl6 statgrab.p6
Cannot locate native library 'libstatgrab.dylib': dlopen(libstatgrab.dylib, 1): image not found
in method setup at /Users/sno/rakudo/share/perl6/sources/24DD121B5B4774C04A7084827BFAD92199756E03 (NativeCall) line 283
in method CALL-ME at /Users/sno/rakudo/share/perl6/sources/24DD121B5B4774C04A7084827BFAD92199756E03 (NativeCall) line 570
in sub MAIN at statgrab.p6 line 95
in block <unit> at statgrab.p6 line 93
Хорошо - зададим ему путь поиска:
$ LD_LIBRARY_PATH=/opt/pkg/lib:$LD_LIBRARY_PATH perl6 statgrab.p6
Cannot locate native library 'libstatgrab.dylib': dlopen(libstatgrab.dylib, 1): image not found
Такая же картина при использовании DYLD_LIBRARY_PATH
- который также поддерживается dlopen (3) на Дарвине.
Но изменение в каталоге работает:
$ (cd /opt/pkg/lib && perl6 /data/Projects/OSS/p6-Unix-Statgrab/statgrab.p6 )
You're using Darwin on ernie.[...]
Есть ли отсутствие сквозного пути поиска в способе вызова moarvm?
/opt/pkg/lib
на Mac? Файлlibstatgrab.dylib
присутствует? - person Håkon Hægland   schedule 20.02.2019===SORRY!=== Stub code executed
.. - person Håkon Hægland   schedule 20.02.2019...
изenum
. Результат, который я получаю от запуска скрипта:You're using Linux on hakon-Precision-7530
- person Håkon Hægland   schedule 20.02.2019... is native('/opt/pkg/lib/libstatgrab.dylib') ...
? - person Håkon Hægland   schedule 21.02.2019libstatgrab
0.91 на Mojave по умолчанию:./configure && make && make install
, а затем следующий код работает нормальноperl6 -e 'use NativeCall; sub sg_init(int32 $ignore_errors) returns int32 is native("statgrab") { * }; sg_init(1)'
. Поэтому я не могу воспроизвести это на MacOS 10.14.3. Кроме того, приведенный выше сценарий (без...
) работает должным образом, afaics. - person Elizabeth Mattijsen   schedule 21.02.2019/usr/local/lib
. - person Elizabeth Mattijsen   schedule 21.02.2019LD_DEBUG=all
полезно? - person raiph   schedule 23.02.2019