代码之家  ›  专栏  ›  技术社区  ›  pilcrow

如何判断C结构在PerlXS中是否有成员?

  •  2
  • pilcrow  · 技术社区  · 14 年前

    有没有 ExtUtils::* Module::Build (或其他)类似于Ruby的 mkmf.have_struct_member ?

    我想做一些像 提示/ 文件):

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

    Config.pm 不跟踪我要查找的特定信息,以及 ExtUtils::FindFunctions 这里看起来不太合适…

    2 回复  |  直到 12 年前
        1
  •  3
  •   Schwern    14 年前

    我知道这不是内置在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 };
    

    可能想在一个临时文件中这样做,然后清理它,等等…

        2
  •  1
  •   LeoNerd    12 年前

    我写了一个包装纸 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;
    
    推荐文章