X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=configure;h=b32d35a39d4a6b538e28b4761a306412b4d67115;hb=3a6885d6a1d30f6e2eb9b1fcd20e949768267318;hp=74e65bfc70750e51c4ef115c6698d05a155e0b87;hpb=7c210e205ececd08828dd4d5f33e8a775682e4b1;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/configure b/configure index 74e65bfc7..22855727f 100755 --- a/configure +++ b/configure @@ -1,584 +1,1658 @@ -#!/bin/sh +#!/usr/bin/perl + # InspIRCd Configuration Script # # Copyright 2003 The ChatSpike Development Team # # # -# $Id$ +# [14:21] Brain: i know perl-fu! # +# $Id$ # ######################################## -echo "Configuring default values..." - -ME=`pwd` -GCCVER=`gcc -dumpversion | cut -c 1` -GCC34=`gcc -dumpversion | cut -c 3` -CONFIG_DIR=$ME/conf -MODULE_DIR=$ME/modules -BINARY_DIR=$ME/bin -INSTALL=`which install` -OPTIMITEMP=0 -OPTIMISATI="-g" -MAX_CLIENT_T=`ulimit -n` -NICK_LENGT=32 -CHAN_LENGT=64 -MAX_CHANNE=20 -MAXI_MODES=20 -OSNAME=`(uname -s) 2>/dev/null` || OSNAME="unknown" - -if [ -z $MAX_CLIENT_T ] ; then - MAX_CLIENT_T=1024 - SCAN_FAILED=1 -fi - - -if [ "$1" = "-clean" -o "$2" = "-clean" ] ; then - `rm -rf .config.cache` -fi - -if [ -e ".config.cache" -a -z "$CLEAN" ] ; then - . .config.cache -fi - -if [ "$1" = "-update" -o "$2" = "-update" ] ; then - # They wanna update their Makefile.. good for 'em - # Make sure .config.cache exists - if [ ! -e ".config.cache" ] ; then - echo "You have not run ./configure before. Please do this before trying to run the update script." - exit 0 - fi - # Right, load the cache values - . .config.cache - # Check for modules - - case "$OSNAME" in - FreeBSD) - LDLIBS="-Ldl" - FLAGS="-fPIC -frtti $OPTIMISATI" - MAKEPROG="gmake" - ;; - *) - LDLIBS="-ldl" - FLAGS="-fPIC -frtti $OPTIMISATI" - MAKEPROG="make" - ;; - esac - - MODULES="" - for module in src/modules/*.cpp ; do - mod=`echo $module | sed 's/.cpp/.so/' | sed 's/src\/modules\///'` - MODULES="$MODULES $mod" - done - - # Write the new makefile. - for file in Makefile; do - echo -e "\033[0;37mWriting \033[1;32m$file\033[0;37m" - rm -f $file - sed -e " - s%@MAKEPROG@%$MAKEPROG%g - s%@FLAGS@%$FLAGS%g - s%@LDLIBS@%$LDLIBS%g - s%@CONFIG_DIR@%$CONFIG_DIR%g - s%@MODULE_DIR@%$MODULE_DIR%g - s%@BINARY_DIR@%$BINARY_DIR%g - s%@MODULES@%$MODULES%g - " .${file}.inc >> $file - done - echo -e "\033[0;37mWriting \033[1;32msrc/modules/Makefile\033[0;37m" - rm -f src/modules/Makefile - - # Generate the Header.. - - echo "# (C) ChatSpike development team" >> src/modules/Makefile - echo "# Makefile by " >> src/modules/Makefile - echo "# Many Thanks to Andrew Church " >> src/modules/Makefile - echo "# for assisting with making this work right." >> src/modules/Makefile - echo "#" >> src/modules/Makefile - echo "# Automatically Generated by ./configure to add a module" >> src/modules/Makefile - echo "# please run ./configure --update" >> src/modules/Makefile - echo "" >> src/modules/Makefile - echo "all: \$(MODULES)" >> src/modules/Makefile - echo "" >> src/modules/Makefile - - - for module in src/modules/*.cpp ; do - flags=`grep '$CompileFlags: ' $module | sed 's/\/\* $CompileFlags://' | sed 's/\*\///'` - mod=`echo $module | sed 's/.cpp/.so/' | sed 's/src\/modules\///'` - mod2=`echo $module | sed 's/src\/modules\///'` - echo "$mod: $mod2 ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h" >> src/modules/Makefile - echo " \$(CC) -I../../include \$(FLAGS) -shared$flags -o $mod $mod2" >> src/modules/Makefile - echo " @cp $mod \$(MODPATH)/" >> src/modules/Makefile - echo "" >> src/modules/Makefile - done - - - echo "Complete." - exit 1; -fi - - -if [ -z $MAX_CLIENT ] ; then - MAX_CLIENT=$MAX_CLIENT_T -fi - - -c="" -n="" -if [ "`eval echo -e -n 'a'`" = "-n a" ] ; then - c="\c" -else - n="-n" -fi - -exists () { # because some shells don't have test -e - if [ -f $1 -o -d $1 -o -p $1 -o -c $1 -o -b $1 ] ; then - return 0 - else - return 1 - fi -} - -echo "#include ">.test.cpp -echo "#include ">>.test.cpp -echo "int main() { char a[10]; char b[10]; strlcpy(a,b,10); printf(\"%d\\n\",999); }" >>.test.cpp -g++ -o .test .test.cpp 2>&1 -HAS_STRLCPY=`./.test 2>&1` -rm -f .test.cpp .test - -clear -echo -e "'\033[1;33m####\033[0;37m:'\033[1;33m##\033[0;37m::: \033[1;33m##\033[0;37m::'\033[1;33m######\033[0;37m::'\033[1;33m########\033[0;37m::'\033[1;33m####\033[0;37m:'\033[1;33m########\033[0;37m:::'\033[1;33m######\033[0;37m::'\033[1;33m########\033[0;37m::" -echo -e ". \033[1;33m##\033[0;37m:: \033[1;33m###\033[0;37m:: \033[1;33m##\033[0;37m:'\033[1;33m##\033[0;37m... \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m.... \033[1;33m##\033[0;37m:. \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m.... \033[1;33m##\033[0;37m:'\033[1;33m##\033[0;37m... \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m.... \033[1;33m##\033[0;37m:" -echo -e ": \033[1;33m##\033[0;37m:: \033[1;33m####\033[0;37m: \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m:::..:: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m:::..:: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m:" -echo -e ": \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m \033[1;33m##\033[0;37m \033[1;33m##\033[0;37m:. \033[1;33m######\033[0;37m:: \033[1;33m########\033[0;37m::: \033[1;33m##\033[0;37m:: \033[1;33m########\033[0;37m:: \033[1;33m##\033[0;37m::::::: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m:" -echo -e ": \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m. \033[1;33m####\033[0;37m::..... \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m.....:::: \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m.. \033[1;33m##\033[0;37m::: \033[1;33m##\033[0;37m::::::: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m:" -echo -e ": \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m:. \033[1;33m###\033[0;37m:'\033[1;33m##\033[0;37m::: \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m::::::::: \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m::. \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m::: \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m:" -echo -e "'\033[1;33m####\033[0;37m: \033[1;33m##\033[0;37m::. \033[1;33m##\033[0;37m:. \033[1;33m######\033[0;37m:: \033[1;33m##\033[0;37m::::::::'\033[1;33m####\033[0;37m: \033[1;33m##\033[0;37m:::. \033[1;33m##\033[0;37m:. \033[1;33m######\033[0;37m:: \033[1;33m########\033[0;37m::" -echo -e "\033[0;37m\033[0;37m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::" -echo "" -echo -e "\033[1;37mWelcome to the InspIRCd Configuration program!" -echo "" -echo "*** If you are unsure of any of these values, leave it blank for ***" -echo "*** standard settings that will work, and your server will run ***" -echo "*** using them. If you are running this server as part of a ***" -echo "*** larger network, you must consult with your network admins ***" -echo "*** for the proper values to use, or server links will be unstable! ***" -echo -e "\033[0;37m" -echo -e "Press \033[1;37m\033[0;37m to accept the default for any option, or enter" -echo -e "a new value. Please note: You will \033[1;37mHAVE\033[0;37m to read the docs" -echo -e "dir, otherwise you won't have a config file!" -echo "" -echo -e "Your operating system is: \033[1;37m$OSNAME\033[0;37m (`uname -mnr`), fdmax: $MAX_CLIENT_T" -echo "" - -############################################################################# - - ok=0 - asked=1 - echo "In what directory are the configuration files?" - while [ $ok -eq 0 ] ; do - echo -e $n "[\033[1;32m$CONFIG_DIR\033[0;37m] -> $c" - if read INPUT ; then : ; else echo "" ; exit 1 ; fi - if [ ! "$INPUT" ] ; then - INPUT=$CONFIG_DIR - default=1 - fi - if echo "$INPUT" | grep -q \[\'\"\\\] ; then - echo 'Please use a pathname without the characters: '\'' " \' - elif [ ! "$NO_DIR_CHECK" -a ! -d "$INPUT" ] ; then - if exists "$INPUT" ; then - echo "$INPUT exists, but is not a directory!" - else - echo "$INPUT does not exist. Create it?" - echo -e $n "[\033[1;32my\033[0;37m] $c" - read YN - if [ "$YN" != "n" ] ; then - if mkdir -p "$INPUT" ; then - ok=1 - fi - fi - fi - else - ok=1 - fi - done - CONFIG_DIR=$INPUT - echo "" - - -############################################################################## - - ok=0 - asked=1 - echo "In What directory are the modules to be compiled to?" - while [ $ok -eq 0 ] ; do - echo -e $n "[\033[1;32m$MODULE_DIR\033[0;37m] -> $c" - if read INPUT ; then : ; else echo "" ; exit 1 ; fi - if [ ! "$INPUT" ] ; then - INPUT=$MODULE_DIR - default=1 - fi - if echo "$INPUT" | grep -q \[\'\"\\\] ; then - echo 'Please use a pathname without the characters: '\'' " \' - elif [ ! "$NO_DIR_CHECK" -a ! -d "$INPUT" ] ; then - if exists "$INPUT" ; then - echo "$INPUT exists, but is not a directory!" - else - echo "$INPUT does not exist. Create it?" - echo -e $n "[\033[1;32my\033[0;37m] $c" - read YN - if [ "$YN" != "n" ] ; then - if mkdir -p "$INPUT" ; then - ok=1 - fi - fi - fi - else - ok=1 - fi - done - MODULE_DIR=$INPUT - echo "" - - -############################################################################## - - ok=0 - asked=1 - echo "In what directory is the IRCd binary to be placed?" - while [ $ok -eq 0 ] ; do - echo -e $n "[\033[1;32m$BINARY_DIR\033[0;37m] -> $c" - if read INPUT ; then : ; else echo "" ; exit 1 ; fi - if [ ! "$INPUT" ] ; then - INPUT=$BINARY_DIR - default=1 - fi - if echo "$INPUT" | grep -q \[\'\"\\\] ; then - echo 'Please use a pathname without the characters: '\'' " \' - elif [ ! "$NO_DIR_CHECK" -a ! -d "$INPUT" ] ; then - if exists "$INPUT" ; then - echo "$INPUT exists, but is not a directory!" - else - echo "$INPUT does not exist. Create it?" - echo -e $n "[\033[1;32my\033[0;37m] $c" - read YN - if [ "$YN" != "n" ] ; then - if mkdir -p "$INPUT" ; then - ok=1 - fi - fi - fi - else - ok=1 - fi - done - BINARY_DIR=$INPUT - echo "" - -############################################################################### -# Craigs Version 3 With slightly less Cheeze :p - -cheeze=0 -echo -e "Maximum number of clients at any one time (\033[1;32m1-$MAX_CLIENT_T\033[0;37m)?" -while [ "$cheeze" -eq "0" ] ; do - echo -e $n "[\033[1;32m$MAX_CLIENT\033[0;37m] -> $c" - read cc - - if [ -z "$cc" ] ; then - cc=$MAX_CLIENT - fi - - case "$cc" in - [0-9]*) - if [ "$cc" -gt "$MAX_CLIENT_T" -a -z "$SCAN_FAILED" ] ; then - echo -e "WARNING: Our scans have indicated that you are attempting" - echo -e "to use more sockets than there are avaliable. Are you sure" - echo -e "you wish to do this? It may cause the IRCd to malfunction [y/n]" - echo -e $n "[\033[1;32mn\033[0;37m] -> $c" - read YN - if [ "$YN" = "y" ] ; then - MAX_CLIENT=$cc - cheeze=1 - else - echo "" - echo -e "Please enter the correct value (\033[1;32m1-$MAX_CLIENT_T\033[0;37m)" - fi - else - echo $SCAN_FAILED - cheeze=1 - MAX_CLIENT=$cc - fi - ;; - *) - echo "" - echo "You must enter a number in this field. Please try again." - ;; - esac -done -echo "" - - -############################################################################### - - cheeze=0 - echo -e "What is the Maximum length of nicknames?" - while [ "$cheeze" -eq "0" ] ; do - echo -e $n "[\033[1;32m$NICK_LENGT\033[0;37m] -> $c" - read cc - if [ "$cc" ] ; then - case "$cc" in - [0-9]*) - NICK_LENGT=$cc - cheeze=1 - ;; - *) - echo "" - echo "You Must Enter a Number in this field. Please Try Again." - cheeze=0 - ;; - esac - else - cheeze=1 - fi - done - echo "" - -############################################################################### - - cheeze=0 - echo -e "What is the Maximum length of channel names?" - while [ "$cheeze" -eq "0" ] ; do - echo -e $n "[\033[1;32m$MAX_CHANNE\033[0;37m] -> $c" - read cc - if [ "$cc" ] ; then - case "$cc" in - [0-9]*) - MAX_CHANNE=$cc - cheeze=1 - ;; - *) - echo "" - echo "You Must Enter a Number in this field. Please Try Again." - cheeze=0 - ;; - esac - else - cheeze=1 - fi - done - echo "" - -############################################################################### - - cheeze=0 - echo -e "What is the Maximum number of mode changes in one line?" - while [ "$cheeze" -eq "0" ] ; do - echo -e $n "[\033[1;32m$MAXI_MODES\033[0;37m] -> $c" - read cc - if [ "$cc" ] ; then - case "$cc" in - [0-9]*) - MAXI_MODES=$cc - cheeze=1 - ;; - *) - echo "" - echo "You Must Enter a Number in this field. Please Try Again." - cheeze=0 - ;; - esac - else - cheeze=1 - fi - done - echo "" - -############################################################################### -# Code Optimisation? - - cheeze=0 - echo -e "Enter the Level Of Binary optimisation. This is a number between 0 and 3 (inclusive)" - echo -e "The InspIRCd Team will _NOT_ support any bug reports above 0." - echo -e "Also note, the IRCd behaviour will be different depending on this value." - echo -e "Please read the documentation for more information." - echo -e "" - echo -e "The Higher the number, the more optimised your binary will be. This value will default to 0" - echo -e "If you either a) Dont enter a number, or b) Enter a value outside the range." - echo -e $n "[\033[1;32m$OPTIMITEMP\033[0;37m] -> $c" - read cc - if [ -z "$cc" ] ; then - cc=$OPTIMITEMP - fi - case "$cc" in - 1) - OPTIMITEMP=1 - OPTIMISATI="-O" - ;; - 2) - OPTIMITEMP=2 - OPTIMISATI="-O2" - ;; - 3) - OPTIMITEMP=3 - OPTIMISATI="-O3" - ;; - *) - OPTIMITEMP=0 - OPTIMISATI="-g" - ;; - esac - echo "" - -############################################################################### - - -echo -e "\033[1;32mPre-build configuration is complete!\033[0;37m" -echo "" -echo -e "\033[0;37mConfig path:\033[1;32m\t\t\t$CONFIG_DIR" -echo -e "\033[0;37mModule path:\033[1;32m\t\t\t$MODULE_DIR" -echo -e "\033[0;37mMax connections:\033[1;32m\t\t$MAX_CLIENT" -echo -e "\033[0;37mMax User Channels\033[1;32m\t\t$MAX_CHANNE" -echo -e "\033[0;37mMax nickname length:\033[1;32m\t\t$NICK_LENGT" -echo -e "\033[0;37mMax channel length:\033[1;32m\t\t$CHAN_LENGT" -echo -e "\033[0;37mMax mode length:\033[1;32m\t\t$MAXI_MODES" -echo -e "\033[0;37mGCC Version Found:\033[1;32m\t\t$GCCVER.$GCC34" -echo -e "\033[0;37mOptimatizaton Flag:\033[1;32m\t\t$OPTIMISATI" -echo -e "\033[0;37m" - -echo "Writing cache file for future ./configures ..." - -COPY_CONF=0 -if [ "$CONFIG_DIR" != "$ME/conf" ] ; then - COPY_CONF=1 -fi - - -if [ -e ".config.cache" ] ; then - rm .config.cache -fi -echo "CONFIG_DIR=\"$CONFIG_DIR\"" >> .config.cache -echo "MODULE_DIR=\"$MODULE_DIR\"" >> .config.cache -echo "BINARY_DIR=\"$BINARY_DIR\"" >> .config.cache -echo "MAX_CLIENT=\"$MAX_CLIENT\"" >> .config.cache -echo "MAX_CHANNE=\"$MAX_CHANNE\"" >> .config.cache -echo "NICK_LENGT=\"$NICK_LENGT\"" >> .config.cache -echo "MAXI_MODES=\"$MAXI_MODES\"" >> .config.cache -echo "OPTIMITEMP=\"$OPTIMITEMP\"" >> .config.cache -echo "OPTIMISATI=\"$OPTIMISATI\"" >> .config.cache -echo "GCC34=\"$GCC34\"" >> .config.cache -echo "HAS_STRLCPY=\"$HAS_STRLCPY\"" >> .config.cache -echo "COPY_CONF=\"$COPY_CONF\"" >> .config.cache - -echo -e "Writing \033[1;32minspircd_config.h" - -echo "/* Auto generated by configure, do not modify! */" >include/inspircd_config.h -echo "" >>include/inspircd_config.h -if [ "$GCCVER" -eq "3" ] ; then -echo "#define GCC3" >>include/inspircd_config.h - if [ "$GCC34" -gt "3" ] ; then - echo "#define GCC34" >>include/inspircd_config.h - fi -fi -if [ "$HAS_STRLCPY" -eq "999" ] ; then - echo "#define HAS_STRLCPY" >>include/inspircd_config.h -fi -echo "#define SYSLOG_FACILITY LOG_DAEMON" >>include/inspircd_config.h -echo "#define SYSLOG_LEVEL LOG_NOTICE" >>include/inspircd_config.h -echo "#define CONFIG_FILE \"$CONFIG_DIR/inspircd.conf\"" >>include/inspircd_config.h -echo "#define MOD_PATH \"$MODULE_DIR\"" >>include/inspircd_config.h -echo "#define VERSION \"`sh ./src/version.sh`\"" >>include/inspircd_config.h -echo "#define MAXCLIENTS $MAX_CLIENT" >>include/inspircd_config.h -echo "#define NICKMAX $NICK_LENGT" >>include/inspircd_config.h -echo "#define CHANMAX $CHAN_LENGT" >>include/inspircd_config.h -echo "#define MAXCHANS $MAX_CHANNE" >>include/inspircd_config.h -echo "#define MAXMODES $MAXI_MODES" >>include/inspircd_config.h -echo "#define OPTIMISATION $OPTIMITEMP" >>include/inspircd_config.h -echo "#define SYSTEM \"`uname -n -s -r`\"" >>include/inspircd_config.h -echo "#define MAXBUF 514">>include/inspircd_config.h -touch include/inspircd_config.h - -case "$OSNAME" in - FreeBSD) - LDLIBS="-Ldl" - FLAGS="-fPIC -frtti $OPTIMISATI" - MAKEPROG="gmake" - ;; - *) - LDLIBS="-ldl" - FLAGS="-fPIC -frtti $OPTIMISATI" - MAKEPROG="make" - ;; -esac - -MODULES="" -for module in src/modules/*.cpp ; do - mod=`echo $module | sed 's/.cpp/.so/' | sed 's/src\/modules\///'` - MODULES="$MODULES $mod" -done - -for file in Makefile inspircd; do - echo -e "\033[0;37mWriting \033[1;32m$file\033[0;37m" - rm -f $file - sed -e " - s%@MAKEPROG@%$MAKEPROG%g - s%@FLAGS@%$FLAGS%g - s%@LDLIBS@%$LDLIBS%g - s%@CONFIG_DIR@%$CONFIG_DIR%g - s%@MODULE_DIR@%$MODULE_DIR%g - s%@BINARY_DIR@%$BINARY_DIR%g - s%@MODULES@%$MODULES%g - " .${file}.inc >> $file -done -`chmod 700 inspircd` - -echo -e "\033[0;37mWriting \033[1;32msrc/modules/Makefile\033[0;37m" -rm -f src/modules/Makefile - -# Generate the Header.. - -echo "# (C) ChatSpike development team" >> src/modules/Makefile -echo "# Makefile by " >> src/modules/Makefile -echo "# Many Thanks to Andrew Church " >> src/modules/Makefile -echo "# for assisting with making this work right." >> src/modules/Makefile -echo "#" >> src/modules/Makefile -echo "# Automatically Generated by ./configure to add a module" >> src/modules/Makefile -echo "# please run ./configure --update" >> src/modules/Makefile -echo "" >> src/modules/Makefile -echo "all: \$(MODULES)" >> src/modules/Makefile -echo "" >> src/modules/Makefile - -for module in src/modules/*.cpp ; do - flags=`grep '$CompileFlags: ' $module | sed 's/\/\* $CompileFlags://' | sed 's/\*\///'` - mod=`echo $module | sed 's/.cpp/.so/' | sed 's/src\/modules\///'` - mod2=`echo $module | sed 's/src\/modules\///'` - echo "$mod: $mod2 ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h" >> src/modules/Makefile - echo " \$(CC) -I../../include \$(FLAGS) -shared$flags -o $mod $mod2" >> src/modules/Makefile - echo " @cp $mod \$(MODPATH)/" >> src/modules/Makefile - echo "" >> src/modules/Makefile -done - - -echo "" - -echo "" -echo "Do you want to compile the IRCd binaries?" -echo -e $n "[\033[1;32my\033[0;37m] $c" -read YN -if [ "$YN" != "n" ] ; then - echo "" - echo -e "\033[1;32mCompiling...\033[0;37m" - echo "" - cd $ME - $MAKEPROG - echo "" - echo "Done!" -else - echo "" - echo -e "To build your server with these settings, please type '\033[1;32m$MAKEPROG\033[0;37m' now." -fi - - -echo "" -echo -e "*** \033[1;32mRemember to edit your configuration files!!!\033[0;37m ***" -echo "" +chomp($topdir = `pwd`); +$this = resolve_directory($topdir); # PWD, Regardless. +@modlist = (); # Declare for Module List.. +%config = (); # Initiate Configuration Hash.. +$config{ME} = resolve_directory($topdir); # Present Working Directory +$config{BASE_DIR} = $config{ME}; # Use CWD as 'Base' Directory. +$config{CONFIG_DIR} = resolve_directory($config{ME}."/conf"); # Configuration Directory +$config{MODULE_DIR} = resolve_directory($config{ME}."/modules"); # Modules Directory +$config{BINARY_DIR} = resolve_directory($config{ME}."/bin"); # Binary Directory +$config{LIBRARY_DIR} = resolve_directory($config{ME}."/lib"); # Library Directory +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"; # Use gnutls. +$config{USE_OPENSSL} = "n"; # Use openssl. +$config{OPTIMITEMP} = "0"; # Default Optimisation Value +$config{OPTIMISATI} = "-g"; # Optimisation Flag +$config{NICK_LENGT} = "31"; # Default Nick Length +$config{CHAN_LENGT} = "64"; # Default Channel Name Length +$config{MAX_CHANNE} = "20"; # Default Max. Channels per user +$config{MAX_OPERCH} = "60"; # Default Max. Channels per oper +$config{MAXI_MODES} = "20"; # Default Max. Number of Modes set at once. +$config{HAS_STRLCPY} = "false"; # strlcpy Check. +$config{HAS_STDINT} = "false"; # stdint.h check +$config{HAS_EXECINFO} = "0"; # execinfo.h Check. +$config{USE_KQUEUE} = "y"; # kqueue enabled +$config{USE_EPOLL} = "y"; # epoll enabled +$config{THREADED_DNS} = "n"; # threaded dns (experimental) +$config{IPV6} = "n"; # IPv6 support (experimental) +$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} = `/bin/uname`); # Operating System Name +$config{CC} = "g++"; # C++ compiler +$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 + +$no_svn = 0; + +$config{HAS_OPENSSL} =~ /OpenSSL (\S+) \d+ \S+ \d{4}/; +$config{HAS_OPENSSL} = $1; + +if ($config{GCCVER} eq "") { + print "g++ was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n"; + return 0; +} + +# Minihack! Convert Cygwin to 'Cyg-Static' so i can +# Keep my dynamic module experiments here for later +# concideration! + +if ($config{OSNAME} =~ /CYGWIN/) { + $config{OSNAME} = "CYG-STATIC"; +} + +if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) { + chomp($config{OSNAME} = `/usr/bin/uname`); + if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){ + $config{OSNAME} = "Unknown"; + } +} + +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(); + +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; + } +} + +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; + } +} + + + +if ($arg eq "-svnupdate") { + 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; +} + +print "Checking for cache from previous configure...\n"; +getcache(); +print "Checking operating system version...\n"; +getosflags(); + +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}; +} + +printf "Checking if stdint.h exists... "; +$config{HAS_STDINT} = "true"; +my $fail = 0; +open(STDINT, ")) { + # try and find the delcaration of: + # size_t strlcpy(...) + if ($line =~ /size_t(\0x9|\s)+strlcpy/) { + $config{HAS_STRLCPY} = "true"; + } + } + close(STRLCPY); +} +print "yes\n" if $config{HAS_STRLCPY} eq "true"; +print "no\n" if $config{HAS_STRLCPY} eq "false"; + +printf "Checking if execinfo.h exists... "; +$config{HAS_EXECINFO} = "0"; +my $fail = 0; +open(EXECINFO, ")) { + # try and find the delcaration of: + # int kqueue(void); + if ($line =~ /int(\0x9|\s)+kqueue/) { + $has_kqueue = 1; + } + } + close(KQUEUE); +} +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"; +} 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"; +} else { + print "no\n"; + $config{HAS_OPENSSL} = "n"; +} + +################################################################################ +# BEGIN INTERACTIVE PART # +################################################################################ + +# Clear the Screen.. +system("clear"); +# Display Splash Logo.. +show_splash(); +chomp($wholeos = `uname -mnr`); + +my $rev = getrevision(); +# Display Introduction Message.. +print " +Welcome to the InspIRCd Configuration program! + +*** 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! *** + +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 +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"; +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"; + +while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) { + print "\033[1;32mIMPORTANT!\033[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?"); + 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] -> "; + chomp($config{CC} = ); + if ($config{CC} eq "") { + $config{CC} = "g++"; + } + chomp($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"; + if ($config{GCCVER} < 3) { + print "\033[1;32mGCC 2.x WILL NOT WORK!\033[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 "\n"; + +# Directory Settings.. +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 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 +} + +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"); + +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?"); + print "\n"; +} +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(THREADED_DNS,"Would you like to enable the experimental multi-threaded DNS lookup?"); +print "\n"; + +yesno(IPV6,"Would you like to enable IPv6 support?"); +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"; + } +} + +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; + 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"; + } +} + +$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"; + } +} + +$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"; + } +} + +$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"; + } +} + +$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"; + } +} + +$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"; + } +} + +$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"; + } +} + +$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"; + } +} + +$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"; + } +} + +$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"; + } +} + +$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"; + } +} + +# 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}; +} + +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"; +} + +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[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n"; +print "\033[0mIPv6 Support:\033[1;32m\t\t\t$config{IPV6}\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"; + +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("=", $_); + $value =~ /^\"(.*)\"$/; + # Do something with data here! + $config{$key} = $1; + } + close(CONFIG); + return "true"; +} + +sub makecache { + # Dump the contents of %config + print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n"; + open(FILEHANDLE, ">.config.cache"); + foreach $key (keys %config) { + print FILEHANDLE "$key=\"$config{$key}\"\n"; + } + close(FILEHANDLE); +} + +sub dir_check { + my ($desc, $hash_key) = @_; + my $complete = 0; + while (!$complete) { + print "In what directory $desc?\n"; + print "[\033[1;32m$config{$hash_key}\033[0m] -> "; + chomp($var = ); + if ($var eq "") { + $var = $config{$hash_key}; + } + if ($var =~ /^\~\/(.+)$/) { + # Convert it to a full path.. + $var = resolve_directory($ENV{HOME} . "/" . $1); + } + if (substr($var,0,1) ne "/") + { + # Assume relative Path was given.. fill in the rest. + $var = $this . "/$var"; + } + $var = resolve_directory($var); + if (! -e $var) { + print "$var does not exist. Create it?\n[\033[1;32my\033[0m] "; + chomp($tmp = ); + if (($tmp eq "") || ($tmp =~ /^y/i)) { + # Attempt to Create the Dir.. + $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256; + if ($chk != 0) { + print "Unable to create directory. ($var)\n\n"; + # Restart Loop.. + next; + } + } else { + # They said they don't want to create, and we can't install there. + print "\n\n"; + next; + } + } else { + if (!is_dir($var)) { + # Target exists, but is not a directory. + print "File $var exists, but is not a directory.\n\n"; + next; + } + } + # Either Dir Exists, or was created fine. + $config{$hash_key} = $var; + $complete = 1; + print "\n"; + } +} + +sub getosflags { + if ($config{OSNAME} =~ /BSD$/) { + $config{LDLIBS} = "-Ldl -lstdc++"; + $config{FLAGS} = "-fPIC -frtti -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 -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}"; + $config{MAKEPROG} = "make"; + if ($config{OSNAME} =~ /CYGWIN/) { + $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}"; + $config{LDLIBS} = ""; + $config{MAKEPROG} = "/usr/bin/make"; + $config{MAKEORDER} = "ircd mods"; + } elsif ($config{OSNAME} eq "CYG-STATIC") { + $config{FLAGS} = "-frtti -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"; + } +} + +sub is_dir { + my ($path) = @_; + if (chdir($path)) { + chdir($this); + return 1; + } else { + # Just in case.. + chdir($this); + return 0; + } +} + +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; +} + +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 $revision2 = getrevision()); + 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 FILEHANDLE <= 3) { + print FILEHANDLE "#define GCC3\n"; + } + if ($config{HAS_STRLCPY} eq "true") { + print FILEHANDLE "#define HAS_STRLCPY\n"; + } + if ($config{HAS_STDINT} eq "true") { + print FILEHANDLE "#define HAS_STDINT\n"; + } + if ($config{THREADED_DNS} =~ /y/i) { + print FILEHANDLE "#define THREADED_DNS\n"; + } + if ($config{IPV6} =~/y/i) { + print FILEHANDLE "#define IPV6\n"; + } + my $use_hiperf = 0; + if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) { + print FILEHANDLE "#define USE_KQUEUE\n"; + $se = "socketengine_kqueue"; + $use_hiperf = 1; + } + if (($has_epoll) && ($config{USE_EPOLL} eq "y")) { + print FILEHANDLE "#define USE_EPOLL\n"; + $se = "socketengine_epoll"; + $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 FILEHANDLE "\n#endif\n"; + close(FILEHANDLE); + } + +open(FILEHANDLE, ">include/inspircd_se_config.h"); + print FILEHANDLE <) { + $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]); +} + +sub yesno { + my ($flag,$prompt) = @_; + print "$prompt [\033[1;32m$config{$flag}\033[0m] -> "; + chomp($tmp = ); + if ($tmp eq "") { $tmp = $config{$flag} } + + if (($tmp eq "") || ($tmp =~ /^y/i)) { + $config{$flag} = "y"; + } else { + $config{$flag} = "n"; + } + return; +} + +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 + +all: \$(MODULES) + +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 <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 "; + } + 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 <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 libIRCDmessage.so $cmdobjs libIRCDcommands.so libIRCDdnsqueue.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 libIRCDmessage.so $cmdobjs libIRCDsnomasks.so libIRCDcommands.so libIRCDdnsqueue.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 libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.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 + +libIRCDmessage.so: message.cpp ../include/base.h ../include/message.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 message.cpp + \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmessage.so message.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 $srcobjs + \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp + \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o $cmdobjs + +libIRCDdnsqueue.so: dnsqueue.cpp ../include/base.h ../include/dnsqueue.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 dnsqueue.cpp + \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdnsqueue.so dnsqueue.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 <