[libmarpa-r2-perl] 05/32: cpan/do_config_h.pl : create config.h
Jonas Smedegaard
dr at jones.dk
Sat May 17 21:24:12 UTC 2014
This is an automated email from the git hooks/post-receive script.
js pushed a commit to annotated tag Marpa-R2-2.085_004
in repository libmarpa-r2-perl.
commit 06b9f5834345576e037c3ef4a4df9b1e9c76b9ca
Author: Jean-Damien Durand <jeandamiendurand at free.fr>
Date: Thu Apr 24 11:59:08 2014 +0200
cpan/do_config_h.pl : create config.h
---
cpan/do_config_h.pl | 278 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 278 insertions(+)
diff --git a/cpan/do_config_h.pl b/cpan/do_config_h.pl
new file mode 100644
index 0000000..773224c
--- /dev/null
+++ b/cpan/do_config_h.pl
@@ -0,0 +1,278 @@
+#!env perl
+#
+# This script will generate config.h
+#
+# It is assumed that current working directory is a build directory, i.e.
+# the target directory specified on the command-line when you
+# execute: cp_libmarpa.sh target_directory
+#
+use feature 'say';
+use English qw/-no_match_vars/;
+use Config;
+use File::Slurp qw/read_file/;
+use IPC::Cmd qw/run/;
+use Module::Load qw/load/;
+use POSIX qw/EXIT_SUCCESS EXIT_FAILURE/;
+
+our %PERL_AUTOCONF_OS = map { $_ => 1 } qw( MSWin32 openbsd solaris sunos midnightbsd );
+
+my $MARPA_DEBUG = $ENV{MARPA_DEBUG} || 0;
+my $USE_PERL_AUTOCONF = $ENV{MARPA_USE_PERL_AUTOCONF} || ( $PERL_AUTOCONF_OS{$^O} // 0 );
+my $CC = $ENV{CC} || $Config{cc} || 'cc';
+my $CCFLAGS = $ENV{CCFLAGS} || $Config{ccflags} || '';
+my $SH = $ENV{SH} || $Config{sh} || '';
+my $OBJ_EXT = $ENV{OBJ_EXT} || $Config{obj_ext} || '.o';
+
+if ($USE_PERL_AUTOCONF) {
+ load Config::AutoConf || die "Please install Config::AutoConf module";
+}
+
+my $rc = do_config_h();
+
+exit($rc ? EXIT_SUCCESS : EXIT_FAILURE);
+
+sub do_config_h {
+
+ # If current directory exists and contains a stamp file more recent than an eventual config.h
+ # we are done.
+ if (-e 'config.h' && -e 'stamp-h1' && up_to_date( 'config.h', 'stamp-h1' )) {
+ printf "%s is up-to-date v.s. %s. Remove one of them to force a new %s generation\n", 'config.h', 'stamp-h1', 'config.h';
+ return 1;
+ }
+
+ unlink('config.h');
+ unlink('stamp-h1');
+
+ # Otherwise, redo config.h
+ if (! $USE_PERL_AUTOCONF) {
+
+ # This is only necessary for GNU autoconf, which is aggressive
+ # about looking for things to update
+
+ # Some files should NEVER be updated in this directory, by
+ # make or anything else. If for some reason they are
+ # out of date, stamp them up to date
+
+ my @m4_files = glob('m4/*.m4');
+ my $configure_script = 'configure';
+
+ if (not up_to_date( [ 'configure.ac', @m4_files ], 'aclocal.m4' ) )
+ {
+ utime time(), time(), 'aclocal.m4';
+ }
+ if (not up_to_date(
+ [ 'configure.ac', 'Makefile.am', 'aclocal.m4' ],
+ 'Makefile.in'
+ )
+ )
+ {
+ utime time(), time(), 'Makefile.in';
+ } ## end if ( not up_to_date( [ 'configure.ac', 'Makefile.am'...]))
+ if (not up_to_date(
+ [ 'configure.ac', 'aclocal.m4' ],
+ [ $configure_script, 'config.h.in' ]
+ )
+ )
+ {
+ utime time(), time(), $configure_script;
+ utime time(), time(), 'config.h.in';
+ } ## end if ( not up_to_date( [ 'configure.ac', 'aclocal.m4'...]))
+
+ say join q{ }, "Doing config.h with configure"
+ or die "print failed: $ERRNO";
+ my $shell = $SH;
+
+ ##no critic(ValuesAndExpressions::RequireInterpolationOfMetachars)
+ $shell or die q{No Bourne shell available says $SH};
+ ##use critic
+ }
+
+ my $original_cflags = $ENV{CFLAGS};
+ local $ENV{CFLAGS};
+ $ENV{CFLAGS} = $original_cflags if defined $original_cflags;
+
+ # We need PIC, but do not want the overhead of building the shared library
+ my @configure_command_args = qw(--with-pic --disable-shared);
+
+ my @debug_flags = ();
+ if ( $MARPA_DEBUG ) {
+ if ( defined $ENV{LIBMARPA_CFLAGS} ) {
+ $ENV{CFLAGS} = $ENV{LIBMARPA_CFLAGS};
+ }
+ push @debug_flags, '-DMARPA_DEBUG=1';
+ push @debug_flags, '-fno-inline', '-Wno-inline' if ($CC eq 'gcc');
+ push @configure_command_args,
+ 'MARPA_DEBUG_FLAG=' . ( join q{ }, @debug_flags );
+ } ## end if ( $MARPA_DEBUG )
+
+ if ($USE_PERL_AUTOCONF) {
+
+ my $libmarpa_version = read_file('VERSION');
+ chomp $libmarpa_version;
+ my @libmarpa_version = split /[.]/xms, $libmarpa_version;
+
+ #
+ ## C.f. http://fr.slideshare.net/hashashin/building-c-and-c-libraries-with-perl
+ #
+ my @c = qw/marpa_ami.c marpa_avl.c marpa.c
+ marpa_codes.c marpa_obs.c marpa_slif.c marpa_tavl.c/;
+ if (! -r 'config.h') {
+ #
+ ## Because Config::AutoConf can only generate #define/#undef
+ ## stubs, we write our config.h with these stubs, our config.h
+ ## will then include a generated config_from_autoconf.h
+ #
+ say join q{ }, "Doing config.h with Config::AutoConf"
+ or die "print failed: $ERRNO";
+ open my $config_fh, '>>', 'config.h' || die "Cannot open config.h, $!\n";
+ my $ac = Config::AutoConf->new();
+ my $inline_ok = 0;
+ {
+ $ac->msg_checking('inline');
+ my $program = $ac->lang_build_program("static inline int testinline() {return 1;}\n", 'testinline');
+ $inline_ok = $ac->compile_if_else($program);
+ $ac->msg_result($inline_ok ? 'yes' : 'no');
+ }
+ my $inline = '';
+ if (! $inline_ok) {
+ foreach (qw/__inline__ __inline/) {
+ my $candidate = $_;
+ $ac->msg_checking($candidate);
+ my $program = $ac->lang_build_program("static $candidate int testinline() {return 1;}\n", 'testinline');
+ my $rc = $ac->compile_if_else($program);
+ $ac->msg_result($rc ? 'yes' : 'no');
+ if ($rc) {
+ $inline = $candidate;
+ last;
+ }
+ }
+ }
+ if ($inline) {
+ print {$config_fh} <<INLINEHOOK;
+#ifndef __CONFIG_WITH_STUBS_H
+#ifndef __cplusplus
+#define inline $inline
+#endif
+#include "config_from_autoconf.h"
+#endif /* __CONFIG_WITH_STUBS_H */
+INLINEHOOK
+ } else {
+ print {$config_fh} <<INLINEHOOK;
+#ifndef __CONFIG_WITH_STUBS_H
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+#include "config_from_autoconf.h"
+#endif /* __CONFIG_WITH_STUBS_H */
+INLINEHOOK
+ }
+
+ # Config::Autoconf mistakes 0 for undef, so these must be done explicitly
+ say {$config_fh} join q{ }, '#define MARPA_MAJOR_VERSION', $libmarpa_version[0];
+ say {$config_fh} join q{ }, '#define MARPA_MINOR_VERSION', $libmarpa_version[1];
+ say {$config_fh} join q{ }, '#define MARPA_MICRO_VERSION', $libmarpa_version[2];
+
+ close($config_fh);
+ $ac = Config::AutoConf->new();
+ my $sizeof_int = $ac->check_sizeof_type('int');
+ if ($sizeof_int < 4) {
+ die "Marpa requires that int be at least 32 bits -- on this system that is not the case";
+ }
+
+ $ac->check_stdc_headers;
+ $ac->check_default_headers();
+
+ # This check was to prepare for Perl's 64-bit pseudo-UTF8 characters inside the SLIF.
+ # It needs to be rethought.
+ #
+ # if (!$ac->check_type('unsigned long long int')) {
+ # die "Marpa requires that unsigned long long int is supported by your compiler";
+ # }
+
+ $ac->define_var('PACKAGE', "\"libmarpa\"");
+ $ac->define_var('PACKAGE_BUGREPORT', "\"http://rt.cpan.org/NoAuth/Bugs.html?Dist=Marpa\"");
+ $ac->define_var('PACKAGE_NAME', "\"libmarpa\"");
+ $ac->define_var('PACKAGE_STRING', "\"libmarpa $libmarpa_version[0].$libmarpa_version[1].$libmarpa_version[2]\"");
+ $ac->define_var('PACKAGE_TARNAME', "\"libmarpa\"");
+ $ac->define_var('PACKAGE_URL', "\"\"");
+ $ac->define_var('PACKAGE_VERSION', "\"$libmarpa_version\"");
+ $ac->define_var('PACKAGE_STRING', "\"$libmarpa_version\"");
+ $ac->write_config_h('config_from_autoconf.h');
+ #
+ # Touch $dist_stamp_file
+ #
+ if (! open(my $stamp, '>', 'stamp-h1')) {
+ warn "Cannot update $dist_stamp_file";
+ } else {
+ close($stamp);
+ }
+
+ }
+
+ my @o = map {s/\.c$/$OBJ_EXT/; $_} @c;
+ if (! -r 'Makefile.PL') {
+ open my $makefile_pl_fh, '>', 'Makefile.PL';
+ my $CCFLAGS = @debug_flags ? "$CCFLAGS} @debug_flags" : '';
+ print {$makefile_pl_fh} "
+use ExtUtils::MakeMaker;
+WriteMakefile(VERSION => \"$libmarpa_version\",
+ XS_VERSION => \"$libmarpa_version\",
+ NAME => 'libmarpa',
+ OBJECT => '@o',
+ CCFLAGS => '$CCFLAGS',
+ LINKTYPE => 'static');
+";
+ close $makefile_pl_fh;
+ die 'Making Makefile: perl Failure'
+ if not run( command => [$^X, 'Makefile.PL'], verbose => 1 );
+ }
+ } else {
+ my $shell = $SH;
+ my $configure_script = 'configure';
+ say join q{ }, "Running command:", $shell, $configure_script,
+ @configure_command_args
+ or die "print failed: $ERRNO";
+ if (not run(
+ command => [ $shell, $configure_script, @configure_command_args ],
+ verbose => 1
+ )
+ )
+ {
+ say {*STDERR} "Failed: $configure_script"
+ or die "say failed: $ERRNO";
+ say {*STDERR} "Current directory: $build_dir"
+ or die "say failed: $ERRNO";
+ die 'Cannot run libmarpa configure';
+ } ## end if ( not run( command => [ $shell, $configure_script...]))
+
+ }
+
+ return 1;
+
+} ## end sub do_libmarpa_prepare_build
+
+#
+# Copy/little adaptation of /usr/share/perl5/Module/Build/Base.pm:up_to_date()
+#
+sub up_to_date {
+ my ($source, $derived) = @_;
+ $source = [$source] unless ref $source;
+ $derived = [$derived] unless ref $derived;
+
+ # empty $derived means $source should always run
+ return 0 if @$source && !@$derived || grep {not -e} @$derived;
+
+ my $most_recent_source = time / (24*60*60);
+ foreach my $file (@$source) {
+ unless (-e $file) {
+ warn "Can't find source file $file for up-to-date check";
+ next;
+ }
+ $most_recent_source = -M _ if -M _ < $most_recent_source;
+ }
+
+ foreach my $derived (@$derived) {
+ return 0 if -M $derived > $most_recent_source;
+ }
+ return 1;
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmarpa-r2-perl.git
More information about the Pkg-perl-cvs-commits
mailing list