+sub _add_valid_values_disp {
+ my $key = shift;
+ my $valid_values = shift;
+
+ my $disp = "";
+ if (exists $valid_values->{$key}) {
+ $disp = " (" . join(", ", sort keys %{ $valid_values->{$key} }) . ")";
+ }
+ return $disp;
+}
+
+sub _get_value {
+ my $key = shift;
+ my $msg = shift;
+ my $default = shift;
+ my $valid_values = shift;
+
+ my $val = prompt($msg, $default);
+ while (exists $valid_values->{$key} and not exists $valid_values->{$key}->{$val}) {
+ my $retry_msg = "Value '$val' is not a valid option.\n";
+ $retry_msg .= "Please enter a value";
+ $retry_msg .= _add_valid_values_disp($key, $valid_values);
+ $val = prompt($retry_msg, $default);
+ }
+ return $val;
+}
+
+=head2 get_target_directories
+
+Creates a hash mapping from symbols for installation target
+directories to actual directory paths.
+
+=cut
+
+sub get_target_directories {
+ my $config = shift;
+
+ my $base = $config->{'INSTALL_BASE'};
+ my $mode = $config->{'INSTALL_MODE'};
+
+ # get last component of install base directory
+ # to treat as package name
+ my ($volume, $directories, $file) = File::Spec->splitpath($base, 1);
+ my @basedir = File::Spec->splitdir($directories);
+ my $package = pop @basedir;
+
+ my %dirmap = ();
+ if ($mode eq 'single') {
+ $dirmap{'INTRANET_CGI_DIR'} = File::Spec->catdir(@basedir, $package, 'intranet', 'cgi-bin');
+ $dirmap{'INTRANET_TMPL_DIR'} = File::Spec->catdir(@basedir, $package, 'intranet', 'templates');
+ $dirmap{'INTRANET_WWW_DIR'} = File::Spec->catdir(@basedir, $package, 'intranet', 'www');
+ $dirmap{'OPAC_CGI_DIR'} = File::Spec->catdir(@basedir, $package, 'opac', 'cgi-bin');
+ $dirmap{'OPAC_TMPL_DIR'} = File::Spec->catdir(@basedir, $package, 'opac', 'templates');
+ $dirmap{'OPAC_WWW_DIR'} = File::Spec->catdir(@basedir, $package, 'opac', 'www');
+ $dirmap{'PERL_MODULE_DIR'} = File::Spec->catdir(@basedir, $package, 'lib');
+ $dirmap{'KOHA_CONF_DIR'} = File::Spec->catdir(@basedir, $package, 'etc');
+ $dirmap{'ZEBRA_CONF_DIR'} = File::Spec->catdir(@basedir, $package, 'etc', 'zebradb');
+ $dirmap{'EXAMPLE_DIR'} = File::Spec->catdir(@basedir, $package, 'example');
+ $dirmap{'SCRIPT_DIR'} = File::Spec->catdir(@basedir, $package, 'bin');
+ $dirmap{'MAN_DIR'} = File::Spec->catdir(@basedir, $package, 'man');
+ $dirmap{'DOC_DIR'} = File::Spec->catdir(@basedir, $package, 'doc');
+ $dirmap{'ZEBRA_LOCK_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'lock', 'zebradb');
+ $dirmap{'LOG_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'log');
+ $dirmap{'ZEBRA_DATA_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'lib', 'zebradb');
+ $dirmap{'ZEBRA_RUN_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'run', 'zebradb');
+ } elsif ($mode eq 'dev') {
+ my $curdir = File::Spec->rel2abs(File::Spec->curdir());
+ $dirmap{'INTRANET_CGI_DIR'} = File::Spec->catdir($curdir);
+ $dirmap{'INTRANET_TMPL_DIR'} = File::Spec->catdir($curdir, 'koha-tmpl', 'intranet-tmpl');
+ $dirmap{'INTRANET_WWW_DIR'} = File::Spec->catdir($curdir, 'koha-tmpl', 'intranet-tmpl');
+ $dirmap{'OPAC_CGI_DIR'} = File::Spec->catdir($curdir, 'opac');
+ $dirmap{'OPAC_TMPL_DIR'} = File::Spec->catdir($curdir, 'koha-tmpl', 'opac-tmpl');
+ $dirmap{'OPAC_WWW_DIR'} = File::Spec->catdir($curdir, 'koha-tmpl', 'opac-tmpl');
+ $dirmap{'PERL_MODULE_DIR'} = File::Spec->catdir($curdir);
+ $dirmap{'KOHA_CONF_DIR'} = File::Spec->catdir(@basedir, $package, 'etc');
+ $dirmap{'ZEBRA_CONF_DIR'} = File::Spec->catdir(@basedir, $package, 'etc', 'zebradb');
+ $dirmap{'EXAMPLE_DIR'} = File::Spec->catdir(@basedir, $package, 'example');
+ $dirmap{'SCRIPT_DIR'} = File::Spec->catdir(@basedir, $package, 'bin');
+ $dirmap{'MAN_DIR'} = File::Spec->catdir(@basedir, $package, 'man');
+ $dirmap{'DOC_DIR'} = File::Spec->catdir(@basedir, $package, 'doc');
+ $dirmap{'ZEBRA_LOCK_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'lock', 'zebradb');
+ $dirmap{'LOG_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'log');
+ $dirmap{'ZEBRA_DATA_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'lib', 'zebradb');
+ $dirmap{'ZEBRA_RUN_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'run', 'zebradb');
+ } else {
+ # mode is standard, i.e., 'fhs'
+ $dirmap{'INTRANET_CGI_DIR'} = File::Spec->catdir(@basedir, $package, 'intranet', 'cgi-bin');
+ $dirmap{'INTRANET_TMPL_DIR'} = File::Spec->catdir(@basedir, $package, 'intranet', 'templates');
+ $dirmap{'INTRANET_WWW_DIR'} = File::Spec->catdir(@basedir, $package, 'intranet', 'www');
+ $dirmap{'OPAC_CGI_DIR'} = File::Spec->catdir(@basedir, $package, 'opac', 'cgi-bin');
+ $dirmap{'OPAC_TMPL_DIR'} = File::Spec->catdir(@basedir, $package, 'opac', 'templates');
+ $dirmap{'OPAC_WWW_DIR'} = File::Spec->catdir(@basedir, $package, 'opac', 'www');
+ $dirmap{'PERL_MODULE_DIR'} = File::Spec->catdir(@basedir, $package, 'lib');
+ $dirmap{'KOHA_CONF_DIR'} = File::Spec->catdir(File::Spec->rootdir(), 'etc', $package);
+ $dirmap{'ZEBRA_CONF_DIR'} = File::Spec->catdir(File::Spec->rootdir(), 'etc', $package, 'zebradb');
+ $dirmap{'EXAMPLE_DIR'} = File::Spec->catdir(@basedir, $package, 'example');
+ $dirmap{'SCRIPT_DIR'} = File::Spec->catdir(@basedir, $package, 'bin');
+ $dirmap{'MAN_DIR'} = File::Spec->catdir(@basedir, $package, 'man');
+ $dirmap{'DOC_DIR'} = File::Spec->catdir(@basedir, $package, 'doc');
+ $dirmap{'ZEBRA_LOCK_DIR'} = File::Spec->catdir(File::Spec->rootdir(), 'var', 'lock', $package, 'zebradb');
+ $dirmap{'LOG_DIR'} = File::Spec->catdir(File::Spec->rootdir(), 'var', 'log', $package);
+ $dirmap{'ZEBRA_DATA_DIR'} = File::Spec->catdir(File::Spec->rootdir(), 'var', 'lib', $package, 'zebradb');
+ $dirmap{'ZEBRA_RUN_DIR'} = File::Spec->catdir(File::Spec->rootdir(), 'var', 'run', $package, 'zebradb');
+ }
+
+ foreach my $key (sort keys %dirmap) {
+ print sprintf("%-25.25s%s\n", $key, $dirmap{$key});
+ }
+ return %dirmap;
+}
+
+package MY;
+
+sub test {
+ my $self = shift;
+ my $test = $self->SUPER::test(@_);
+ $test =~ s!\$\(INST_LIB\)!blib/PERL_MODULE_DIR!g;
+ return $test;
+}
+
+sub install {
+ my $self = shift;
+ my $install = "";
+ # NOTE: we're *not* doing this: my $install = $self->SUPER::install(@_);
+ # This means that we're completely overriding EU::MM's default
+ # installation and uninstallation targets.
+ foreach my $key (sort keys %target_directories) {
+ $install .= qq(
+KOHA_INST_$key = blib/$key
+KOHA_DEST_$key = $target_directories{$key}
+);
+ }
+
+ $install .= qq(
+install :: all install_koha
+\t\$(NOECHO) \$(NOOP)
+);
+ $install .= "install_koha ::\n";
+ $install .= "\t\$(NOECHO) umask 022; \$(MOD_INSTALL) \\\n";
+ foreach my $key (sort keys %target_directories) {
+ $install .= "\t\t\$(KOHA_INST_$key) \$(KOHA_DEST_$key) \\\n";
+ }
+ $install .= "\t\t\$(INST_MAN1DIR) \$(DESTINSTALLMAN1DIR) \\\n";
+ $install .= "\t\t\$(INST_MAN3DIR) \$(DESTINSTALLMAN3DIR)\n";
+ return $install;
+}
+
+sub postamble {
+ # put directory mappings into Makefile
+ # so that Make will export as environment
+ # variables -- this is for the use of
+ # rewrite-confg.PL
+ my $env = join("\n", map { "export __${_}__ = $target_directories{$_}" } keys %target_directories);
+ return "$env\n";