| 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; |
| } |