source: trunk/Build.PL @ 877

Last change on this file since 877 was 877, checked in by Dominic Hargreaves, 15 years ago

Geo::HelmertTransform? is now in CPAN, and required (closes #89)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.4 KB
Line 
1use strict;
2use lib "lib";
3use OpenGuides::Build;
4use OpenGuides::Config;
5use Data::Dumper;
6
7eval "use Config::Tiny";
8die "Config::Tiny is required to configure this application.\n" if $@;
9
10print <<EOF;
11
12Beginning install process... if you already have an OpenGuides
13configuration file and you don't want to have to type in all your config
14parameters over again, abort this process now, copy that file to this
15directory, and start again.
16
17EOF
18
19my $continue = Module::Build->y_n("Continue with install?", "y");
20exit 0 unless $continue;
21
22my $existing_config = OpenGuides::Config->new( file => "wiki.conf" );
23
24my %yn_vars = map { $_ => 1 }
25   qw(use_plucene enable_page_deletion navbar_on_home_page backlinks_in_title
26      moderation_requires_password enable_node_image enable_common_categories
27      enable_common_locales);
28
29my $skip_config = Module::Build->y_n("Skip OpenGuides configuration?", "n");
30if ( $skip_config ) {
31    print <<EOF;
32===========================================================================
33Skipping OpenGuides configuration - any configuration options previously
34saved will be used instead.  You may tweak your configuration now by
35editing the 'wiki.conf' file produced by this script.
36===========================================================================
37EOF
38}
39
40my @answers;
41
42# It is an ancient Configurer, and he chooseth one of three.
43my $dbtype;
44my $dbtype_qu = $existing_config->dbtype__qu;
45if ( $skip_config ) {
46    $dbtype = $existing_config->dbtype;
47} else {
48    until ( $dbtype ) {
49        my $def = $existing_config->dbtype;
50        $dbtype = Module::Build->prompt("\n$dbtype_qu", $def);
51        $dbtype = lc($dbtype);
52        $dbtype =~ s/^\s*//;
53        $dbtype =~ s/\s*$//;
54        unless ( $dbtype eq "postgres" or $dbtype eq "mysql"
55                 or $dbtype eq "sqlite" ) {
56            undef $dbtype;
57        }
58    }
59}
60
61# Check they have the relevant DBD driver installed.
62my %drivers = ( postgres => "DBD::Pg",
63                mysql    => "DBD::mysql",
64                sqlite   => "DBD::SQLite",
65              );
66eval "require $drivers{$dbtype}";
67warn "$drivers{$dbtype} is needed to run a $dbtype database" if $@;
68
69push @answers, { question => $dbtype_qu,
70                 variable => "dbtype",
71                 value    => $dbtype };
72
73my $install_directory; # used to suggest template paths
74my $use_plucene = 1; # keep track of this so we know what to put in prereqs
75foreach my $var ( qw(
76   dbname dbuser dbpass dbhost script_name
77   install_directory template_path custom_template_path script_url
78   custom_lib_path use_plucene indexing_directory enable_page_deletion
79   admin_pass stylesheet_url site_name navbar_on_home_page home_name
80   site_desc default_city default_country contact_email default_language
81   formatting_rules_node backlinks_in_title gmaps_api_key centre_long
82   centre_lat default_gmaps_zoom default_gmaps_search_zoom force_wgs84
83   licence_name licence_url licence_info_url moderation_requires_password
84   enable_node_image enable_common_categories enable_common_locales
85  ) ) {
86    my $q_method = $var . "__qu";
87    my $qu  = $existing_config->$q_method;
88    my $type = $yn_vars{$var} ? "y_n" : "";
89    my $def = $existing_config->$var;
90    my $val = $def;
91
92    # Override dbname question for SQLite only.
93    if ( $dbtype eq "sqlite" and $var eq "dbname" ) {
94        $qu = "what's the full filename of the SQLite database this site runs on?";
95    }
96
97    if ( $dbtype eq "sqlite" and
98         ( $var eq "dbuser" or $var eq "dbpass" or $var eq "dbhost" )
99       ) {
100        print "$var not relevant for SQLite... skipping...\n";
101        push @answers, { question => $qu,
102                            variable => $var,
103                         value    => "not-used" };
104        next;
105    }
106
107    # We don't ask this for new installs as Search::InvertedIndex is
108    # deprecated
109    if ( $var eq "use_plucene" and $existing_config->$var == 1) {
110        print "Skipping question about plucene\n";
111        push @answers, { question => $qu,
112                         variable => $var,
113                         value => 1 };
114        next;
115    }
116
117    # Make sensible suggestions for template paths if we don't already
118    # have them stored.  Not really a default, but a useful hint/shortcut.
119    if ( $var eq "template_path" && !defined $existing_config->$var ) {
120        $def = $install_directory;
121        $def .= "/" unless $def =~ m|/$|;
122        $def .= "templates";
123    }
124    if ( $var eq "custom_template_path" && !defined $existing_config->$var ) {
125        $def = $install_directory;
126        $def .= "/" unless $def =~ m|/$|;
127        $def .= "custom-templates";
128    }
129
130    # Here is where we actually ask the questions.
131    unless ( $skip_config ) {
132        if ( $type eq "y_n" ) {
133            # may be stored as true/false integer value
134            if ( $def =~ /^\d+$/ ) {
135                $def = $def ? "y" : "n";
136            }
137            $val = Module::Build->y_n("\n$qu ", $def);
138        } else {
139            $val = Module::Build->prompt("\n$qu ", $def);
140        }
141    }
142
143    # Store install_directory so we can use it to suggest template paths.
144    $install_directory = $val if $var eq "install_directory";
145
146    # Keep track of chosen search method so we know what to put in prereqs.
147    # From Module::Build docs: ->y_n returns a Perl boolean true or false.
148    $use_plucene = 1 if $var eq "use_plucene" and $val;
149
150    # Make sure that script_url ends in a /
151    if ( $var eq "script_url" and $val !~ /\/$/ ) {
152        $val .= "/";
153    }
154
155    push @answers, { question => $qu,
156                     variable => $var,
157                     value    => $val };
158}
159
160# Now deal with the geo stuff.
161my $geo_handler;
162my $geo_handler_qu = "Distance calculation methods available are:"
163                   . "\n  1) British National Grid"
164                   . "\n  2) Irish National Grid"
165                   . "\n  3) UTM ellipsoid"
166                   . "\nWhich would you like to use?";
167
168if ( $skip_config ) {
169    # We default to GB National Grid for historical reasons.
170    $geo_handler = $existing_config->geo_handler;
171} else {
172    my $choice;
173    until ( $choice ) {
174        my $def = $existing_config->geo_handler;
175        $choice = Module::Build->prompt("\n".$geo_handler_qu, $def);
176        $choice =~ s/^\s*//;
177        $choice =~ s/\s*$//;
178        unless ( $choice eq "1" or $choice eq "2" or $choice eq "3" ) {
179            undef $choice;
180        }
181    }
182    $geo_handler = $choice;
183}
184
185$geo_handler_qu =~ s/\n//gs;
186push @answers, {
187                 question => $geo_handler_qu,
188                 variable => "geo_handler",
189                 value    => $geo_handler,
190               };
191
192if ( $geo_handler eq "3" ) {
193    my $qu = $existing_config->ellipsoid__qu;
194    my $ellipsoid;
195    if ( $skip_config ) {
196        $ellipsoid = $existing_config->ellipsoid;
197    } else {
198        my $def = $existing_config->ellipsoid;
199        $ellipsoid = Module::Build->prompt("\n".$qu, $def);
200        $ellipsoid =~ s/^\s*//;
201        $ellipsoid =~ s/\s*$//;
202    }
203    push @answers, {
204                     question => $qu,
205                     variable => "ellipsoid",
206                     value    => $ellipsoid,
207                   };
208}
209
210# Create a user-friendly config file from answers to prompts.
211open FILE, ">wiki.conf" or die "Can't open wiki.conf for writing: $!";
212foreach my $ans (@answers) {
213    print FILE "# $ans->{question}\n";
214    print FILE "$ans->{variable} = $ans->{value}\n\n";
215}
216close FILE or die "Can't close wiki.conf: $!";
217
218#####
219##### When updating the prereqs PLEASE REMEMBER to update PREREQUISITES.
220#####
221
222# We currently only support Plucene for new installs, but may support
223# others in future
224my $search_module = $use_plucene ? "Plucene" : "Search::InvertedIndex";
225
226# Create the build object.
227my $build = OpenGuides::Build->new(
228    sign => 1,
229    dist_name => "OpenGuides",
230    dist_version_from => "wiki.cgi",
231    license => "perl",
232    requires => {
233        'Algorithm::Diff'                     => '0.13',  # for sdiff
234        'CGI'                                 => '2.92',  # avoid escapeHTML bug
235        'CGI::Carp'                           => 0,
236        'CGI::Cookie'                         => 0,
237        'Wiki::Toolkit'                       => '0.71',
238        'Wiki::Toolkit::Feed::Atom'           => 0,
239        'Wiki::Toolkit::Feed::RSS'            => 0,
240        'Wiki::Toolkit::Formatter::UseMod'    => 0,
241        'Wiki::Toolkit::Plugin::Categoriser'  => 0,
242        'Wiki::Toolkit::Plugin::Diff'         => 0,
243        'Wiki::Toolkit::Plugin::Locator::Grid'=> 0,
244        'Wiki::Toolkit::Plugin::RSS::Reader'  => 0,
245        'Class::Accessor'                     => 0,
246        'Config::Tiny'                        => 0,
247        'Data::Dumper'                        => 0,
248        $drivers{$dbtype}                     => 0,
249        'File::Spec::Functions'               => 0,
250        'File::Temp'                          => 0,
251        'Geography::NationalGrid'             => 0,
252        'Geo::HelmertTransform'               => 0,
253        'LWP::Simple'                         => 0,
254        'Parse::RecDescent'                   => 0,
255        $search_module                        => 0,
256        'POSIX'                               => 0,
257        'Template'                            => 0,
258        'Test::MockObject'                    => '0.07', # earlier doesn't use 'mock'
259        'Time::Piece'                         => 0,
260        'URI::Escape'                         => 0,
261        'XML::RSS'                            => 0,
262        },
263    build_requires => {
264        'Module::Build' => '0.18', # earlier doesn't install script files
265        },
266    recommends => {
267        'DBD::SQLite'         => 0, # for testing
268        'Test::HTML::Content' => 0, # for testing, oddly enough
269    },
270    dynamic_config => 1,
271    create_makefile_pl => "passthrough"
272);
273
274$build->add_to_cleanup( "t/indexes/" );
275$build->add_to_cleanup( "t/node.db" );
276
277# Tell OpenGuides::Build which additional scripts and templates to install.
278$build->{config}{__extra_scripts}     = 
279                      [ "wiki.conf", "preferences.cgi", "search.cgi",
280                        "newpage.cgi" ];
281$build->{config}{__templates}         = [
282                      "admin_home.tt",
283                      "backlink_results.tt",
284                      "banner.tt",
285                      "common_categories.tt",
286                      "common_locales.tt",
287                      "delete_confirm.tt",
288                      "delete_done.tt",
289                      "delete_password_wrong.tt",
290                      "differences.tt",
291                      "display_metadata.tt",
292                      "edit_conflict.tt",
293                      "edit_form.tt",
294                      "error.tt",
295                      "footer.tt",
296                      "header.tt",
297                      "home_node.tt",
298                      "map_index.tt",
299                      "missing_metadata.tt",
300                      "moderate_confirm.tt",
301                      "moderate_password_wrong.tt",
302                      "navbar.tt",
303                      "needing_moderation.tt",
304                      "newpage.tt",
305                      "node.tt",
306                      "node_history.tt",
307                      "node_photo_notes.tt",
308                      "openguides_information_boxes.tt",
309                      "preferences.tt",
310                      "rdf_index.tt",
311                      "recent_changes.tt",
312                      "search_results.tt",
313                      "site_index.tt",
314                      "search.tt",
315                      "userstats.tt",
316                      "wanted_pages.tt"
317    ];
318
319# Finally write the build script.
320$build->create_build_script;
Note: See TracBrowser for help on using the repository browser.