Как я могу сказать, если структура C имеет член в Perl XS? - PullRequest
2 голосов
/ 20 января 2010

Есть ли ExtUtils::* или Module::Build (или другой) аналог Ruby's mkmf.have_struct_member?

Я бы хотел сделать что-то вроде (в виде файла hints / ):

....
if struct_has_member("msghdr", "msg_accrights") {
    $self->{CCFLAGS} = join(' ', $self->{CCFLAGS}, "-DTRY_ACCRIGHTS_NOT_CMSG");    
}
...

Config.pm не отслеживает конкретную информацию, которую я ищу, и ExtUtils::FindFunctions здесь не совсем подходит ...

Ответы [ 2 ]

3 голосов
/ 22 января 2010

Я знаю, что это не встроено ни в MakeMaker, ни в Module :: Build. Возможно, на CPAN есть что-то, что можно сделать, но обычным способом является использование ExtUtils :: CBuilder для компиляции небольшой тестовой программы и проверки ее запуска.

use ExtUtils::CBuilder;

open my $fh, ">", "try.c" or die $!;
print $fh <<'END';
#include <time.h>

int main(void) {
    struct tm *test;
    long foo = test->tm_gmtoff;

    return 0;
}
END

close $fh;

$has{"tm.tm_gmtoff"} = 1 if
    eval { ExtUtils::CBuilder->new->compile(source => "try.c"); 1 };

Вероятно, хотите сделать это во временном файле и очистить после него и т. Д ...

1 голос
/ 19 апреля 2012

Я написал оболочку вокруг ExtUtils::CBuilder для выполнения "компилируется ли этот код C?" тесты типа в скриптах Build.PL или Makefile.PL, называемые ExtUtils :: CChecker .

Например, вы можете легко проверить вышеупомянутое:

use Module::Build;
use ExtUtils::CChecker;

my $cc = ExtUtils::CChecker->new;

$cc->try_compile_run(
    define => "TRY_ACCRIGHTS_NOT_CMSG",
    source => <<'EOF' );
      #include <sys/types.h>
      #include <sys/socket.h>
      int main(void) {
        struct msghdr cmsg;
        cmsg.msg_accrights = 0;
        return 0;
      }
EOF

$cc->new_module_build(
    configure_requires => { 'ExtUtils::CChecker' => 0 },
    ...
)->create_build_script;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...