X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=configure;h=33e9b4c505061cebe29e8d946210ecccc5d2902e;hb=d04979df092f93e2e0031b0d866afff418994e05;hp=e233bfdcc6ead872dc9a1a2d1005ed2617bceef5;hpb=b91c37b8f9973ffb7e8affc0070138d2ef25d0da;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/configure b/configure index e233bfdcc..33e9b4c50 100755 --- a/configure +++ b/configure @@ -1,368 +1,363 @@ -#!/usr/bin/perl +#!/usr/bin/env perl -# InspIRCd Configuration Script # -# Copyright 2003 The ChatSpike Development Team -# -# +# InspIRCd -- Internet Relay Chat Daemon # -# [14:21] Brain: i know perl-fu! +# Copyright (C) 2009-2010 Daniel De Graaf +# Copyright (C) 2007, 2009 Dennis Friis +# Copyright (C) 2003, 2006-2008 Craig Edwards +# Copyright (C) 2006-2008 Robin Burchell +# Copyright (C) 2008 Thomas Stagner +# Copyright (C) 2007 John Brooks +# Copyright (C) 2006 Oliver Lupton +# Copyright (C) 2003-2006 Craig McLure # -# $Id$ +# This file is part of InspIRCd. InspIRCd is free software: you can +# redistribute it and/or modify it under the terms of the GNU General Public +# License as published by the Free Software Foundation, version 2. # -######################################## +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + + +BEGIN { + require 5.8.0; +} + +use strict; +use warnings FATAL => qw(all); +use Data::Dumper; +BEGIN { + $Data::Dumper::Sortkeys = 1; + $Data::Dumper::Useqq = 1; +}; + +use File::Copy (); +use Socket; use Cwd; use Getopt::Long; -if ($ARGV[1] eq "-help") -{ - showhelp(); -} +# Utility functions for our buildsystem +use make::utilities; +use make::configure; +use make::gnutlscert; +use make::opensslcert; + +############################################################################################### +# +# NON-EDITABLE VARIABLES +# +############################################################################################### + +our ($opt_use_gnutls, $opt_rebuild, $opt_use_openssl, $opt_nointeractive, $opt_ports, + $opt_epoll, $opt_kqueue, $opt_noports, $opt_noepoll, $opt_nokqueue, + $opt_noipv6, $opt_maxbuf, $opt_disable_debug, $opt_freebsd_port, + $opt_system, $opt_uid); + +our ($opt_cc, $opt_base_dir, $opt_config_dir, $opt_module_dir, $opt_binary_dir, $opt_data_dir, $opt_log_dir); + +sub list_extras (); + +sub enable_extras (@); + +sub disable_extras (@); + +my @opt_enableextras; +my @opt_disableextras; GetOptions ( 'enable-gnutls' => \$opt_use_gnutls, + 'rebuild' => \$opt_rebuild, + 'system' => \$opt_system, + 'uid=s' => \$opt_uid, 'enable-openssl' => \$opt_use_openssl, - 'with-nick-length=i' => \$opt_nick_length, - 'with-channel-length=i' => \$opt_chan_length, - 'with-max-channels=i' => \$opt_maxchans, - 'with-max-oper-channels=i' => \$opt_opermaxchans, - 'with-max-clients' => \$opt_maxclients, - 'enable-optimization' => \$opt_optimise, + 'disable-interactive' => \$opt_nointeractive, + 'enable-ports' => \$opt_ports, 'enable-epoll' => \$opt_epoll, 'enable-kqueue' => \$opt_kqueue, + 'disable-ports' => \$opt_noports, 'disable-epoll' => \$opt_noepoll, 'disable-kqueue' => \$opt_nokqueue, - 'enable-ipv6' => \$opt_ipv6, - 'enable-remote-ipv6' => \$opt_ipv6links, - 'disable-remote-ipv6' => \$opt_noipv6links, + 'disable-ipv6' => \$opt_noipv6, 'with-cc=s' => \$opt_cc, - 'with-ident-length=i' => \$opt_ident, - 'with-quit-length=i' => \$opt_quit, - 'with-topic-length=i' => \$opt_topic, - 'with-kick-length=i' => \$opt_kick, - 'with-gecos-length=i' => \$opt_gecos, - 'with-away-length=i' => \$opt_away, - 'with-max-modes=i' => \$opt_modes, + 'with-maxbuf=i' => \$opt_maxbuf, + 'enable-freebsd-ports-openssl' => \$opt_freebsd_port, 'prefix=s' => \$opt_base_dir, 'config-dir=s' => \$opt_config_dir, 'module-dir=s' => \$opt_module_dir, 'binary-dir=s' => \$opt_binary_dir, - 'library-dir=s' => \$opt_library_dir, + 'data-dir=s' => \$opt_data_dir, + 'log-dir=s' => \$opt_log_dir, + 'disable-debuginfo' => sub { $opt_disable_debug = 1 }, 'help' => sub { showhelp(); }, + 'update' => sub { update(); }, + 'clean' => sub { clean(); }, + 'list-extras' => sub { list_extras; exit 0; }, # This, --enable-extras, and --disable-extras are for non-interactive managing. + 'enable-extras=s@' => \@opt_enableextras, # ^ + 'disable-extras=s@' => \@opt_disableextras, # ^ + 'generate-openssl-cert' => sub { make_openssl_cert(); exit(0); }, + 'generate-gnutls-cert' => sub { make_gnutls_cert(); exit(0); } ); -my $non_interactive = ( - (defined $opt_library_dir) || +if (scalar(@opt_enableextras) + scalar(@opt_disableextras) > 0) { + @opt_enableextras = split /,/, join(',', @opt_enableextras); + @opt_disableextras = split /,/, join(',', @opt_disableextras); + enable_extras(@opt_enableextras); + disable_extras(@opt_disableextras); + list_extras; + print "Remember: YOU are responsible for making sure any libraries needed have been installed!\n"; + exit 0; +} + +our $interactive = !( (defined $opt_base_dir) || (defined $opt_config_dir) || (defined $opt_module_dir) || (defined $opt_base_dir) || (defined $opt_binary_dir) || - (defined $opt_away) || - (defined $opt_gecos) || - (defined $opt_kick) || - (defined $opt_maxclients) || - (defined $opt_modes) || - (defined $opt_topic) || - (defined $opt_quit) || - (defined $opt_ident) || + (defined $opt_data_dir) || + (defined $opt_log_dir) || + (defined $opt_nointeractive) || (defined $opt_cc) || - (defined $opt_ipv6) || - (defined $opt_ipv6links) || - (defined $opt_noipv6links) || + (defined $opt_noipv6) || (defined $opt_kqueue) || (defined $opt_epoll) || - (defined $opt_maxchans) || - (defined $opt_opermaxchans) || - (defined $opt_chan_length) || - (defined $opt_nick_length) || - (defined $opt_optimise) || + (defined $opt_ports) || (defined $opt_use_openssl) || (defined $opt_nokqueue) || (defined $opt_noepoll) || - (defined $opt_use_gnutls) + (defined $opt_noports) || + (defined $opt_maxbuf) || + (defined $opt_system) || + (defined $opt_uid) || + (defined $opt_use_gnutls) || + (defined $opt_freebsd_port) ); -my $interactive = !$non_interactive; - -chomp($topdir = getcwd()); -$this = resolve_directory($topdir); # PWD, Regardless. -@modlist = (); # Declare for Module List.. -%config = (); # Initiate Configuration Hash.. -$config{ME} = resolve_directory($topdir); # Present Working Directory +chomp(our $topdir = getcwd()); +our $this = resolve_directory($topdir); # PWD, Regardless. +our @modlist = (); # Declare for Module List.. +our %config = (); # Initiate Configuration Hash.. +our $cache_loaded = getcache(); +$config{ME} = resolve_directory($topdir); # Present Working Directory -$config{BASE_DIR} = $config{ME}; +$config{BASE_DIR} = $config{ME}."/run"; -if (defined $opt_base_dir) -{ +if (defined $opt_base_dir) { $config{BASE_DIR} = $opt_base_dir; +} elsif (defined $opt_system) { + $config{BASE_DIR} = '/var/lib/inspircd'; +} + +if (defined $opt_system) { + $config{UID} = $opt_uid || 'ircd'; + $config{CONFIG_DIR} = '/etc/inspircd'; + $config{MODULE_DIR} = '/usr/lib/inspircd'; + $config{BINARY_DIR} = '/usr/sbin/'; + $config{BUILD_DIR} = resolve_directory($config{ME}."/build"); # Build Directory + $config{DATA_DIR} = '/var/inspircd'; + $config{LOG_DIR} = '/var/log/inspircd'; +} else { + $config{UID} = $opt_uid || $<; + $config{CONFIG_DIR} = resolve_directory($config{BASE_DIR}."/conf"); # Configuration Directory + $config{MODULE_DIR} = resolve_directory($config{BASE_DIR}."/modules"); # Modules Directory + $config{BINARY_DIR} = resolve_directory($config{BASE_DIR}."/bin"); # Binary Directory + $config{BUILD_DIR} = resolve_directory($config{ME}."/build"); # Build Directory + $config{DATA_DIR} = resolve_directory($config{BASE_DIR}."/data"); # Data directory + $config{LOG_DIR} = resolve_directory($config{BASE_DIR}."/logs"); # Log directory } -$config{CONFIG_DIR} = resolve_directory($config{BASE_DIR}."/conf"); # Configuration Directory -$config{MODULE_DIR} = resolve_directory($config{BASE_DIR}."/modules"); # Modules Directory -$config{BINARY_DIR} = resolve_directory($config{BASE_DIR}."/bin"); # Binary Directory -$config{LIBRARY_DIR} = resolve_directory($config{BASE_DIR}."/lib"); # Library Directory - -if (defined $opt_config_dir) -{ +if (defined $opt_config_dir) { $config{CONFIG_DIR} = $opt_config_dir; } -if (defined $opt_module_dir) -{ +if (defined $opt_module_dir) { $config{MODULE_DIR} = $opt_module_dir; } -if (defined $opt_binary_dir) -{ +if (defined $opt_binary_dir) { $config{BINARY_DIR} = $opt_binary_dir; } -if (defined $opt_library_dir) -{ - $config{LIBRARY_DIR} = $opt_library_dir; -} -chomp($config{HAS_GNUTLS} = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version. -chomp($config{HAS_OPENSSL} = `openssl version 2>/dev/null`); # Openssl version -$config{USE_GNUTLS} = "n"; -if (defined $opt_use_gnutls) -{ - $config{USE_GNUTLS} = "y"; # Use gnutls. -} -$config{USE_OPENSSL} = "n"; # Use openssl. -if (defined $opt_use_openssl) -{ - $config{USE_OPENSSL} = "y"; +if (defined $opt_data_dir) { + $config{DATA_DIR} = $opt_data_dir; } -$config{OPTIMITEMP} = "0"; # Default Optimisation Value -$config{OPTIMISATI} = "-g"; # Optimisation Flag -if (defined $opt_optimise) -{ - $config{OPTIMISATI} = "-O" . $opt_optimise; - $config{OPTIMITEMP} = $opt_optimise; +if (defined $opt_log_dir) { + $config{LOG_DIR} = $opt_log_dir; } -$config{NICK_LENGT} = "31"; # Default Nick Length -if (defined $opt_nick_length) -{ - $config{NICK_LENGT} = $opt_nick_length; -} -$config{CHAN_LENGT} = "64"; # Default Channel Name Length -if (defined $opt_chan_length) +chomp($config{HAS_GNUTLS} = `pkg-config --modversion gnutls 2>/dev/null`); # GNUTLS Version. + +if (defined $opt_freebsd_port) { - $config{CHAN_LENGT} = $opt_chan_length; + chomp($config{HAS_OPENSSL} = `pkg-config --modversion openssl 2>/dev/null`); + chomp($config{HAS_OPENSSL_PORT} = `pkg-config --modversion openssl 2>/dev/null`); + $config{USE_FREEBSD_BASE_SSL} = "n"; } -$config{MAX_CHANNE} = "20"; # Default Max. Channels per user -if (defined $opt_maxchans) +else { - $config{MAX_CHANNE} = $opt_maxchans; + if ($^O eq "freebsd") + { + # default: use base ssl + chomp($config{HAS_OPENSSL} = `openssl version | cut -d ' ' -f 2`); # OpenSSL version, freebsd specific + chomp($config{HAS_OPENSSL_PORT} = `pkg-config --modversion openssl 2>/dev/null`); # Port version, may be different + } + else + { + chomp($config{HAS_OPENSSL} = `pkg-config --modversion openssl 2>/dev/null`); # Openssl version, others + $config{HAS_OPENSSL_PORT} = ""; + $config{USE_FREEBSD_BASE_SSL} = "n"; + } } -$config{MAX_OPERCH} = "60"; # Default Max. Channels per oper -if (defined $opt_opermaxchans) + +chomp(our $gnutls_ver = $config{HAS_GNUTLS}); +chomp(our $openssl_ver = $config{HAS_OPENSSL}); +$config{USE_GNUTLS} = "n"; +if (defined $opt_use_gnutls) { - $config{MAX_OPERCH} = $opt_opermaxchans; + $config{USE_GNUTLS} = "y"; # Use gnutls. } -$config{MAXI_MODES} = "20"; # Default Max. Number of Modes set at once. -if (defined $opt_modes) +$config{USE_OPENSSL} = "n"; # Use openssl. +if (defined $opt_use_openssl) { - $config{MAXI_MODES} = $opt_modes; + $config{USE_OPENSSL} = "y"; } -$config{HAS_STRLCPY} = "false"; # strlcpy Check. -$config{HAS_STDINT} = "false"; # stdint.h check -$config{USE_KQUEUE} = "y"; # kqueue enabled -if (defined $opt_kqueue) -{ - $config{USE_KQUEUE} = "y"; + +if (!defined $opt_disable_debug) { + $config{OPTIMISATI} = "-g1"; # Optimisation Flag +} else { + $config{OPTIMISATI} = "-O2"; } -if (defined $opt_nokqueue) -{ + +$config{HAS_STRLCPY} = "false"; # strlcpy Check. +$config{HAS_STDINT} = "false"; # stdint.h check +$config{USE_KQUEUE} = "y"; # kqueue enabled +if (defined $opt_nokqueue) { $config{USE_KQUEUE} = "n"; } -$config{USE_EPOLL} = "y"; # epoll enabled -if (defined $opt_epoll) -{ - $config{USE_EPOLL} = "y"; -} +$config{USE_POLL} = "y"; # poll enabled +$config{USE_EPOLL} = "y"; # epoll enabled if (defined $opt_noepoll) { $config{USE_EPOLL} = "n"; } -$config{IPV6} = "n"; # IPv6 support (experimental) -if (defined $opt_ipv6) +$config{USE_PORTS} = "y"; # epoll enabled +if (defined $opt_noports) { - $config{IPV6} = "y"; -} -$config{SUPPORT_IP6LINKS} = "y"; # IPv4 supporting IPv6 links (experimental) -if (defined $opt_ipv6links) + $config{USE_PORTS} = "n"; +} +$config{_SOMAXCONN} = SOMAXCONN; # Max connections in accept queue +$config{OSNAME} = $^O; # Operating System Name +$config{IS_DARWIN} = "NO"; # Is OSX? +$config{STARTSCRIPT} = "inspircd"; # start script? +$config{DESTINATION} = "BASE"; # Is target path. +if ($config{OSNAME} =~ /darwin/i) { - $config{SUPPORT_IP6LINKS} = "y"; + $config{IS_DARWIN} = "YES"; + $config{STARTSCRIPT} = "org.inspircd.plist"; # start script for OSX. + $config{CC} = "xcrun clang++"; # C++ compiler for OSX. } -if (defined $opt_noipv6links) +else { - $config{SUPPORT_IP6LINKS} = "n"; + $config{CC} = "g++"; # C++ compiler } -$config{STATIC_LINK} = "no"; # are doing static modules? -chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`); # FD Limit -chomp($config{MAX_DESCRIPTORS} = `sh -c \"ulimit -n\"`); # Hard FD Limit -chomp($config{GCCVER} = `g++ -dumpversion | cut -c 1`); # Major GCC Version -chomp($config{OSNAME} = `uname`); # Operating System Name -$config{CC} = "g++"; # C++ compiler if (defined $opt_cc) { $config{CC} = $opt_cc; } -$exec = $config{CC} . " -dumpversion | cut -c 1"; -chomp($config{GCCVER} = `$exec`); # Major GCC Version -$config{MAKEORDER} = "ircd mods"; # build order -$config{STATICLIBS} = ""; # library archive path -$config{MAX_IDENT} = "12"; # max ident size -$config{MAX_QUIT} = "255"; # max quit message size -$config{MAX_TOPIC} = "307"; # max topic size -$config{MAX_KICK} = "255"; # max kick message size -$config{MAX_GECOS} = "128"; # max GECOS size -$config{MAX_AWAY} = "200"; # max AWAY size -if (defined $opt_ident) -{ - $config{MAX_IDENT} = $opt_ident; -} -if (defined $opt_quit) -{ - $config{MAX_QUIT} = $opt_quit; -} -if (defined $opt_topic) -{ - $config{MAX_TOPIC} = $opt_topic; -} -if (defined $opt_kick) -{ - $config{MAX_KICK} = $opt_kick; -} -if (defined $opt_gecos) -{ - $config{MAX_GECOS} = $opt_gecos; -} -if (defined $opt_away) -{ - $config{MAX_AWAY} = $opt_away; -} - -$no_svn = 0; +our $exec = $config{CC} . " -dumpversion | cut -c 1"; +chomp($config{GCCVER} = `$exec`); # Major GCC Version +$exec = $config{CC} . " -dumpversion | cut -c 3"; +chomp($config{GCCMINOR} = `$exec`); +$config{MAXBUF} = "512"; # Max buffer size -$config{HAS_OPENSSL} =~ /OpenSSL ([-[:digit:].]+)([a-z])? (\w{3}|[0-9]+) (\w{3}|[0-9]+) [0-9]{4}/; -$config{HAS_OPENSSL} = $1; +if ($config{HAS_OPENSSL} =~ /^([-[:digit:].]+)(?:[a-z])?(?:\-[a-z][0-9])?/) { + $config{HAS_OPENSSL} = $1; +} else { + $config{HAS_OPENSSL} = ""; +} -if ($config{GCCVER} eq "") { - print $config{CC} . " was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n"; +if (($config{GCCVER} eq "") || ($config{GCCMINOR} eq "")) { + if ($config{IS_DARWIN} eq "YES") { + print $config{CC} . " was not found! You require clang++ (the LLVM C++ compiler, part of the OSX developer tools) to build InspIRCd!\n"; + } else { + print $config{CC} . " was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n"; + } exit; } -# Minihack! Convert Cygwin to 'Cyg-Static' so i can -# Keep my dynamic module experiments here for later -# concideration! +# Get and Set some important vars.. +getmodules(); -if ($config{OSNAME} =~ /CYGWIN/) -{ - $config{OSNAME} = "CYG-STATIC"; -} -elsif($config{OSNAME} =~ /^MINGW32/) +sub clean { - $config{OSNAME} = "MINGW32"; -} -elsif ((!$config{OSNAME}) || ($config{OSNAME} eq "")) -{ - chomp($config{OSNAME} = `/usr/bin/uname`); - - if((!$config{OSNAME}) || ($config{OSNAME} eq "")) - { - $config{OSNAME} = "Unknown"; - } + unlink(".config.cache"); } -if (!$config{MAX_CLIENT_T}) { - $config{MAX_CLIENT_T} = 1024; # Set a reasonable 'Default' - $fd_scan_fail = "true"; # Used Later -} - -# Get and Set some important vars.. -getmodules(); +our ($has_epoll, $has_ports, $has_kqueue) = (0, 0, 0); -my $arg = $ARGV[0]; # Do Some Argument Checks.. -if ($arg eq "-clean") { - system("rm -rf .config.cache"); -} # Remove the config.cache file. - -if ($arg eq "-update") { - # Does the cache file exist? - if (!getcache()) { - # No, No it doesn't.. *BASH* - print "You have not run ./configure before. Please do this before trying to run the update script.\n"; - exit 0; - } else { - # We've Loaded the cache file and all our variables.. - print "Updating Files..\n"; - getosflags(); - $has_epoll = $config{HAS_EPOLL}; - $has_kqueue = $config{HAS_KQUEUE}; - writefiles(1); - print "Complete.\n"; - exit; +sub update +{ + eval { + chomp($topdir = getcwd()); + $this = resolve_directory($topdir); # PWD, Regardless. + getmodules(); + # Does the cache file exist? + if (!getcache()) { + # No, No it doesn't.. *BASH* + print "You have not run ./configure before. Please do this before trying to run the update script.\n"; + exit 0; + } else { + # We've Loaded the cache file and all our variables.. + print "Updating files...\n"; + if (defined($opt_disable_debug) && $opt_disable_debug == 1) + { + print "Disabling debug information (-g).\n"; + $config{OPTIMISATI} = ""; + } + $has_epoll = $config{HAS_EPOLL}; + $has_ports = $config{HAS_PORTS}; + $has_kqueue = $config{HAS_KQUEUE}; + writefiles(1); + makecache(); + print "Complete.\n"; + exit; + } + }; + if ($@) + { + print "Configure update failed: $@\n"; } -} - -if ($arg eq "-modupdate") { - # Does the cache file exist? - if (!getcache()) { - # No, No it doesn't.. *BASH* - print "You have not run ./configure before. Please do this before trying to run the update script.\n"; - exit 0; - } else { - # We've Loaded the cache file and all our variables.. - print "Updating Files..\n"; - getosflags(); - $has_epoll = $config{HAS_EPOLL}; - $has_kqueue = $config{HAS_KQUEUE}; - writefiles(0); - print "Complete.\n"; - exit; - } + exit; } - -if ($arg eq "-svnupdate") { +sub test_compile { + my $feature = shift; my $fail = 0; - open(FH,"<.svn/entries") or $fail = 1; - if ($fail) { - print "This is not an SVN copy of InspIRCd.\n"; - exit; - } - system("svn update"); - system("perl configure -update"); - if ($ARGV[1] eq "rebuild") { - system("make install"); - } - exit; + $fail ||= system "$config{CC} -o test_$feature make/check_$feature.cpp >/dev/null 2>&1"; + $fail ||= system "./test_$feature"; + unlink "test_$feature"; + return !$fail; } print "Running non-interactive configure...\n" unless $interactive; +print "Checking for cache from previous configure... "; +print ($cache_loaded ? "found\n" : "not found\n"); +$config{SYSTEM} = lc $^O; +print "Checking operating system version... $config{SYSTEM}\n"; -print "Checking for cache from previous configure...\n"; -getcache(); -print "Checking operating system version...\n"; -getosflags(); - -if (defined $opt_maxclients) -{ - $config{MAX_CLIENT} = $opt_maxclients; -} - -if (!$config{MAX_CLIENT}) { - # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this - # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go - # higher than the found value" :)) - $config{MAX_CLIENT} = $config{MAX_CLIENT_T}; -} +$exec = $config{CC} . " -dumpversion | cut -c 1"; +chomp($config{GCCVER} = `$exec`); # Major GCC Version +$exec = $config{CC} . " -dumpversion | cut -c 3"; +chomp($config{GCCMINOR} = `$exec`); printf "Checking if stdint.h exists... "; $config{HAS_STDINT} = "true"; -my $fail = 0; +our $fail = 0; open(STDINT, ")) { + while (defined(my $line = )) { + chomp($line); # try and find the delcaration of: # size_t strlcpy(...) if ($line =~ /size_t(\0x9|\s)+strlcpy/) { @@ -389,14 +384,14 @@ if (!$fail) { print "yes\n" if $config{HAS_STRLCPY} eq "true"; print "no\n" if $config{HAS_STRLCPY} eq "false"; - printf "Checking if kqueue exists... "; $has_kqueue = 0; $fail = 0; open(KQUEUE, ")) { - # try and find the delcaration of: + while (defined(my $line = )) { + chomp($line); + # try and find the delcaration of: # int kqueue(void); if ($line =~ /int(\0x9|\s)+kqueue/) { $has_kqueue = 1; @@ -407,107 +402,139 @@ if (!$fail) { print "yes\n" if $has_kqueue == 1; print "no\n" if $has_kqueue == 0; -printf "Checking if epoll exists... "; -$has_epoll = 0; -$fail = 0; -open(EPOLL, "= 1.2) || ($config{HAS_GNUTLS} eq "y"))) { - print "yes\n"; - $config{HAS_GNUTLS} = "y"; +if (defined($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS}) || ($config{HAS_GNUTLS} eq "y"))) { + if (defined($gnutls_ver) && ($gnutls_ver ne "")) { + print "yes\n"; + $config{HAS_GNUTLS} = "y"; + } else { + print "no\n"; + $config{HAS_GNUTLS} = "n"; + } } else { print "no\n"; $config{HAS_GNUTLS} = "n"; } printf "Checking for openssl... "; -if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPENSSL} eq "y"))) { - print "yes\n"; - $config{HAS_OPENSSL} = "y"; +if (defined($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL}) || ($config{HAS_OPENSSL} eq "y"))) { + if (defined($openssl_ver) && ($openssl_ver ne "")) { + print "yes\n"; + $config{HAS_OPENSSL} = "y"; + } else { + print "no\n"; + $config{HAS_OPENSSL} = "n"; + } } else { print "no\n"; $config{HAS_OPENSSL} = "n"; } +printf "Checking if you are running an ancient, unsupported OS... "; +if ($config{OSNAME} =~ /FreeBSD/i) +{ + my $version = `uname -r`; + if ($version =~ /^4\./) + { + print "yes.\n"; + print "FreeBSD 4.x is no longer supported. By ANYONE.\n"; + print "To build, you will need to add the following to CXXFLAGS:\n"; + print "\t-L/usr/local/lib -lgnugetopt -DHAVE_DECL_GETOPT=1\n"; + } + else + { + print "no ($version)\n"; + } +} +else +{ + print "no ($config{OSNAME})\n"; +} + ################################################################################ -# BEGIN INTERACTIVE PART # +# BEGIN INTERACTIVE PART # ################################################################################ # Clear the Screen.. if ($interactive) { - system("clear"); - # Display Splash Logo.. - show_splash(); - chomp($wholeos = `uname -mnr`); + print "\e[2J\e[0G\e[0d"; # J = Erase in Display, 2 = Entire Screen, (G, d) = Move cursor to (..,..) + my $wholeos = $^O; my $rev = getrevision(); # Display Introduction Message.. - print " -Welcome to the InspIRCd Configuration program! + print <<"STOP" ; +Welcome to the \e[1mInspIRCd\e[0m configuration program! (\e[1minteractive mode\e[0m) +\e[1mPackage maintainers: Type ./configure --help for non-interactive help\e[0m *** If you are unsure of any of these values, leave it blank for *** *** standard settings that will work, and your server will run *** -*** using them. If you are running this server as part of a *** -*** larger network, you must consult with your network admins *** -*** for the proper values to use, or server links will be unstable! *** +*** using them. Please consult your IRC network admin if in doubt. *** -Press \033[1m\033[0m to accept the default for any option, or enter -a new value. Please note: You will \033[1mHAVE\033[0m to read the docs +Press \e[1m\e[0m to accept the default for any option, or enter +a new value. Please note: You will \e[1mHAVE\e[0m to read the docs dir, otherwise you won't have a config file! -Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $config{MAX_CLIENT_T} -Your InspIRCd revision ID is \033[1;32mr$rev\033[0m"; +Your operating system is: \e[1;32m$config{OSNAME}\e[0m ($wholeos) +Your InspIRCd revision ID is \e[1;32mr$rev\e[0m +STOP if ($rev eq "r0") { print " (Non-SVN build)"; } print ".\n\n"; $config{CHANGE_COMPILER} = "n"; - print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n"; + print "I have detected the following compiler: \e[1;32m$config{CC}\e[0m (version \e[1;32m$config{GCCVER}.$config{GCCMINOR}\e[0m)\n"; while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) { - print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and + print "\e[1;32mIMPORTANT!\e[0m A GCC 2.x compiler has been detected, and should NOT be used. You should probably specify a newer compiler.\n\n"; - yesno(CHANGE_COMPILER,"Do you want to change the compiler?"); + yesno('CHANGE_COMPILER',"Do you want to change the compiler?"); if ($config{CHANGE_COMPILER} =~ /y/i) { print "What command do you want to use to invoke your compiler?\n"; - print "[\033[1;32m$config{CC}\033[0m] -> "; + print "[\e[1;32m$config{CC}\e[0m] -> "; chomp($config{CC} = ); if ($config{CC} eq "") { $config{CC} = "g++"; } - chomp($foo = `$config{CC} -dumpversion | cut -c 1`); + chomp(my $foo = `$config{CC} -dumpversion | cut -c 1`); if ($foo ne "") { chomp($config{GCCVER} = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change compilers - print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n"; + chomp($config{GCCMINOR} = `$config{CC} -dumpversion | cut -c 3`); + print "Queried compiler: \e[1;32m$config{CC}\e[0m (version \e[1;32m$config{GCCVER}.$config{GCCMINOR}\e[0m)\n"; if ($config{GCCVER} < 3) { - print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n"; + print "\e[1;32mGCC 2.x WILL NOT WORK!\e[0m. Let's try that again, shall we?\n"; } } else { - print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n"; + print "\e[1;32mWARNING!\e[0m Could not execute the compiler you specified. You may want to try again.\n"; } } } @@ -518,432 +545,194 @@ should NOT be used. You should probably specify a newer compiler.\n\n"; my $tmpbase = $config{BASE_DIR}; dir_check("do you wish to install the InspIRCd base", "BASE_DIR"); if ($tmpbase ne $config{BASE_DIR}) { - $config{CONFIG_DIR} = resolve_directory($config{BASE_DIR}."/conf"); # Configuration Dir - $config{MODULE_DIR} = resolve_directory($config{BASE_DIR}."/modules"); # Modules Directory - $config{BINARY_DIR} = resolve_directory($config{BASE_DIR}."/bin"); # Binary Directory - $config{LIBRARY_DIR} = resolve_directory($config{BASE_DIR}."/lib"); # Library Directory + $config{CONFIG_DIR} = resolve_directory($config{BASE_DIR}."/conf"); # Configuration Dir + $config{MODULE_DIR} = resolve_directory($config{BASE_DIR}."/modules"); # Modules Directory + $config{DATA_DIR} = resolve_directory($config{BASE_DIR}."/data"); # Data Directory + $config{LOG_DIR} = resolve_directory($config{BASE_DIR}."/logs"); # Log Directory + $config{BINARY_DIR} = resolve_directory($config{BASE_DIR}."/bin"); # Binary Directory } dir_check("are the configuration files", "CONFIG_DIR"); dir_check("are the modules to be compiled to", "MODULE_DIR"); dir_check("is the IRCd binary to be placed", "BINARY_DIR"); - dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR"); - + dir_check("are variable data files to be located in", "DATA_DIR"); + dir_check("are the logs to be stored in", "LOG_DIR"); + dir_check("do you want the build to take place", "BUILD_DIR"); + + my $chose_hiperf = 0; if ($has_kqueue) { - yesno(USE_KQUEUE,"You are running a BSD operating system, and kqueue\nwas detected. Would you like to enable kqueue support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable kqueue?"); + yesno('USE_KQUEUE',"You are running a BSD operating system, and kqueue\nwas detected. Would you like to enable kqueue support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable kqueue?"); print "\n"; + if ($config{USE_KQUEUE} eq "y") { + $chose_hiperf = 1; + } } if ($has_epoll) { - yesno(USE_EPOLL,"You are running a Linux 2.6+ operating system, and epoll\nwas detected. Would you like to enable epoll support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable epoll?"); - print "\n"; - } - $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y")); - if (!$chose_hiperf) { - print "No high-performance socket engines are available, or you chose\n"; - print "not to enable one. Defaulting to select() engine.\n\n"; - } - - yesno(IPV6,"Would you like to build InspIRCd with IPv6 support?"); - print "\n"; - - if ($config{IPV6} eq "y") { - print "You have chosen to build an \033[1;32mIPV6-only\033[0m server.\nTo accept IPV4 users, you must use the '::ffff:' notation of addresses.\n\n"; - $config{SUPPORT_IP6LINKS} = "y"; - } else { - yesno(SUPPORT_IP6LINKS,"You have chosen to build an \033[1;32mIPV4-only\033[0m server.\nWould you like to enable support for linking to IPV6-enabled\nInspIRCd servers which are using '::ffff:' notation?\nIf you are using a recent operating\nsystem and are unsure, answer yes."); + yesno('USE_EPOLL',"You are running a Linux 2.6+ operating system, and epoll\nwas detected. Would you like to enable epoll support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable epoll?"); print "\n"; - } - - if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) { - print "I have detected both GnuTLS and OpenSSL on your system.\n"; - print "I will default to GnuTLS. If you wish to use OpenSSL\n"; - print "instead, you should enable the OpenSSL module yourself\n"; - print "by copying it from src/modules/extra to src/modules.\n\n"; - } - - if ($config{HAS_GNUTLS} eq "y") { - yesno(USE_GNUTLS, "Would you like to enable SSL Support?"); - if ($config{USE_GNUTLS} eq "y") { - print "\nUsing GnuTLS SSL module.\n"; - } - } elsif ($config{HAS_OPENSSL} eq "y") { - yesno(USE_OPENSSL, "Would you like to enable SSL Support?"); - if ($config{USE_OPENSSL} eq "y") { - print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n"; + if ($config{USE_EPOLL} eq "y") { + $chose_hiperf = 1; } } - - print "\nThe following questions will ask you for various figures relating\n"; - print "To your IRCd install. Please note that these should usually be left\n"; - print "as defaults unless you have a real reason to change them. If they\n"; - print "changed, then the values must be identical on all servers on your\n"; - print "network, or malfunctions and/or crashes may occur, with the exception\n"; - print "of the 'maximum number of clients' setting which may be different on\n"; - print "different servers on the network.\n\n"; - - # File Descriptor Settings.. - my $continue = 0; - while (!$continue) { - print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n"; - print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{MAX_CLIENT}; - } - if ($var =~ /^\d+$/) { - if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) { - # Client has entered a larger number than the 'discovered' value - # Confirm. - print "WARNING: Our scans have indicated that you are attempting -to use more sockets than there are avaliable. Are you sure -you wish to do this? It may cause the IRCd to malfunction [y/n] -[\033[1;32mn\033[0m] -> $c"; - chomp($tmp = ); - if ($tmp ne "y") { - print "Please enter the correct value.\n\n"; - next; - } - } - } else { - print "You must enter a number in this field. Please try again.\n\n"; - next; - } - # If we get here, we should be good to go. - $config{MAX_CLIENT} = $var; - $continue = 1; + if ($has_ports) { + yesno('USE_PORTS',"You are running Solaris 10.\nWould you like to enable I/O completion ports support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable support for I/O completion ports?"); print "\n"; - } - - my $continue = 0; - while (!$continue) { - print "What is the maximum length of nicknames?\n"; - print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{NICK_LENGT}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{NICK_LENGT} = $var; - $continue = 1; - print "\n"; - } else { - print "You must enter a number in this field. Please try again.\n\n"; + if ($config{USE_PORTS} eq "y") { + $chose_hiperf = 1; } } - $continue = 0; - while (!$continue) { - print "What is the maximum length of channel names?\n"; - print "[\033[1;32m$config{CHAN_LENGT}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{CHAN_LENGT}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{CHAN_LENGT} = $var; - $continue = 1; - print "\n"; - } else { - print "You must enter a number in this field. Please try again.\n\n"; + if (!$chose_hiperf) { + yesno('USE_POLL', "Would you like to use poll?\n This is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable poll?"); + if ($config{USE_POLL} ne "y") + { + print "No high-performance socket engines are available, or you chose\n"; + print "not to enable one. Defaulting to select() engine.\n\n"; } } - $continue = 0; - while (!$continue) { - print "What is the maximum number of channels a normal user may join at any one time?\n"; - print "[\033[1;32m$config{MAX_CHANNE}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{MAX_CHANNE}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{MAX_CHANNE} = $var; - $continue = 1; - print "\n"; - } else { - print "You must enter a number in this field. Please try again.\n\n"; - } - } + $config{USE_FREEBSD_BASE_SSL} = "n"; + $config{USE_FREEBSD_PORTS_SSL} = "n"; + if ($config{HAS_OPENSSL_PORT} ne "") + { + $config{USE_FREEBSD_PORTS_SSL} = "y"; + print "I have detected the OpenSSL FreeBSD port installed on your system,\n"; + print "version \e[1;32m".$config{HAS_OPENSSL_PORT}."\e[0m. Your base system OpenSSL is version \e[1;32m".$openssl_ver."\e[0m.\n\n"; + yesno('USE_FREEBSD_PORTS_SSL', "Do you want to use the FreeBSD ports version?"); + print "\n"; + $config{USE_FREEBSD_BASE_SSL} = "y" if ($config{USE_FREEBSD_PORTS_SSL} eq "n"); - $continue = 0; - while (!$continue) { - print "What is the maximum number of channels an oper may join at any one time?\n"; - print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{MAX_OPERCH}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{MAX_OPERCH} = $var; - $continue = 1; - print "\n"; + if ($config{USE_FREEBSD_BASE_SSL} eq "n") + { + # update to port version + $openssl_ver = $config{HAS_OPENSSL_PORT}; } } - - $continue = 0; - while (!$continue) { - print "What is the maximum number of mode changes in one line?\n"; - print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{MAXI_MODES}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{MAXI_MODES} = $var; - $continue = 1; - print "\n"; - } else { - print "You must enter a number in this field. Please try again.\n\n"; - } + else + { + $config{USE_FREEBSD_BASE_SSL} = "y" if ($^O eq "freebsd"); } - $continue = 0; - while (!$continue) { - print "What is the maximum length of an ident (username)?\n"; - print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{MAX_IDENT}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{MAX_IDENT} = $var; - $continue = 1; - print "\n"; - } else { - print "You must enter a number in this field. Please try again.\n\n"; - } - } + $config{USE_SSL} = "n"; + $config{MODUPDATE} = 'n'; - $continue = 0; - while (!$continue) { - print "What is the maximum length of a quit message?\n"; - print "[\033[1;32m$config{MAX_QUIT}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{MAX_QUIT}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{MAX_QUIT} = $var; - $continue = 1; - print "\n"; - } else { - print "You must enter a number in this field. Please try again.\n\n"; - } - } + if ($config{HAS_GNUTLS} eq "y" || $config{HAS_OPENSSL} eq "y") + { + print "Detected GnuTLS version: \e[1;32m" . $gnutls_ver . "\e[0m\n"; + print "Detected OpenSSL version: \e[1;32m" . $openssl_ver . "\e[0m\n\n"; - $continue = 0; - while (!$continue) { - print "What is the maximum length of a channel topic?\n"; - print "[\033[1;32m$config{MAX_TOPIC}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{MAX_TOPIC}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{MAX_TOPIC} = $var; - $continue = 1; - print "\n"; - } else { - print "You must enter a number in this field. Please try again.\n\n"; - } - } + yesno('USE_SSL', "One or more SSL libraries detected. Would you like to enable SSL support?"); + if ($config{USE_SSL} eq "y") + { + if ($config{HAS_GNUTLS} eq "y") + { + yesno('USE_GNUTLS',"Would you like to enable SSL with m_ssl_gnutls? (recommended)"); + if ($config{USE_GNUTLS} eq "y") + { + print "\nUsing GnuTLS SSL module.\n"; + } + } - $continue = 0; - while (!$continue) { - print "What is the maximum length of a kick message?\n"; - print "[\033[1;32m$config{MAX_KICK}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{MAX_KICK}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{MAX_KICK} = $var; - $continue = 1; - print "\n"; - } else { - print "You must enter a number in this field. Please try again.\n\n"; + if ($config{HAS_OPENSSL} eq "y") + { + yesno('USE_OPENSSL', "Would you like to enable SSL with m_ssl_openssl?"); + if ($config{USE_OPENSSL} eq "y") + { + print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n"; + } + } } } - - $continue = 0; - while (!$continue) { - print "What is the maximum length of a GECOS (real name) field?\n"; - print "[\033[1;32m$config{MAX_GECOS}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{MAX_GECOS}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{MAX_GECOS} = $var; - $continue = 1; - print "\n"; - } else { - print "You must enter a number in this field. Please try again.\n\n"; - } + else + { + print "\nCould not detect OpenSSL or GnuTLS. Make sure pkg-config is installed and\n"; + print "is in your path.\n\n"; } - $continue = 0; - while (!$continue) { - print "What is the maximum length of an away message?\n"; - print "[\033[1;32m$config{MAX_AWAY}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{MAX_AWAY}; - } - if ($var =~ /^\d+$/) { - # We don't care what the number is, set it and be on our way. - $config{MAX_AWAY} = $var; - $continue = 1; - print "\n"; - } else { - print "You must enter a number in this field. Please try again.\n\n"; - } + yesno('MODUPDATE',"Would you like to check for updates to third-party modules?"); + print "\n"; + if ($config{MODUPDATE} eq "y") { + print "Checking for upgrades to extra and third-party modules... "; + system "./modulemanager upgrade"; } +} - # Code Optimisation - print "Enter the Level Of Binary optimisation. This is a number between 0 and 3. -The InspIRCd Team will NOT support any bug reports above 0. Also note, -the IRCd behaviour will be different depending on this value. Please -read the documentation for more information. - -The higher the number, the more optimised your binary will be. This -value will default to 0 if you either don't enter a number, or enter -a value outside the range. - -As always, if you are unsure, just press enter and accept the default.\n\n"; - print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> "; - chomp($var = ); - if ($var eq "") { - $var = $config{OPTIMITEMP}; - } +# We are on a POSIX system, we can enable POSIX extras without asking +symlink "extra/m_regex_posix.cpp", "src/modules/m_regex_posix.cpp"; - if ($var eq "1") { - $config{OPTIMITEMP} = 1; - $config{OPTIMISATI} = "-O"; - } elsif ($var eq "2") { - $config{OPTIMITEMP} = 2; - $config{OPTIMISATI} = "-O2"; - } elsif ($var eq "3") { - $config{OPTIMITEMP} = 3; - $config{OPTIMISATI} = "-O3"; - } else { - $config{OPTIMITEMP} = 0; - $config{OPTIMISATI} = "-g"; - } +dumphash(); + +if (($config{USE_GNUTLS} eq "y") && ($config{HAS_GNUTLS} ne "y")) +{ + print "Sorry, but I couldn't detect GnuTLS. Make sure gnutls-config is in your path.\n"; + exit(0); +} +if (($config{USE_OPENSSL} eq "y") && ($config{HAS_OPENSSL} ne "y")) +{ + print "Sorry, but I couldn't detect OpenSSL. Make sure openssl is in your path.\n"; + exit(0); } +our $failed = 0; -print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n"; -print "\033[0mBase install path:\033[1;32m\t\t$config{BASE_DIR}\033[0m\n"; -print "\033[0mConfig path:\033[1;32m\t\t\t$config{CONFIG_DIR}\033[0m\n"; -print "\033[0mModule path:\033[1;32m\t\t\t$config{MODULE_DIR}\033[0m\n"; -print "\033[0mLibrary path:\033[1;32m\t\t\t$config{LIBRARY_DIR}\033[0m\n"; -print "\033[0mMax connections:\033[1;32m\t\t$config{MAX_CLIENT}\033[0m\n"; -print "\033[0mMax User Channels:\033[1;32m\t\t$config{MAX_CHANNE}\033[0m\n"; -print "\033[0mMax Oper Channels:\033[1;32m\t\t$config{MAX_OPERCH}\033[0m\n"; -print "\033[0mMax nickname length:\033[1;32m\t\t$config{NICK_LENGT}\033[0m\n"; -print "\033[0mMax channel length:\033[1;32m\t\t$config{CHAN_LENGT}\033[0m\n"; -print "\033[0mMax mode length:\033[1;32m\t\t$config{MAXI_MODES}\033[0m\n"; -print "\033[0mMax ident length:\033[1;32m\t\t$config{MAX_IDENT}\033[0m\n"; -print "\033[0mMax quit length:\033[1;32m\t\t$config{MAX_QUIT}\033[0m\n"; -print "\033[0mMax topic length:\033[1;32m\t\t$config{MAX_TOPIC}\033[0m\n"; -print "\033[0mMax kick length:\033[1;32m\t\t$config{MAX_KICK}\033[0m\n"; -print "\033[0mMax name length:\033[1;32m\t\t$config{MAX_GECOS}\033[0m\n"; -print "\033[0mMax away length:\033[1;32m\t\t$config{MAX_AWAY}\033[0m\n"; -print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.x\033[0m\n"; -print "\033[0mOptimization Flag:\033[1;32m\t\t$config{OPTIMISATI}\033[0m\n"; -print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n"; -print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n"; -print "\033[0mIPv6 Support:\033[1;32m\t\t\t$config{IPV6}\033[0m\n"; -print "\033[0mIPv6 to IPv4 Links:\033[1;32m\t\t$config{SUPPORT_IP6LINKS}\033[0m\n"; -print "\033[0mGnuTLS Support:\033[1;32m\t\t\t$config{USE_GNUTLS}\033[0m\n"; -print "\033[0mOpenSSL Support:\033[1;32m\t\t$config{USE_OPENSSL}\033[0m\n\n"; +$config{CERTGEN} ||= 'y'; +yesno('CERTGEN',"Would you like to generate SSL certificates now?") if ($interactive && ($config{USE_GNUTLS} eq "y" || $config{USE_OPENSSL} eq "y")); if ($config{USE_GNUTLS} eq "y") { - $failed = 0; - open(TMP, ") { chomp; # Ignore Blank lines, and comments.. next if /^\s*$/; next if /^\s*#/; - my ($key, $value) = split("=", $_); + my ($key, $value) = split("=", $_, 2); $value =~ /^\"(.*)\"$/; # Do something with data here! $config{$key} = $1; } - close(CONFIG); - return "true"; + close(CACHE); + return 1; } sub makecache { # Dump the contents of %config - print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n"; + print "Writing \e[1;32mcache file\e[0m for future ./configures ...\n"; open(FILEHANDLE, ">.config.cache"); - foreach $key (keys %config) { + foreach my $key (keys %config) { print FILEHANDLE "$key=\"$config{$key}\"\n"; } close(FILEHANDLE); @@ -1017,8 +806,8 @@ sub dir_check { my $complete = 0; while (!$complete) { print "In what directory $desc?\n"; - print "[\033[1;32m$config{$hash_key}\033[0m] -> "; - chomp($var = ); + print "[\e[1;32m$config{$hash_key}\e[0m] -> "; + chomp(my $var = ); if ($var eq "") { $var = $config{$hash_key}; } @@ -1026,22 +815,24 @@ sub dir_check { # Convert it to a full path.. $var = resolve_directory($ENV{HOME} . "/" . $1); } - elsif ((($config{OSNAME} == "MINGW32") and ($var !~ /^[A-Z]{1}:\\.*/)) and (substr($var,0,1) ne "/")) + elsif ((($config{OSNAME} =~ /MINGW32/i) and ($var !~ /^[A-Z]{1}:\\.*/)) and (substr($var,0,1) ne "/")) { # Assume relative Path was given.. fill in the rest. $var = $this . "/$var"; } - - $var = resolve_directory($var); + + $var = resolve_directory($var); if (! -e $var) { - print "$var does not exist. Create it?\n[\033[1;32my\033[0m] "; - chomp($tmp = ); + print "$var does not exist. Create it?\n[\e[1;32my\e[0m] "; + chomp(my $tmp = ); if (($tmp eq "") || ($tmp =~ /^y/i)) { # Attempt to Create the Dir.. - - system("mkdir -p \"$var\" >> /dev/null 2>&1"); - $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256; - if ($chk != 0) { + my $chk = eval { + use File::Path (); + File::Path::mkpath($var, 0, 0777); + 1; + }; + unless (defined($chk) && -d $var) { print "Unable to create directory. ($var)\n\n"; # Restart Loop.. next; @@ -1065,163 +856,50 @@ sub dir_check { } } -sub getosflags { - if ($config{OSNAME} =~ /BSD$/) { - $config{LDLIBS} = "-lstdc++"; - $config{FLAGS} = "-fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}"; - $config{MAKEPROG} = "gmake"; - if ($config{OSNAME} eq "OpenBSD") { - chomp($foo = `eg++ -dumpversion | cut -c 1`); - # theyre running the package version of gcc (eg++)... detect it and set up its version numbers. - # if theyre not running this, configure lets the build continue but they probably wont manage to - # compile as this standard version is 2.95.3! - if ($foo ne "") { - $config{CC} = "eg++"; - chomp($config{GCCVER} = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change the compiler path - } - } - } else { - $config{LDLIBS} = "-ldl -lstdc++"; - $config{FLAGS} = "-fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}"; - $config{MAKEPROG} = "make"; - if ($config{OSNAME} =~ /CYGWIN/) { - $config{FLAGS} = "-Wall -Woverloaded-virtual $config{OPTIMISATI}"; - $config{LDLIBS} = ""; - $config{MAKEPROG} = "/usr/bin/make"; - $config{MAKEORDER} = "ircd mods"; - } elsif ($config{OSNAME} eq "CYG-STATIC") { - $config{FLAGS} = "-Wall -Woverloaded-virtual $config{OPTIMISATI}"; - $config{LDLIBS} = ""; - $config{MAKEPROG} = "/usr/bin/make"; - $config{MAKEORDER} = "mods ircd"; - $config{STATICLIBS} = "modules/mods.a"; - $config{STATIC_LINK} = "yes"; - } - } - - if ($config{OSNAME} =~ /SunOS/) - { - # solaris/sunos needs these - # socket = bsd sockets api - # nsl = dns stuff - # rt = POSIX realtime extensions - # resolv = inet_aton only (why isnt this in nsl?!) - $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv"; - } - - if($config{OSNAME} eq "MINGW32") - { - # All code is position-independent on windows - $config{FLAGS} =~ s/-fPIC //; - } -} - -sub is_dir { - my ($path) = @_; - if (chdir($path)) { - chdir($this); - return 1; - } else { - # Just in case.. - chdir($this); - return 0; - } -} +our $SHARED = ""; -sub getmodules { - my $i = 0; - print "Detecting modules "; - opendir(DIRHANDLE, "src/modules"); - foreach $name (sort readdir(DIRHANDLE)) { - if ($name =~ /^m_(.+)\.cpp$/) - { - $mod = $1; - if ($mod !~ /_static$/) { - $modlist[$i++] = $mod; - print "."; - } - } - } - closedir(DIRHANDLE); - print "\nOk, $i modules.\n"; -} - -sub getrevision { - if ($no_svn) { - return "0"; - } - my $data = `svn info`; - - if ($data eq "") { - $no_svn = 1; - $rev = "0"; - return $rev; - } - $data =~ /Revision: (\d+)/; - my $rev = $1; - if (!defined($rev)) { - $rev = "0"; - } - return $rev; -} +my ($mliflags, $mfrules, $mobjs, $mfcount) = ("", "", "", 0); sub writefiles { my($writeheader) = @_; # First File.. inspircd_config.h chomp(my $incos = `uname -n -s -r`); - chomp(my $version = `sh ./src/version.sh`); - chomp(my $revision = getrevision()); - $version = "$version(r$revision)"; + chomp(my $version = `sh src/version.sh`); chomp(my $revision2 = getrevision()); + my $branch = "InspIRCd-0.0"; + if ($version =~ /^(InspIRCd-[0-9]+\.[0-9]+)\.[0-9]+/) + { + $branch = $1; + } if ($writeheader == 1) { - print "Writing \033[1;32minspircd_config.h\033[0m\n"; - open(FILEHANDLE, ">include/inspircd_config.h"); - my $NL = $config{NICK_LENGT}+1; - my $CL = $config{CHAN_LENGT}+1; + print "Writing \e[1;32minspircd_config.h\e[0m\n"; + open(FILEHANDLE, ">include/inspircd_config.h.tmp"); print FILEHANDLE <= 3) { print FILEHANDLE "#define GCC3\n"; } @@ -1231,696 +909,344 @@ EOF if ($config{HAS_STDINT} eq "true") { print FILEHANDLE "#define HAS_STDINT\n"; } - if ($config{IPV6} =~ /y/i) { - print FILEHANDLE "#define IPV6\n"; + if ($config{HAS_EVENTFD} eq 'true') { + print FILEHANDLE "#define HAS_EVENTFD\n"; } - if ($config{SUPPORT_IP6LINKS} =~ /y/i) { - print FILEHANDLE "#define SUPPORT_IP6LINKS\n"; + if ($config{OSNAME} !~ /DARWIN/i) { + print FILEHANDLE "#define HAS_CLOCK_GETTIME\n"; } my $use_hiperf = 0; if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) { print FILEHANDLE "#define USE_KQUEUE\n"; - $se = "socketengine_kqueue"; + $config{SOCKETENGINE} = "socketengine_kqueue"; $use_hiperf = 1; } if (($has_epoll) && ($config{USE_EPOLL} eq "y")) { print FILEHANDLE "#define USE_EPOLL\n"; - $se = "socketengine_epoll"; + $config{SOCKETENGINE} = "socketengine_epoll"; + $use_hiperf = 1; + } + if (($has_ports) && ($config{USE_PORTS} eq "y")) { + print FILEHANDLE "#define USE_PORTS\n"; + $config{SOCKETENGINE} = "socketengine_ports"; $use_hiperf = 1; } # user didn't choose either epoll or select for their OS. # default them to USE_SELECT (ewwy puke puke) if (!$use_hiperf) { - print FILEHANDLE "#define USE_SELECT\n"; - $se = "socketengine_select"; + print "no hi-perf, " . $config{USE_POLL}; + if ($config{USE_POLL} eq "y") + { + print FILEHANDLE "#define USE_POLL\n"; + $config{SOCKETENGINE} = "socketengine_poll"; + } + else + { + print FILEHANDLE "#define USE_SELECT\n"; + $config{SOCKETENGINE} = "socketengine_select"; + } } - print FILEHANDLE "\n#endif\n"; + print FILEHANDLE "\n#include \"threadengines/threadengine_pthread.h\"\n\n#endif\n"; close(FILEHANDLE); - } - if ($writeheader) - { - open(FILEHANDLE, ">include/inspircd_se_config.h"); + open(FILEHANDLE, ">include/inspircd_version.h.tmp"); print FILEHANDLE <; + my $line2 = <$fh2>; + if (defined($line1) != defined($line2)) { + $diff = 1; + } elsif (!defined $line1) { + last; + } else { + $diff = ($line1 ne $line2); + } + } + if ($diff) { + unlink $file; + rename "$file.tmp", $file; + } else { + unlink "$file.tmp"; + } } } - chomp($modules); # Remove Redundant whitespace.. - # Write all .in files. my $tmp = ""; my $file = ""; my $exe = "inspircd"; - if ($config{OSNAME} =~ /CYGWIN/) { - $exe = "inspircd.exe"; - } - - opendir(DIRHANDLE, $this); + # Do this once here, and cache it in the .*.inc files, + # rather than attempting to read src/version.sh from + # compiled code -- we might not have the source to hand. + # Fix for bug#177 by Brain. - foreach $name (sort readdir(DIRHANDLE)) { - if ($name =~ /^\.(.+)\.inc$/) { - $file = $1; - # All .name.inc files need parsing! - $tmp = ""; - open(FILEHANDLE, ".$file.inc"); - while () { - $tmp .= $_; - } - close(FILEHANDLE); - - $tmp =~ s/\@CC\@/$config{CC}/; - $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/; - $tmp =~ s/\@FLAGS\@/$config{FLAGS}/; - $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/; - $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/; - $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/; - $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/; - $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/; - $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/; - $tmp =~ s/\@MODULES\@/$modules/; - $tmp =~ s/\@EXECUTABLE\@/$exe/; - $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/; - $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/; - - print "Writing \033[1;32m$file\033[0m\n"; - open(FILEHANDLE, ">$file"); - print FILEHANDLE $tmp; - } - } - closedir(DIRHANDLE); - - # Make inspircd executable! - chmod 0744, 'inspircd'; - - if ($config{STATIC_LINK} eq "yes") { - print "Writing static-build \033[1;32msrc/Makefile\033[0m\n"; - write_static_makefile(); - write_static_modules_makefile(); - } elsif ($config{OSNAME} =~ /CYGWIN/) { - print "Writing cygwin-build \033[1;32msrc/Makefile\033[0m\n"; - write_static_makefile(); - write_dynamic_modules_makefile(); - } else { - print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n"; - write_dynamic_makefile(); - write_dynamic_modules_makefile(); - } -} - -sub getcompilerflags { - my ($file) = @_; - open(FLAGS, $file); - while () { - if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) { - close(FLAGS); - return $1; - } - } - close(FLAGS); - return undef; -} - -sub getlinkerflags { - my ($file) = @_; - open(FLAGS, $file); - while () { - if ($_ =~ /^\/\* \$LinkerFlags: (.+) \*\/$/) { - close(FLAGS); - return $1; - } - } - close(FLAGS); - return undef; -} - -sub show_splash { - print "'\033[1;33m####\033[0m:'\033[1;33m##\033[0m::: \033[1;33m##\033[0m::'\033[1;33m######\033[0m::'\033[1;33m########\033[0m::'\033[1;33m####\033[0m:'\033[1;33m########\033[0m:::'\033[1;33m######\033[0m::'\033[1;33m########\033[0m::\n"; - print ". \033[1;33m##\033[0m:: \033[1;33m###\033[0m:: \033[1;33m##\033[0m:'\033[1;33m##\033[0m... \033[1;33m##\033[0m: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:. \033[1;33m##\033[0m:: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:'\033[1;33m##\033[0m... \033[1;33m##\033[0m: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:\n"; - print ": \033[1;33m##\033[0m:: \033[1;33m####\033[0m: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::..:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::..:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n"; - print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m \033[1;33m##\033[0m \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m########\033[0m::: \033[1;33m##\033[0m:: \033[1;33m########\033[0m:: \033[1;33m##\033[0m::::::: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n"; - print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m. \033[1;33m####\033[0m::..... \033[1;33m##\033[0m: \033[1;33m##\033[0m.....:::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m.. \033[1;33m##\033[0m::: \033[1;33m##\033[0m::::::: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n"; - print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m:. \033[1;33m###\033[0m:'\033[1;33m##\033[0m::: \033[1;33m##\033[0m: \033[1;33m##\033[0m::::::::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m::. \033[1;33m##\033[0m:: \033[1;33m##\033[0m::: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n"; - print "'\033[1;33m####\033[0m: \033[1;33m##\033[0m::. \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m##\033[0m::::::::'\033[1;33m####\033[0m: \033[1;33m##\033[0m:::. \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m########\033[0m::\n"; - print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n"; -} - -sub resolve_directory { - use File::Spec; - return File::Spec->rel2abs($_[0]); -} + chomp($version = `sh ./src/version.sh`); + chomp(my $revision = getrevision()); + $version = "$version(r$revision)"; -sub yesno { - my ($flag,$prompt) = @_; - print "$prompt [\033[1;32m$config{$flag}\033[0m] -> "; - chomp($tmp = ); - if ($tmp eq "") { $tmp = $config{$flag} } + # We can actually parse any file starting with . and ending with .inc, + # but right now we only parse .inspircd.inc to form './inspircd' + prepare_dynamic_makefile(); - if (($tmp eq "") || ($tmp =~ /^y/i)) { - $config{$flag} = "y"; - } else { - $config{$flag} = "n"; - } - return; -} + my @dotfiles = qw(main.mk inspircd); + push @dotfiles, 'org.inspircd.plist' if $config{OSNAME} eq 'darwin'; -sub write_static_modules_makefile { - # Modules Makefile.. - print "Writing \033[1;32msrc/modules/Makefile\033[0m\n"; - open(FILEHANDLE, ">src/modules/Makefile"); - - ### - # Module Makefile Header - ### - print FILEHANDLE < -# Many Thanks to Andrew Church -# for assisting with making this work right. -# -# Automatically Generated by ./configure to add a modules -# please run ./configure --update + foreach my $file (@dotfiles) { + open(FILEHANDLE, "make/template/$file") or die "Can't open make/template/$file: $!"; + $_ = join '', ; + close(FILEHANDLE); -all: \$(MODULES) + $config{BUILD_DIR} ||= resolve_directory($config{ME}."/build"); -EOF - ### - # End Module Makefile Header - ### - - # Create a Modules List.. - my $modules = ""; - my $cmflags = ""; - my $liflags = ""; - - open(MODLIST,">include/modlist.h"); - - ### - # Include File Header - ### - print MODLIST <src/modules/.m_".$i."_static.cpp") or die("Could not create .m_".$i."_static.cpp"); - while (chomp($a = )) { - $a =~ s/init_module/$i\_init/g; - print MUNGED "$a\n"; - } - close(MODULE); - close(MUNGED); - print MODLIST <GNUmakefile' or die "Can't write to GNUmakefile: $!"; + print MKF $_; + close MKF; + + print "Writing \e[1;32mBSDmakefile\e[0m ...\n"; + $_ = $mk_tmp; + s/\@IFDEF (\S+)/.if defined($1)/g; + s/\@IFNDEF (\S+)/.if !defined($1)/g; + s/\@IFEQ (\S+) (\S+)/.if $1 == $2/g; + s/\@ELSIFEQ (\S+) (\S+)/.elif $1 == $2/g; + s/\@ELSE/.else/g; + s/\@ENDIF/.endif/g; + s/\@BSD_ONLY //g; + s/ *\@GNU_ONLY .*\n//g; + $mk_tmp = $_; + $mk_tmp =~ s#\@DO_EXPORT (.*)#"MAKEENV += ".join ' ', map "$_='\${$_}'", split /\s/, $1#eg; + open MKF, '>BSDmakefile' or die "Can't write to BSDmakefile: $!"; + print MKF $mk_tmp; + close MKF; + } else { + print "Writing \e[1;32m$file\e[0m ...\n"; + open(FILEHANDLE, ">$file") or die("Can't write to $file: $!\n"); + print FILEHANDLE $_; + close(FILEHANDLE); } } - print MODLIST "{0}};\n\n#endif\n"; - close(MODLIST); -} - -sub write_dynamic_modules_makefile { - # Modules Makefile.. - print "Writing \033[1;32msrc/modules/Makefile\033[0m\n"; - open(FILEHANDLE, ">src/modules/Makefile"); - my $extra = ""; - if ($config{OSNAME} =~ /CYGWIN/) { - $extra = "../inspircd.dll.a"; - } - -### -# Module Makefile Header -### - print FILEHANDLE < -# Many Thanks to Andrew Church -# for assisting with making this work right. -# -# Automatically Generated by ./configure to add a modules -# please run ./configure -update or ./configure -modupdate - -all: \$(MODULES) - -EOF - ### - # End Module Makefile Header - ### - - # Create a Modules List.. - my $modules = ""; - my $cmflags = ""; - my $liflags = ""; - my $crud = ""; - - foreach $i (@modlist) { - ### - # Write Entry to the MakeFile - ### - $cmflags = getcompilerflags("src/modules/m_".$i.".cpp"); - $liflags = getlinkerflags("src/modules/m_".$i.".cpp"); - print FILEHANDLE <src/Makefile") or die("Could not write src/Makefile!"); - my $i = 0; - my @cmdlist = (); - opendir(DIRHANDLE, "src"); - foreach $name (sort readdir(DIRHANDLE)) { - if ($name =~ /^cmd_(.+)\.cpp$/) { - $cmdlist[$i++] = $1; - } - } - closedir(DIRHANDLE); - my $cmdobjs = ""; - my $srcobjs = ""; - foreach my $cmd (@cmdlist) { - $cmdobjs = $cmdobjs . "cmd_$cmd.o "; - $srcobjs = $srcobjs . "cmd_$cmd.cpp "; +sub depcheck +{ + getmodules(); + for my $mod (@modlist) { + getcompilerflags("src/modules/m_$mod.cpp"); + getlinkerflags("src/modules/m_$mod.cpp"); } - print FH < -# Makefile version 2 (statically linked core) by -# - -CC = im a cheezeball - -CXXFLAGS = -I../include \${FLAGS} -CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn) -RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn) - -EOM - -$se = "socketengine_select"; -if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) { - $se = "socketengine_kqueue"; -} -elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) { - $se = "socketengine_epoll"; } - ### - # This next section is for cygwin dynamic module builds. - # Basically, what we do, is build the inspircd core as a library - # then the main executable uses that. the library is capable of - # loading / unloading the modules dynamically :) - # Massive thanks to the guys on #cygwin @ irc.freenode.net for helping - # make this work :) - ### - - if ($config{OSNAME} =~ /CYGWIN/) { - print FH <catdir("src", "modules"); + my $abs_srcdir = File::Spec->rel2abs($srcdir); + local $_; + my $dd; + opendir $dd, File::Spec->catdir($abs_srcdir, "extra") or die (File::Spec->catdir($abs_srcdir, "extra") . ": $!\n"); + my @extras = map { File::Spec->case_tolerant() ? lc($_) : $_ } (readdir($dd)); + closedir $dd; + undef $dd; + opendir $dd, $abs_srcdir or die "$abs_srcdir: $!\n"; + my @sources = map { File::Spec->case_tolerant() ? lc($_) : $_ } (readdir($dd)); + closedir $dd; + undef $dd; + my $maxlen = (sort { $b <=> $a } (map {length($_)} (@extras)))[0]; + my %extras = (); +EXTRA: for my $extra (@extras) { + next if (File::Spec->curdir() eq $extra || File::Spec->updir() eq $extra); + my $abs_extra = File::Spec->catfile($abs_srcdir, "extra", $extra); + my $abs_source = File::Spec->catfile($abs_srcdir, $extra); + next unless ($extra =~ m/\.(cpp|h)$/ || (-d $abs_extra)); # C++ Source/Header, or directory + if (-l $abs_source) { + # Symlink, is it in the right place? + my $targ = readlink($abs_source); + my $abs_targ = File::Spec->rel2abs($targ, $abs_srcdir); + if ($abs_targ eq $abs_extra) { + $extras{$extra} = "\e[32;1menabled\e[0m"; + } else { + $extras{$extra} = sprintf("\e[31;1mwrong symlink target (%s)\e[0m", $abs_targ); + } + } elsif (-e $abs_source) { + my ($devext, $inoext) = stat($abs_extra); + my ($devsrc, $inosrc, undef, $lnksrc) = stat($abs_source); + if ($lnksrc > 1) { + if ($devsrc == $devext && $inosrc == $inoext) { + $extras{$extra} = "\e[32;1menabled\e[0m"; + } else { + $extras{$extra} = sprintf("\e[31;1mwrong hardlink target (%d:%d)\e[0m", $devsrc, $inosrc); + } + } else { + open my $extfd, "<", $abs_extra; + open my $srcfd, "<", $abs_source; + local $/ = undef; + if (scalar(<$extfd>) eq scalar(<$srcfd>)) { + $extras{$extra} = "\e[32;1menabled\e[0m"; + } else { + $extras{$extra} = sprintf("\e[31;1mout of synch (re-copy)\e[0m"); + } + } + } else { + $extras{$extra} = "\e[33;1mdisabled\e[0m"; + } } - - $se = "socketengine_select"; - if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) { - $se = "socketengine_kqueue"; + # Now let's add dependency info + for my $extra (keys(%extras)) { + next unless $extras{$extra} =~ m/enabled/; # only process enabled extras. + my $abs_extra = File::Spec->catfile($abs_srcdir, "extra", $extra); + my @deps = split / +/, getdependencies($abs_extra); + for my $dep (@deps) { + if (exists($extras{$dep})) { + my $ref = \$extras{$dep}; # Take reference. + if ($$ref !~ m/needed by/) { + # First dependency found. + if ($$ref =~ m/enabled/) { + $$ref .= " (needed by \e[32;1m$extra\e[0m"; + } else { + $$ref =~ s/\e\[.*?m//g; # Strip out previous coloring. Will be set in bold+red+blink later. + $$ref .= " (needed by \e[0;32;1;5m$extra\e[0;31;1;5m"; + } + } else { + if ($$ref =~ m/enabled/) { + $$ref .= ", \e[32;1m$extra\e[0m"; + } else { + $$ref .= ", \e[0;32;1;5m$extra\e[0;31;1;5m"; + } + } + } + } } - elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) { - $se = "socketengine_epoll"; + for my $extra (sort {$a cmp $b} keys(%extras)) { + my $text = $extras{$extra}; + if ($text =~ m/needed by/ && $text !~ m/enabled/) { + printf "\e[31;1;5m%-*s = %s%s\e[0m\n", $maxlen, $extra, $text, ($text =~ m/needed by/ ? ")" : ""); + } else { + printf "%-*s = %s%s\n", $maxlen, $extra, $text, ($text =~ m/needed by/ ? "\e[0m)" : ""); + } } + return keys(%extras) if wantarray; # Can be used by manage_extras. +} - open(FH,">src/Makefile") or die("Could not write src/Makefile"); - print FH < -# Makefile version 2 (dynamically linked core) by -# - -CC = im a cheezeball - -CXXFLAGS = -I../include \${FLAGS} -CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn) -RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn) - -all: libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so $cmdobjs libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so libIRCDsnomasks.so inspircd - -inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/socket.h libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so $cmdobjs libIRCDsnomasks.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so - \$(CC) -I../include $extra -Wl,--rpath -Wl,/usr/local/lib -Wl,--rpath -Wl,$config{LIBRARY_DIR} \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDhash.so libIRCDsocket.so libIRCDsocketengine.so libIRCDuserprocess.so libIRCDcull_list.so libIRCDcommand_parse.so libIRCDaes.so libIRCDtimer.so libIRCDsnomasks.so - -libIRCDsocketengine.so: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o $se.o - -libIRCDsnomasks.so: snomasks.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/channels.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsnomasks.so snomasks.o - -libIRCDcommand_parse.so: command_parse.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o - -libIRCDcull_list.so: cull_list.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/users.h ../include/channels.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o - -libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o - -libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o - -libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I/usr/local/include -L/usr/local/lib -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o - -libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o - -libIRCDmode.so: mode.cpp ../include/base.h ../include/mode.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h \$(RELCPPFILES) - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp - \${MAKE} -C "modes" DIRNAME="src/modes" \$(MAKEARGS) CPPFILES="\$(CPPFILES)" - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o modes/modeclasses.a - -libIRCDxline.so: xline.cpp ../include/base.h ../include/xline.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o - -libIRCDstring.so: inspstring.cpp ../include/base.h ../include/inspstring.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o - -libIRCDasyncdns.so: dns.cpp ../include/base.h ../include/dns.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o - -libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o - -libIRCDconfigreader.so: configreader.cpp ../include/base.h ../include/configreader.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDconfigreader.so configreader.o - -libIRCDcommands.so: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o - -libIRCDdynamic.so: dynamic.cpp ../include/base.h ../include/dynamic.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o - -libIRCDusers.so: users.cpp ../include/base.h ../include/users.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o - -libIRCDmodules.so: modules.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o - -libIRCDwildcard.so: wildcard.cpp ../include/base.h ../include/wildcard.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o - -libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o - -libIRCDinspsocket.so: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDinspsocket.so inspsocket.o - -libIRCDaes.so: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDaes.so aes.o - -libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h - \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp - \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDtimer.so timer.o - -EOM - foreach my $cmd (@cmdlist) { - print FH < 0; # Skip if we're going to be enabling it anyway. + if (!-e "src/modules/$dep") { + if (-e "src/modules/extra/$dep") { + print STDERR "Will also enable extra \e[32;1m$dep\e[0m (needed by \e[32;1m$extra\e[0m)\n"; + push @extras, $dep; + } else { + print STDERR "\e[33;1mWARNING:\e[0m module \e[32;1m$extra\e[0m might be missing dependency \e[32;1m$dep\e[0m - YOU are responsible for satisfying it!\n"; + } + } + } + print "Enabling $extra ... \n"; + symlink "extra/$extra", $source or print STDERR "$source: Cannot link to 'extra/$extra': $!\n"; } - close(FH); } -sub showhelp +sub disable_extras (@) { - print "Usage: configure [options] -Options: [defaults in brackets after descriptions] - -When no options are specified, interactive -configuration is started and you must specify -any required values manually. If one or more -options are specified, non-interactive configuration -is started, and any omitted values are defaulted. - -Interactive configuration and reconfiguration: - - -update Update makefiles - -modupdate Detect new modules - -svnupdate {rebuild} Update working copy - {and optionally rebuild} - -clean Remove .config.cache - -help Show this help text - -Non-interactive and initial configuration: - - --enable-gnutls Enable GnuTLS module [no] - --enable-openssl Enable OpenSSL module [no] - --with-nick-length=[n] Specify max. nick length [32] - --with-channel-length=[n] Specify max. channel length - [64] - --with-max-channels=[n] Specify max. number of channels - a normal user may join [20] - --with-max-oper-channels=[n] Specify max. number of channels - an irc operator may join [60] - --with-max-clients=[n] Specify maximum number of users - which may connect locally - --enable-optimization=[n] Optimize using -O[n] gcc flag - --enable-epoll Enable epoll() where supported - [set] - --enable-kqueue Enable kqueue() where supported - [set] - --disable-epoll Do not enable epoll(), fall back - to select() [not set] - --disable-kqueue Do not enable kqueue(), fall back - to select() [not set] - --enable-ipv6 Build ipv6 native InspIRCd [no] - --enable-remote-ipv6 Build with ipv6 support for remote - servers on the network [yes] - --disable-remote-ipv6 Do not allow remote ipv6 servers - [not set] - --with-cc=[filename] Use an alternative g++ binary to - build InspIRCd [g++] - --with-ident-length=[n] Specify max length of ident [12] - --with-quit-length=[n] Specify max length of quit [200] - --with-topic-length=[n] Specify max length of topic [350] - --with-kick-length=[n] Specify max length of kick [200] - --with-gecos-length=[n] Specify max length of gecos [150] - --with-away-length=[n] Specify max length of away [150] - --with-max-modes=[n] Specify max modes per line which - have parameters [20] - --prefix=[directory] Base directory to install into - [current directory] - --config-dir=[directory] Config file directory [prefix/conf] - --module-dir=[directory] Modules directory [prefix/modules] - --binary-dir=[directory] Binaries directory [prefix/bin] - --library-dir=[directory] Library directory [prefix/lib] - --help Show this help text -"; - exit(0); + opendir my $dd, "src/modules/extra/"; + my @files = readdir($dd); + closedir $dd; + my (@extras) = @_; +EXTRA: for my $extra (@extras) { + my $extrapath = "src/modules/extra/$extra"; + my $source = "src/modules/$extra"; + if (!-e $extrapath) { + print STDERR "Cannot disable \e[32;1m$extra\e[0m : Is not an extra\n"; + next; + } + if ((! -l $source) || readlink($source) ne "extra/$extra") { + print STDERR "Cannot disable \e[32;1m$extra\e[0m : Source is not a link or doesn't refer to the right file. Remove manually if this is in error.\n"; + next; + } + # Check if anything needs this. + for my $file (@files) { + my @deps = split / +/, getdependencies("src/modules/extra/$file"); + # File depends on this extra... + if (scalar(grep { $_ eq $extra } @deps) > 0) { + # And is both enabled and not about to be disabled. + if (-e "src/modules/$file" && scalar(grep { $_ eq $file } @extras) < 1) { + print STDERR "Cannot disable \e[32;1m$extra\e[0m : is needed by \e[32;1m$file\e[0m\n"; + next EXTRA; + } + } + } + # Now remove. + print "Disabling $extra ... \n"; + unlink "src/modules/$extra" or print STDERR "Cannot disable \e[32;1m$extra\e[0m : $!\n"; + } }