1 #
\r# Copyright 2002-2007 The ChatSpike Development Team
\r# <brain@chatspike.net>
\r# <Craig@chatspike.net>
\r#
\r# Licensed under GPL, please see the COPYING file
\r# for more information
\r#
\r\rpackage make::configure;
\ruse Exporter 'import';
\ruse POSIX;
\ruse make::utilities;
\r@EXPORT = qw(promptnumeric dumphash is_dir getmodules getrevision getcompilerflags getlinkerflags getdependencies resolve_directory yesno showhelp promptstring_s);
\r\rmy $no_svn = 0;
\r\rsub yesno {
\r my ($flag,$prompt) = @_;
\r print "$prompt [\033[1;32m$main::config{$flag}\033[0m] -> ";
\r chomp($tmp = <STDIN>);
\r if ($tmp eq "") { $tmp = $main::config{$flag} }
\r if (($tmp eq "") || ($tmp =~ /^y/i))
\r {
\r $main::config{$flag} = "y";
\r }
\r else
\r {
\r $main::config{$flag} = "n";
\r }
\r return;
\r}
\r\rsub resolve_directory
\r{
\r my $ret = $_[0];
\r eval
\r {
\r use File::Spec;
\r $ret = File::Spec->rel2abs($_[0]);
\r };
\r return $ret;
\r}
\r\rsub getrevision {
\r if ($no_svn)
\r {
\r return "0";
\r }
\r my $data = `svn info`;
\r if ($data eq "")
\r {
\r $no_svn = 1;
\r $rev = "0";
\r return $rev;
\r }
\r $data =~ /Revision: (\d+)/;
\r my $rev = $1;
\r if (!defined($rev))
\r {
\r $rev = "0";
\r }
\r return $rev;
\r}
\r\rsub getcompilerflags {
\r my ($file) = @_;
\r open(FLAGS, $file);
\r while (<FLAGS>) {
\r if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
\r close(FLAGS);
\r return translate_functions($1,$file);
\r }
\r }
\r close(FLAGS);
\r return undef;
\r}
\r\rsub getlinkerflags {
\r my ($file) = @_;
\r open(FLAGS, $file);
\r while (<FLAGS>) {
\r if ($_ =~ /^\/\* \$LinkerFlags: (.+) \*\/$/) {
\r close(FLAGS);
\r return translate_functions($1,$file);
\r }
\r }
\r close(FLAGS);
\r return undef;
\r}
\r\rsub getdependencies {
\r my ($file) = @_;
\r open(FLAGS, $file);
\r while (<FLAGS>) {
\r if ($_ =~ /^\/\* \$ModDep: (.+) \*\/$/) {
\r close(FLAGS);
\r return translate_functions($1,$file);
\r }
\r }
\r close(FLAGS);
\r return undef;
\r}
\r\r\rsub getmodules
\r{
\r my $i = 0;
\r print "Detecting modules ";
\r opendir(DIRHANDLE, "src/modules");
\r foreach $name (sort readdir(DIRHANDLE))
\r {
\r if ($name =~ /^m_(.+)\.cpp$/)
\r {
\r $mod = $1;
\r if ($mod !~ /_static$/)
\r {
\r $main::modlist[$i++] = $mod;
\r print ".";
\r }
\r }
\r }
\r closedir(DIRHANDLE);
\r print "\nOk, $i modules.\n";
\r}
\r\rsub promptnumeric($$)
\r{
\r my $continue = 0;
\r my ($prompt, $configitem) = @_;
\r while (!$continue)
\r {
\r print "Please enter the maximum $prompt?\n";
\r print "[\033[1;32m$main::config{$configitem}\033[0m] -> ";
\r chomp($var = <STDIN>);
\r if ($var eq "")
\r {
\r $var = $main::config{$configitem};
\r }
\r if ($var =~ /^\d+$/) {
\r # We don't care what the number is, set it and be on our way.
\r $main::config{$configitem} = $var;
\r $continue = 1;
\r print "\n";
\r } else {
\r print "You must enter a number in this field. Please try again.\n\n";
\r }
\r }
\r}
\r\rsub promptstring_s($$)
\r{
\r my ($prompt,$default) = @_;
\r my $var;
\r print "$prompt\n";
\r print "[\033[1;32m$default\033[0m] -> ";
\r chomp($var = <STDIN>);
\r $var = $default if $var eq "";
\r print "\n";
\r return $var;
\r}
\r\rsub dumphash()
\r{
\r print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
\r print "\033[0mBase install path:\033[1;32m\t\t$main::config{BASE_DIR}\033[0m\n";
\r print "\033[0mConfig path:\033[1;32m\t\t\t$main::config{CONFIG_DIR}\033[0m\n";
\r print "\033[0mModule path:\033[1;32m\t\t\t$main::config{MODULE_DIR}\033[0m\n";
\r print "\033[0mLibrary path:\033[1;32m\t\t\t$main::config{LIBRARY_DIR}\033[0m\n";
\r print "\033[0mMax connections:\033[1;32m\t\t$main::config{MAX_CLIENT}\033[0m\n";
\r print "\033[0mMax nickname length:\033[1;32m\t\t$main::config{NICK_LENGT}\033[0m\n";
\r print "\033[0mMax channel length:\033[1;32m\t\t$main::config{CHAN_LENGT}\033[0m\n";
\r print "\033[0mMax mode length:\033[1;32m\t\t$main::config{MAXI_MODES}\033[0m\n";
\r print "\033[0mMax ident length:\033[1;32m\t\t$main::config{MAX_IDENT}\033[0m\n";
\r print "\033[0mMax quit length:\033[1;32m\t\t$main::config{MAX_QUIT}\033[0m\n";
\r print "\033[0mMax topic length:\033[1;32m\t\t$main::config{MAX_TOPIC}\033[0m\n";
\r print "\033[0mMax kick length:\033[1;32m\t\t$main::config{MAX_KICK}\033[0m\n";
\r print "\033[0mMax name length:\033[1;32m\t\t$main::config{MAX_GECOS}\033[0m\n";
\r print "\033[0mMax away length:\033[1;32m\t\t$main::config{MAX_AWAY}\033[0m\n";
\r print "\033[0mGCC Version Found:\033[1;32m\t\t$main::config{GCCVER}.x\033[0m\n";
\r print "\033[0mCompiler program:\033[1;32m\t\t$main::config{CC}\033[0m\n";
\r print "\033[0mStatic modules:\033[1;32m\t\t\t$main::config{STATIC_LINK}\033[0m\n";
\r print "\033[0mIPv6 Support:\033[1;32m\t\t\t$main::config{IPV6}\033[0m\n";
\r print "\033[0mIPv6 to IPv4 Links:\033[1;32m\t\t$main::config{SUPPORT_IP6LINKS}\033[0m\n";
\r print "\033[0mGnuTLS Support:\033[1;32m\t\t\t$main::config{USE_GNUTLS}\033[0m\n";
\r print "\033[0mOpenSSL Support:\033[1;32m\t\t$main::config{USE_OPENSSL}\033[0m\n\n";
\r}
\r\rsub is_dir
\r{
\r my ($path) = @_;
\r if (chdir($path))
\r {
\r chdir($main::this);
\r return 1;
\r }
\r else
\r {
\r # Just in case..
\r chdir($main::this);
\r return 0;
\r }
\r}
\r\rsub showhelp
\r{
\r chomp($PWD = `pwd`);
\r print "Usage: configure [options]
\r\r*** NOTE: NON-INTERACTIVE CONFIGURE IS *NOT* SUPPORTED BY THE ***
\r*** INSPIRCD DEVELOPMENT TEAM. DO NOT ASK FOR HELP REGARDING ***
\r*** NON-INTERACTIVE CONFIGURE ON THE FORUMS OR ON IRC! ***
\r\rOptions: [defaults in brackets after descriptions]
\r\rWhen no options are specified, interactive
\rconfiguration is started and you must specify
\rany required values manually. If one or more
\roptions are specified, non-interactive configuration
\ris started, and any omitted values are defaulted.
\r\rArguments with a single \"-\" symbol, as in
\rInspIRCd 1.0.x, are also allowed.
\r\r --disable-interactive Sets no options intself, but
\r will disable any interactive prompting.
\r --update Update makefiles and dependencies
\r --modupdate Detect new modules and write makefiles
\r --svnupdate {--rebuild} Update working copy via subversion
\r {and optionally rebuild if --rebuild
\r is also specified}
\r --clean Remove .config.cache file and go interactive
\r --enable-gnutls Enable GnuTLS module [no]
\r --enable-openssl Enable OpenSSL module [no]
\r --with-nick-length=[n] Specify max. nick length [32]
\r --with-channel-length=[n] Specify max. channel length [64]
\r --with-max-clients=[n] Specify maximum number of users
\r which may connect locally
\r --enable-optimization=[n] Optimize using -O[n] gcc flag
\r --enable-epoll Enable epoll() where supported [set]
\r --enable-kqueue Enable kqueue() where supported [set]
\r --disable-epoll Do not enable epoll(), fall back
\r to select() [not set]
\r --disable-kqueue Do not enable kqueue(), fall back
\r to select() [not set]
\r --enable-ipv6 Build ipv6 native InspIRCd [no]
\r --enable-remote-ipv6 Build with ipv6 support for remote
\r servers on the network [yes]
\r --disable-remote-ipv6 Do not allow remote ipv6 servers [not set]
\r --with-cc=[filename] Use an alternative g++ binary to
\r build InspIRCd [g++]
\r --with-ident-length=[n] Specify max length of ident [12]
\r --with-quit-length=[n] Specify max length of quit [200]
\r --with-topic-length=[n] Specify max length of topic [350]
\r --with-kick-length=[n] Specify max length of kick [200]
\r --with-gecos-length=[n] Specify max length of gecos [150]
\r --with-away-length=[n] Specify max length of away [150]
\r --with-max-modes=[n] Specify max modes per line which
\r have parameters [20]
\r --with-maxbuf=[n] Change the per message buffer size [512]
\r DO NOT ALTER THIS OPTION WITHOUT GOOD REASON
\r AS IT *WILL* BREAK CLIENTS!!!
\r --prefix=[directory] Base directory to install into (if defined,
\r can automatically define config, module, bin
\r and library dirs as subdirectories of prefix)
\r [$PWD]
\r --config-dir=[directory] Config file directory for config and SSL certs
\r [$PWD/conf]
\r --module-dir=[directory] Modules directory for loadable modules
\r [$PWD/modules]
\r --binary-dir=[directory] Binaries directory for core binary
\r [$PWD/bin]
\r --library-dir=[directory] Library directory for core libraries
\r [$PWD/lib]
\r --help Show this help text and exit
\r\r";
\r exit(0);
\r}
\r\r1;
\r\r