Ruby mkmf.have_struct_member
是否有ExtUtils::*
或Module::Build
(或其他)模拟?
我想做一些事情(以 hints / 文件的方式):
....
if struct_has_member("msghdr", "msg_accrights") {
$self->{CCFLAGS} = join(' ', $self->{CCFLAGS}, "-DTRY_ACCRIGHTS_NOT_CMSG");
}
...
Config.pm
没有跟踪我正在寻找的具体信息,ExtUtils::FindFunctions
在这里似乎不合适...
答案 0 :(得分: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 };
可能想在临时文件中执行此操作并在其后进行清理等...
答案 1 :(得分:1)
我写了一个围绕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;