blob: 531fe34691b5ce97807869f721650f8eeb6c6d10 [file] [log] [blame]
use 5.008;
use ExtUtils::MakeMaker;
# Most all the extra code is to deal with MakeMaker < 6.11 not working
# correctly to build rpms
my(
$mm_version,
$mm_knows_destdir,
$mm_has_destdir,
$mm_has_good_destdir,
$mm_needs_destdir,
);
# Gather some information about what EU::MM offers and/or needs
# Store the version for later use
$mm_version = $ExtUtils::MakeMaker::VERSION;
# MakeMaker prior to 6.11 doesn't support DESTDIR which is needed for
# packaging with builddir!=destdir. See bug 2388.
$mm_knows_destdir = $ExtUtils::MakeMaker::Recognized_Att_Keys{DESTDIR};
$mm_has_good_destdir = $mm_version >= 6.11;
# Add DESTDIR hack only if it's requested (and necessary)
$mm_needs_destdir = !$mm_has_good_destdir;
$mm_has_destdir = $mm_knows_destdir || $mm_needs_destdir;
$ExtUtils::MakeMaker::Recognized_Att_Keys{"DESTDIR"} = 1 if $mm_needs_destdir;
if ($mm_needs_destdir) {
my $error = <<DESTDIR_HACK;
***********************************************************************
ExtUtils::MakeMaker ${mm_version} does not include support for DESTDIR,
so if you want to be on the safe side, you might want to upgrade your
ExtUtils::MakeMaker to version 6.11 or later. It is available via CPAN.
You can use either the CPAN shell or go to
<http://search.cpan.org/search?module=ExtUtils::MakeMaker>
to get an up-to-date version.
This should only be necessary if you are creating binary packages.
***********************************************************************
DESTDIR_HACK
$error =~ s/^ {4}//gm;
warn $error;
} elsif (!$mm_has_good_destdir) {
my $error = <<DESTDIR_BUG;
***********************************************************************
ExtUtils::MakeMaker ${mm_version} contains bugs that may cause problems
in the \"make\" process. It is recommended that you upgrade
ExtUtils::MakeMaker to version 6.11 or later. It is available via CPAN.
You can use either the CPAN shell or go to
<http://search.cpan.org/search?module=ExtUtils::MakeMaker>
to get an up-to-date version.
This should only be necessary if you are creating binary packages.
***********************************************************************
DESTDIR_BUG
$error =~ s/^ {4}//gm;
warn $error;
}
# AIX has problems with not always having the correct
# flags so we have to add some :)
my $os = lc(`uname`);
my $other_ld_flags = '-Wl,-rpath,@top_builddir@/src/db_api/.libs -Wl,-rpath,@libdir@';
$other_ld_flags = " -brtl -G -bnoentry -bgcbypass:1000 -bexpfull"
if $os =~ "aix";
# Define .inc files to clean up as default behavior
# misses them when generating Makefile
my @inc_clean_files = qw(const-c.inc const-xs.inc);
WriteMakefile(
NAME => 'Slurmdb',
VERSION_FROM => 'Slurmdb.pm', # finds $VERSION
PREREQ_PM => {}, # e.g., Module::Name => 1.1
($] >= 5.005 ? ## Add these new keywords supported since 5.005
(ABSTRACT_FROM => 'Slurmdb.pm', # retrieve abstract from module
AUTHOR => 'Don Lipari <lipari@llnl.gov>') : ()),
LIBS => ['-L@top_builddir@/src/api/.libs -L@libdir@ -lslurm'], # e.g., '-lm'
DEFINE => '', # e.g., '-DHAVE_SOMETHING'
INC => "-I. -I@top_srcdir@ -I@top_srcdir@/contribs/perlapi/common -I@top_builddir@",
# Un-comment this if you add C files to link with later:
OBJECT => '$(O_FILES)', # link all the C files too
CCFLAGS => '-g',
dynamic_lib => {'OTHERLDFLAGS' => $other_ld_flags},
#Custom cleanup behavior to clear .inc files
clean => {FILES => join(' ', @inc_clean_files)},
);
if (eval {require ExtUtils::Constant; 1}) {
# If you edit these definitions to change the constants used by this module,
# you will need to use the generated const-c.inc and const-xs.inc
# files to replace their "fallback" counterparts before distributing your
# changes.
my @names = (qw(SLURMDB_CLASSIFIED_FLAG
SLURMDB_CLASS_BASE SLURMDB_PURGE_ARCHIVE SLURMDB_PURGE_BASE
SLURMDB_PURGE_DAYS SLURMDB_PURGE_FLAGS SLURMDB_PURGE_HOURS
SLURMDB_PURGE_MONTHS),
);
ExtUtils::Constant::WriteConstants(
NAME => 'Slurmdb',
NAMES => \@names,
C_FILE => 'const-c.inc',
XS_FILE => 'const-xs.inc',
);
}
# Override the install routine to add our additional install dirs and
# hack DESTDIR support into old EU::MMs.
sub MY::install {
package MY;
my $self = shift;
my @code = split(/\n/, $self->SUPER::install(@_));
init_MY_globals($self);
foreach (@code) {
# Write the correct path to perllocal.pod
next if /installed into/;
# Replace all other $(INSTALL*) vars (except $(INSTALLDIRS) of course)
# with their $(DESTINSTALL*) counterparts
s/\Q$(\E(INSTALL(?!DIRS)${MACRO_RE})\Q)\E/\$(DEST$1)/g;
}
clean_MY_globals($self);
return join("\n", @code);
}
# Now override the constants routine to add our own macros.
sub MY::constants {
package MY;
my $self = shift;
my @code = split(/\n/, $self->SUPER::constants(@_));
init_MY_globals($self);
foreach my $line (@code) {
# Skip comments
next if $line =~ /^\s*\#/;
# Skip everything which isn't a var assignment.
next unless line_has_macro_def($line);
#tore the assignment string if necessary.
set_EQ_from_line($line);
# Add some "dummy" (PERL|SITE|VENDOR)PREFIX macros for later use (only if
# necessary for old EU::MMs of course)
if (line_has_macro_def($line, 'PREFIX')) {
foreach my $r (@REPOSITORIES) {
my $rprefix = "${r}PREFIX";
if (!defined(get_macro($rprefix))) {
set_macro($rprefix, macro_ref('PREFIX'));
$line .= "\n" . macro_def($rprefix);
}
}
}
# Add DESTDIR support if necessary
if (line_has_macro_def($line, 'INSTALLDIRS')) {
if(!get_macro('DESTDIR')) {
$line .= "\n" . macro_def('DESTDIR');
}
} elsif (line_has_macro_def($line,
qr/INSTALL${MACRO_RE}/)) {
my $macro = get_macro_name_from_line($line);
if(!get_macro('DEST' . $macro,
macro_ref('DESTDIR')
. macro_ref($macro))) {
$line .= "\n"
. macro_def('DEST' . $macro,
macro_ref('DESTDIR')
. macro_ref($macro));
}
}
}
push(@code, qq{});
clean_MY_globals($self);
return join("\n", @code);
}
package MY;
use vars qw(
@REPOSITORIES
$MY_GLOBALS_ARE_SANE
$MACRO_RE
$EQ_RE
$EQ
$SELF
);
sub line_has_macro_def {
my($line, $name) = (@_, undef);
$name = $MACRO_RE unless defined $name;
return $line =~ /^($name)${EQ_RE}/;
}
sub macro_def {
my($name, $val) = (@_, undef);
my $error_message = "Problems building report error.";
die $error_message unless defined $name;
die $error_message unless defined $EQ;
$val = $SELF->{$name} unless defined $val;
return $name . $EQ . $val;
}
sub set_EQ_from_line {
my($line) = (@_);
return if defined($EQ);
$line =~ /\S(${EQ_RE})/;
$EQ = $1;
}
# Reads the name of the macro defined on the given line.
#
# The first parameter must be the line to be expected. If the line doesn't
# contain a macro definition, weird things may happen. So check with
# line_has_macro_def() before!
sub get_macro_name_from_line {
my($line) = (@_);
$line =~ /^(${MACRO_RE})${EQ_RE}/;
return $1;
}
sub macro_ref {
my($name) = (@_);
return sprintf('$(%s)', $name);
}
# Reads the value of the given macro from the current instance of EU::MM.
#
# The first parameter must be the name of a macro.
sub get_macro {
my($name) = (@_);
return $SELF->{$name};
}
# Sets the value of the macro with the given name to the given value in the
# current instance of EU::MM. Just sets, doesn't write to the Makefile!
#
# The first parameter must be the macro's name, the second the value.
sub set_macro {
my($name, $val) = (@_);
$SELF->{$name} = $val;
}
# For some reason initializing the vars on the global scope doesn't work;
# guess its some weird Perl behavior in combination with bless().
sub init_MY_globals {
my $self = shift;
# Keep a reference to ourselves so we don't have to feed it to the helper
# scripts.
$SELF = $self;
return if $MY_GLOBALS_ARE_SANE;
$MY_GLOBALS_ARE_SANE = 1;
@REPOSITORIES = qw(
PERL
SITE
VENDOR
);
# Macro names follow this RE -- at least stricly enough for our purposes.
$MACRO_RE = qr/[A-Z0-9_]+/;
# Normally macros are assigned via FOO = bar. But the part with the equal
# sign might differ from platform to platform. So we use this RE:
$EQ_RE = qr/\s*:?=\s*/;
# To assign or own macros we'll follow the first assignment string we find;
# normally " = ".
$EQ = undef;
}
# Unset $SELF to avoid any leaking memory.
sub clean_MY_globals {
my $self = shift;
$SELF = undef;
}