2010-01-20 3 views
2

Ruby의 mkmf.have_struct_member과 비슷한 ExtUtils::* 또는 Module::Build (또는 기타) 아날로그가 있습니까? 'C 구조체에 Perl XS에 구성원이 있는지 어떻게 알 수 있습니까?

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

Config.pm 내가 찾고 있어요 특정 정보를 추적하지 않으며, ExtUtils::FindFunctions didn 히 :

I의 (a 힌트/ 파일의 방식으로) 그런 짓을하고 싶습니다 여기에 꽤 적합 해 보입니다 ...

+0

당신은 C 라이브러리의 구조체가 특정 멤버가 포함되어있는 경우 알고 싶어? tm.tm_gmtoff가 time.h에 존재하는지 여부 – Schwern

+0

@Schwern, 네. 이 특별한 경우에,'struct msghdr'가'msg_accrights'를 가지고 있는지 여부. – pilcrow

+0

해당 AFAIK에 대한 사전 작성된 Perl 데이터베이스가 없습니다. 보통 ExtUtils :: CBuilder를 사용하여 테스트 프로그램을 컴파일합니다. CPAN 모듈이있을 수 있지만 MakeMaker 나 Module :: Build에는 내장되어 있지 않습니다. – Schwern

답변

3

나는 이것이 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 }; 

아마 내가하고 주변에 ExtUtils::CBuilder 래퍼를 썼다

+0

'close'의 값을 테스트하지 않습니까? –

+0

@Kinopiko 안전한 Perl I/O에 대한 완전한 자습서가 아닙니다. 내 왼손으로는 클로즈가 실패했기 때문에 버그가 발생한 횟수를 셀 수 있다고 생각합니다. 요즘 나는 autodie를 사용하고 모든 것을 처리합니다. – Schwern

1

... 등, 임시 파일에 그렇게하고 뒤에 정리할 "이 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; 
관련 문제