#!/usr/bin/perl -w
# This is a Module::Build script for BioPerl-DB installation.
# See http://search.cpan.org/~kwilliams/Module-Build/lib/Module/Build.pm
use strict;
use warnings;
use Module::Build;
use File::Spec;
use File::Basename;
# add any supported drivers here
my @supported = qw(mysql Pg Oracle);
my $build = Module::Build->new(
module_name => 'Bio::DB::BioDB',
dist_name => 'BioPerl-DB',
dist_version => '1.006900',
dist_author => 'BioPerl Team <bioperl-l@bioperl.org>',
dist_abstract => 'BioPerl-DB - package for biological databases',
license => 'perl',
requires => {
'perl' => '5.6.1',
'Bio::Root::Version' => '1.006900',
'DBI' => 0
},
recommends => {
'Graph::Directed' => 0
},
auto_features => {
Pg_support => {
description => "Postgres databases",
requires => { 'DBD::Pg' => 0},
},
mysql_support => {
description => "MySQL databases",
requires => { 'DBD::mysql' => 0},
},
Oracle_support => {
description => "Oracle databases",
requires => { 'DBD::Oracle' => 0},
},
},
dynamic_config => 1,
create_makefile_pl => 'passthrough'
);
my $accept = $build->args->{accept};
# Ask questions for db configuration (Harness file)
biosql_conf();
# Optionally have script files installed.
if ($accept ? 0 : $build->y_n("Install scripts? y/n", 'n')) {
my $files = $build->_find_file_by_type('pl', 'scripts');
my $script_build = File::Spec->catdir($build->blib, 'script');
my @tobp;
while (my ($file, $dest) = each %$files) {
$dest = 'bp_'.File::Basename::basename($dest);
$dest = File::Spec->catfile($script_build, $dest);
$build->copy_if_modified(from => $file, to => $dest);
push @tobp, $dest;
}
$build->script_files(\@tobp);
}
# Create the build script and exit
$build->create_build_script;
exit;
# setup t/DBHarness.biosql.conf
sub biosql_conf {
my $continue = $accept ||
$build->y_n("Have you already installed BioSQL? y/n", 'y');
$continue ||
die "\nBioSQL must be installed prior to installation of bioperl-db; ".
"see the INSTALL file\n";
my @drivers = grep {$build->features($_.'_support')}
qw(mysql Pg Oracle);
die "You must install a supported database driver\n" unless @drivers;
my $config_file = File::Spec->catfile('t', 'DBHarness.biosql.conf');
if (-e $config_file) {
($accept || $build->y_n(
"Do you want to use the existing '$config_file' config file? y/n",
'y')) && return;
unlink($config_file);
}
open(my $out, ">", $config_file)
or die "Error: could not write to config file '$config_file'\n";
my %config = (driver => $drivers[0],
host => '127.0.0.1',
user => 'root',
port => 3306,
password => '',
dbname => 'bioseqdb',
database => 'biosql',
schema_sql => '../biosql-schema/sql/biosqldb-mysql.sql');
$config{driver} = $build->prompt("DBD driver to use (mandatory)?",
$config{driver});
$config{host} = $build->prompt("Machine to connect to (mandatory)?",
$config{host});
$config{user} = $build->prompt("User to connect to server as (mandatory)?",
$config{user});
$config{port} = $build->prompt("Port the server is running on (optional, ".
"'' for undef/none)?", $config{port});
$config{port} = undef if $config{port} eq "''";
$config{password} = $build->prompt("Password (optional)?",
$config{password} || 'undef');
$config{password} = '' if $config{password} eq 'undef';
$build->log_info(<<COMMENT);
# The next answer will be used to identify the database name in
# the connect string, e.g., using database=, dbname=, or sid=,
# depending on the driver.
#
# If this is not set the test scripts will build a temporary
# database from scratch at the beginning and destroy it at the
# end. Conversely, if you do set it then the database must exist,
# or else the tests will fail.
#
# Generally, it is preferred to pre-build the database, simply for
# efficiency reasons, and it will also enable debugging your
# schema content if some test acts up.\n
COMMENT
$config{dbname} = $build->prompt("Name of your existing Biosql database, ".
"as it is known to your RDBMS ".
"(optional, '' for none)?",
$config{dbname});
$config{dbname} = '' if $config{dbname} eq "''";
unless ($config{dbname}) {
$config{schema_sql} = $build->prompt("Set schema_sql to use the ".
"version appropriate for your ".
"RDBMS (mandatory)",
$config{schema_sql});
}
# don't know why it is stored as an array ref, is this correct?
$config{schema_sql} = "['$config{schema_sql}']";
$build->log_info(<<COMMENT);
# The next answer does not refer to the schema or RDBMS; it only
# identifies which of the databases supported in bioperl-db you
# want to be using. Since at present bioperl-db only supports biosql,
# this must be biosql.
COMMENT
$config{database} = $build->prompt("The name of the database within ".
"bioperl-db?", $config{database});
print $out "{\n";
while (my ($key, $val) = each %config) {
# no empty strings, undefined conf setting should be undef (w/o quotes)
$val = "'$val'" unless $key eq 'schema_sql' || !defined($val);
if (!defined($val)) {
$val = 'undef';
}
print $out "\t'$key' => $val,\n";
}
print $out "}\n";
close($out);
# maybe add the capability of using a temporary (test) database, and
# load the SQL on the fly? A little trickier (SQL is in a different
# repo and is driver-dependent)
# probably should add a database ping here and die gracefully otherwise.
# we deliberately don't add the config file to cleanup, but it shouldn't
# cause problems because it is in MANIFEST.SKIP
}