use
5.008001;
our
$VERSION
=
'0.07'
;
our
@EXPORT
=
qw/check_c99 check_c99_or_exit check_compile/
;
my
$C99_SOURCE
=
<<'C99';
// include a C99 header
#include <stdbool.h>
inline // a C99 keyword with C99 style comments
int test_c99() {
int i = 0;
i++;
int j = i - 1; // another C99 feature: declaration after statement
// another C99 feature: for loop variable declarations
for (int k = 0; k < 3; i++) {
}
return j;
}
C99
sub
check_c99 {
check_compile(
$C99_SOURCE
);
}
sub
check_c99_or_exit {
check_compile(
$C99_SOURCE
) or
do
{
warn
"Your system is not support C99(OS unsupported)\n"
;
exit
0;
};
}
sub
_is_gcc {
return
0
if
$Config
{gccversion} eq
''
;
return
0
if
$Config
{gccversion} =~ m/clang/i;
return
0
if
$Config
{gccversion} =~ m/intel/i;
return
1;
}
sub
_gcc_version {
if
(
$Config
{gccversion} =~ m/^(\d+)\.(\d+)\.(\d+)/) {
return
{
major
=> $1,
minor
=> $2,
patch
=> $3,
};
}
return
;
}
sub
check_compile {
my
(
$src
,
%opt
) =
@_
;
my
$cbuilder
= ExtUtils::CBuilder->new(
quiet
=> 1);
return
0
unless
$cbuilder
->have_compiler;
my
$tmpfile
= File::Temp->new(
SUFFIX
=>
'.c'
);
$tmpfile
->
print
(
$src
);
$tmpfile
->
close
();
my
$compile_flags
;
if
(_is_gcc()) {
my
$gcc_version
= _gcc_version();
if
(
defined
$gcc_version
&&
$gcc_version
->{major} < 5) {
$compile_flags
= [
'-std=c99'
];
}
}
my
$objname
=
eval
{
$cbuilder
->compile(
source
=>
$tmpfile
->filename,
extra_compiler_flags
=>
$compile_flags
);
};
if
(
$objname
) {
my
$ret
= 1;
if
(
$opt
{executable}) {
my
$execfile
=
eval
{
$cbuilder
->link_executable(
objects
=>
$objname
,
extra_linker_flags
=>
$opt
{extra_linker_flags});
};
if
(
$execfile
) {
unlink
$execfile
or
warn
"Cannot unlink $execfile (ignored): $!"
;
}
else
{
$ret
= 0;
}
}
unlink
$objname
or
warn
"Cannot unlink $objname (ignored): $!"
;
return
$ret
;
}
else
{
return
0;
}
}
1;