2

ExtUtils::*Ruby のor Module::Build(または他の) 類似物はありmkmf.have_struct_memberますか?

私は(ヒント/ファイルのように)次のようなことをしたいと思います:

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

Config.pm私が探している特定の情報を追跡しておらず、ExtUtils::FindFunctionsここではあまり適切ではないようです...

4

2 に答える 2

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

おそらく、一時ファイルでそれを実行し、その後クリーンアップするなど...

于 2010-01-22T03:46:54.983 に答える
1

ExtUtils::CBuilder「この C コードはコンパイルされますか?」を行うためのラッパーを作成しました。Build.PLまたはExtUtils::CCheckerMakefile.PLと呼ばれるスクリプトにテストを入力します。

たとえば、次の方法で上記を簡単にテストできます。

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;
于 2012-04-19T15:38:21.840 に答える