2 Stimmen

Wie kann ich feststellen, ob eine C-Struktur ein Mitglied in Perl XS hat?

Gibt es eine ExtUtils::* o Module::Build (oder ein anderes) Analogon zu Ruby's mkmf.have_struct_member ?

Ich würde gerne etwas tun wie (in der Art eines Hinweise/ Datei):

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

Config.pm die spezifischen Informationen, nach denen ich suche, nicht erfasst und ExtUtils::FindFunctions schien hier nicht ganz angebracht zu sein...

3voto

Schwern Punkte 138322

Ich weiß, dass dies weder in MakeMaker noch in Module::Build eingebaut ist. Es gibt vielleicht eine Sache auf CPAN, um es zu tun, aber der übliche Weg ist, ExtUtils::CBuilder zu verwenden, um ein kleines Testprogramm zu kompilieren und zu sehen, ob es läuft.

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 };

Wahrscheinlich wollen Sie das in einer temporären Datei tun und danach aufräumen usw...

1voto

LeoNerd Punkte 8068

Ich habe einen Wrapper um ExtUtils::CBuilder für die Durchführung von Tests der Art "lässt sich dieser C-Code kompilieren?" in Build.PL o Makefile.PL Skripte, genannt ExtUtils::CChecker .

Zum Beispiel können Sie die oben genannten Punkte leicht testen:

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;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X