MarpaX-ESLIF
view release on metacpan or search on metacpan
etc/compile_marpaESLIF.pl view on Meta::CPAN
#
# Our distribution have both C and CPP files, and we want to make sure that modifying
# CFLAGS will not affect cpp files. Since we require a version of ExtUtils::CBuilder
# that support the environment variables, explicitely setting the environment variables
# from default ExtUtils::Cbuilder will ensure cc and cpp settings will become independant
# if we are doing to modify any of them.
# We do that for linker settings as well for coherency although we will NEVER touch them.
# OTHERLDFLAGS will be specific to this makefile.
#
# Take care: with ExtUtils::CBuilder, $ENV{CFLAGS} and $ENV{LDFLAGS} are appended to default perl compile flags, not the others
#
#
my %cbuilder_config = ExtUtils::CBuilder->new()->get_config;
$ENV{CC} = $cbuilder_config{cc} // 'cc';
$ENV{CFLAGS} //= '';
$ENV{CFLAGS} .= ' -DNDEBUG -DNTRACE';
$ENV{CXX} = $cbuilder_config{cxx} // $ENV{CC};
$ENV{CXXFLAGS} = $cbuilder_config{cxxflags} // $cbuilder_config{ccflags} // '';
$ENV{LD} = $cbuilder_config{ld} // $ENV{CC};
$ENV{LDFLAGS} //= '';
my @OTHERLDFLAGS = ();
my $optimize = '';
print "==========================================\n";
print "Original compilers and linker settings as per ExtUtils::CBuilder\n";
print "\n";
print "CC (overwrite) $ENV{CC}\n";
print "CFLAGS ( fixed) " . ($cbuilder_config{ccflags} // '') . "\n";
print "CFLAGS ( append) $ENV{CFLAGS}\n";
print "CXX (overwrite) $ENV{CXX}\n";
print "CXXFLAGS (overwrite) $ENV{CXXFLAGS}\n";
print "LD (overwrite) $ENV{LD}\n";
print "LDFLAGS ( fixed) " . ($cbuilder_config{ldflags} // '') . "\n";
print "LDFLAGS ( append) $ENV{LDFLAGS}\n";
print "==========================================\n";
print "\n";
my $ac = Config::AutoConf->new();
# goto jdd;
$ac->check_cc;
#
# Guess CXX configuration
#
# Sun C compiler is a special case, we know that guess_compiler will always get it wrong
etc/compile_marpaESLIF.pl view on Meta::CPAN
$cxx = 'CC';
}
}
}
if (which($cxx)) {
$ac->msg_notice("Forcing CXX to $cxx");
$ENV{CXX} = $cxx;
#
# We got "CC" executable - no need of eventual -x c++ that perl may have add
#
if ($ENV{CXXFLAGS} =~ s/\-x\s+c\+\+\s*//) {
$ac->msg_notice("Removed -x c++ from CXXFLAGS");
}
} else {
$ac->msg_notice("Warning! Sun C compiler detected but no CC found neither in path neither where is the C compiler");
}
#
# In any case, add -lCrun and do not execute guess_compiler - cross fingers if we did not managed to find CXX
#
$ac->msg_notice("Adding -lCrun to OTHERLDFLAGS");
push(@OTHERLDFLAGS, '-lCrun');
etc/compile_marpaESLIF.pl view on Meta::CPAN
}
if ($have_cppguess && ! $sunc) {
try {
my ($cxx_guess, $extra_cxxflags_guess, $extra_ldflags_guess) = guess_compiler($ac);
if (defined($cxx_guess) && (length($cxx_guess) > 0) && which($cxx_guess)) {
$ac->msg_notice("Setting CXX to $cxx_guess");
$ENV{CXX} = $cxx_guess;
if (defined($extra_cxxflags_guess) && (length($extra_cxxflags_guess) > 0)) {
$ac->msg_notice("Appending $extra_cxxflags_guess to CXXFLAGS");
$ENV{CXXFLAGS} .= " $extra_cxxflags_guess";
}
if (defined($extra_ldflags_guess) && (length($extra_ldflags_guess) > 0)) {
#
# If $extra_ldflags_guess matches -lc++ or -lstdc++ remember this is a guess.
# It can be one or the other, and we use the standard ciso646 with _LIBCPP_VERSION technique
# to decide
#
if ($extra_ldflags_guess =~ /\-l(?:c|stdc)++/) {
$ac->msg_checking(sprintf "Checking which C++ library is correct between -lc++ and -lstdc++");
my $check_libcpp = <<RAISE_ERROR_IF_NOT_LIBCPP;
etc/compile_marpaESLIF.pl view on Meta::CPAN
$ac->msg_result('yes');
$isc99 = 1;
} else {
$ac->msg_result('no');
$ac->msg_notice("what CFLAGS is required for C99:");
$ac->msg_result('');
foreach my $flag (qw/-std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99/) {
$ac->msg_checking("if flag $flag works");
if (try_compile("#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L\n#error \"C99 is not enabled\"\n#endif\nint main(){return 0;}", { extra_compiler_flags => $flag })) {
$ac->msg_result('yes');
$ENV{CFLAGS} .= " $flag";
$isc99 = 1;
last;
} else {
$ac->msg_result('no');
}
}
}
}
#
etc/compile_marpaESLIF.pl view on Meta::CPAN
if (is_os_type('Unix', 'darwin') && ! $isc99)
{
$ac->msg_checking(sprintf "if this is clang compiler");
if ($ac->link_if_else("#ifndef __clang__\n#error \"this is not clang compiler\"\n#endif\nint main() { return 0; }")) {
$ac->msg_result('yes');
#
# C.f. http://clang.llvm.org/compatibility.html#inline
# https://bugzilla.mozilla.org/show_bug.cgi?id=917526
#
$ac->msg_notice("Adding -std=gnu89 to CFLAGS for inline semantics");
$ENV{CFLAGS} .= ' -std=gnu89';
} else {
$ac->msg_result('no');
}
}
if ($^O eq "netbsd" && ! $isc99) {
#
# We need long long, that C99 guarantees, else _NETBSD_SOURCE will do it
#
$ac->msg_notice("NetBSD platform: Append _NETBSD_SOURCE to CFLAGS to have long long");
$ENV{CFLAGS} .= ' -D_NETBSD_SOURCE';
}
my $has_Werror = 0;
if(! defined($ENV{MARPAESLIFPERL_OPTIM}) || $ENV{MARPAESLIFPERL_OPTIM}) {
if(defined($ENV{MARPAESLIFPERL_OPTIM_FLAGS})) {
$optimize = "$ENV{MARPAESLIFPERL_OPTIM_FLAGS}";
$optimize =~ s/^\s*//;
$optimize =~ s/\s$//;
$ac->msg_notice("Forced optimization flags: $optimize");
} else {
etc/compile_marpaESLIF.pl view on Meta::CPAN
}
}
my $OTHERLDFLAGS = join(' ', @OTHERLDFLAGS);
print "\n";
print "==========================================\n";
print "Tweaked compilers and linker settings\n";
print "\n";
print "CC (overwrite) $ENV{CC}\n";
print "CFLAGS ( fixed) " . ($cbuilder_config{ccflags} // '') . "\n";
print "CFLAGS ( append) $ENV{CFLAGS}\n";
print "CXX (overwrite) $ENV{CXX}\n";
print "CXXFLAGS (overwrite) $ENV{CXXFLAGS}\n";
print "LD (overwrite) $ENV{LD}\n";
print "LDFLAGS ( fixed) " . ($cbuilder_config{ldflags} // '') . "\n";
print "LDFLAGS ( append) $ENV{LDFLAGS}\n";
print "OTHERLDFLAGS $OTHERLDFLAGS\n";
print "==========================================\n";
print "\n";
my %HAVE_HEADERS = ();
$ac->check_all_headers(
qw{
ctype.h
dlfcn.h
errno.h
etc/compile_marpaESLIF.pl view on Meta::CPAN
print "Pruning directory $OBJS_DIR\n";
remove_tree($OBJS_DIR, { safe => 1 });
make_path($OBJS_DIR);
#
# Write config file
#
print "Generating $CONFIG_H\n";
$ac->write_config_h($CONFIG_H);
$ac->msg_notice("Append -I$EXTRA_INCLUDE_DIR to compile flags");
$ENV{CFLAGS} .= " -I$EXTRA_INCLUDE_DIR";
$ENV{CXXFLAGS} .= " -I$EXTRA_INCLUDE_DIR";
#
# Generate extra headers eventually
#
if (! $HAVE_HEADERS{"stdint.h"}) {
configure_file($ac, File::Spec->catfile('etc', 'stdint.h.in'), File::Spec->catfile($EXTRA_INCLUDE_DIR, 'stdint.h'));
}
if (! $HAVE_HEADERS{"inttypes.h"}) {
configure_file($ac, File::Spec->catfile('etc', 'inttypes.h.in'), File::Spec->catfile($EXTRA_INCLUDE_DIR, 'inttypes.h'));
}
#
# General flags that we always set
#
foreach my $flag (qw/_REENTRANT _THREAD_SAFE/) {
$ac->msg_notice("Append $flag to compile flags");
$ENV{CFLAGS} .= " -D$flag";
$ENV{CXXFLAGS} .= " -D$flag";
}
#
# Specific flags for cl
#
if ($ENV{CC} =~ /\bcl\b/) {
foreach my $flag (qw/WIN32_LEAN_AND_MEAN CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE/) {
$ac->msg_notice("Append $flag to compile flags");
$ENV{CFLAGS} .= " -D$flag";
$ENV{CXXFLAGS} .= " -D$flag";
}
}
#
# Extract and process tarballs in an order that we know in advance
#
sub get_object_file {
my ($source) = @_;
return File::Spec->catfile($OBJS_DIR, sprintf("%s.o", basename($source)));
}
etc/compile_marpaESLIF.pl view on Meta::CPAN
process_marpaWrapper($ac);
process_marpaESLIF($ac);
#
# Write LDFLAGS and OTHERLDFLAGS to OTHERLDFLAGS.txt
#
my $otherldflags = 'OTHERLDFLAGS.txt';
open(my $otherldflags_fd, '>', $otherldflags) || die "Cannot open $otherldflags, $!";
foreach (@OTHERLDFLAGS) {
print $otherldflags_fd "$_\n";
}
print $otherldflags_fd "$ENV{LDFLAGS}\n";
close($otherldflags_fd) || warn "Cannot close $otherldflags, $!";
#
# Write CFLAGS to CFLAGS.txt
#
my $cflags = 'CFLAGS.txt';
open(my $cflags_fd, '>', $cflags) || die "Cannot open $cflags, $!";
print $cflags_fd "$ENV{CFLAGS}\n";
close($cflags_fd) || warn "Cannot close $cflags, $!";
exit(EXIT_SUCCESS);
sub guess_compiler {
my ($ac) = @_;
my $guesser = ExtUtils::CppGuess->new(cc => $ENV{CC});
#
# We work quite like Module::Build in the sense that we are appending
etc/compile_marpaESLIF.pl view on Meta::CPAN
#
# log/exp and math lib
#
my $lm = $ac->check_lm() // '';
$ac->msg_checking("for math library:");
if($lm) {
$ac->msg_result("$lm");
$ac->search_libs('log', $lm, { action_on_true => $ac->define_var("HAVE_LOG", 1) });
$ac->search_libs('exp', $lm, { action_on_true => $ac->define_var("HAVE_EXP", 1) });
$ac->msg_notice("Append -l$lm to LDFLAGS");
$ENV{LDFLAGS} .= " -l$lm";
} else {
$ac->msg_result("not needed");
$ac->search_libs('log', { action_on_true => $ac->define_var("HAVE_LOG", 1) });
$ac->search_libs('exp', { action_on_true => $ac->define_var("HAVE_EXP", 1) });
}
}
sub check_ebcdic {
my ($ac) = @_;
#
etc/compile_marpaESLIF.pl view on Meta::CPAN
PROLOGUE
my $body = <<BODY;
int gnu_library = __GNU_LIBRARY__;
exit(gnu_library ? 0 : 1);
BODY
my $program = $ac->lang_build_program($prologue, $body);
if (try_run($program)) {
$ac->msg_result("yes");
$ac->msg_notice("Append _GNU_SOURCE to compile flags");
$ENV{CFLAGS} .= ' -D_GNU_SOURCE';
$ENV{CXXFLAGS} .= ' -D_GNU_SOURCE';
} else {
$ac->msg_result("no");
}
}
sub check_compiler_is_gnu {
my ($ac) = @_;
$ac->msg_checking('if this is GNU compiler');
my $rc;
( run in 0.520 second using v1.01-cache-2.11-cpan-8d75d55dd25 )