2 # InspIRCd Configuration Script
4 # Copyright 2003 The ChatSpike Development Team
5 # <brain@chatspike.net>
6 # <Craig@chatspike.net>
8 # [14:21] Brain: <matrix impression> i know perl-fu!
12 ########################################
14 chomp($topdir = `pwd`);
15 $this = resolve_directory($topdir); # PWD, Regardless.
16 @modlist = (); # Declare for Module List..
17 %config = (); # Initiate Configuration Hash..
18 $config{ME} = resolve_directory($topdir); # Present Working Directory
19 $config{CONFIG_DIR} = resolve_directory($config{ME}."/conf"); # Configuration Directory
20 $config{MODULE_DIR} = resolve_directory($config{ME}."/modules"); # Modules Directory
21 $config{BINARY_DIR} = resolve_directory($config{ME}."/bin"); # Binary Directory
22 $config{LIBRARY_DIR} = resolve_directory($config{ME}."/lib"); # Library Directory
23 $config{OPTIMITEMP} = "0"; # Default Optimisation Value
24 $config{OPTIMISATI} = "-g"; # Optimisation Flag
25 $config{NICK_LENGT} = "32"; # Default Nick Length
26 $config{CHAN_LENGT} = "64"; # Default Channel Name Length
27 $config{MAX_CHANNE} = "20"; # Default Max. Channels per user..
28 $config{MAXI_MODES} = "20"; # Default Max. Number of Modes set at once.
29 $config{HAS_STRLCPY} = "false"; # strlcpy Check.
30 $config{USE_KQUEUE} = "y"; # kqueue enabled
31 $config{USE_EPOLL} = "y"; # epoll enabled
32 $config{STATIC_LINK} = "no"; # are doing static modules?
33 chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`); # FD Limit
34 chomp($config{GCCVER} = `gcc -dumpversion | cut -c 1`); # Major GCC Version
35 chomp($config{GCC34} = `gcc -dumpversion | cut -c 3`); # Minor GCC Version
36 chomp($config{OSNAME} = `/bin/uname`); # Operating System Name
37 $config{CC} = "g++"; # C++ compiler
38 $config{MAKEORDER} = "ircd mods config bininst"; # build order
39 $config{STATICLIBS} = ""; # library archive path
41 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
42 chomp($config{OSNAME} = `/usr/bin/uname`);
43 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){
44 $config{OSNAME} = "Unknown";
48 if (!$config{MAX_CLIENT_T}) {
49 $config{MAX_CLIENT_T} = 1024; # Set a reasonable 'Default'
50 $fd_scan_fail = "true"; # Used Later
53 # Get and Set some important vars..
56 my $arg = $ARGV[0]; # Do Some Argument Checks..
57 if ($arg eq "-clean") { `rm -rf .config.cache`; } # Remove the config.cache file.
59 if ($arg eq "-update") {
60 # Does the cache file exist?
62 # No, No it doesn't.. *BASH*
63 print "You have not run ./configure before. Please do this before trying to run the update script.\n";
66 # We've Loaded the cache file and all our variables..
67 print "Updating Files..\n";
75 print "Checking for cache from previous configure...\n";
77 print "Checking operating system version...\n";
80 if (!$config{MAX_CLIENT}) {
81 # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
82 # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
83 # higher than the found value" :))
84 $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
87 printf "Checking if strlcpy exists... ";
88 # Perform the strlcpy() test..
89 $config{HAS_STRLCPY} = "false";
91 open(STRLCPY, "</usr/include/string.h") or $fail = 1;
94 while (chomp($line = <STRLCPY>))
96 # try and find the delcaration of:
98 if ($line =~ /size_t(\0x9|\s)+strlcpy/)
100 $config{HAS_STRLCPY} = "true";
105 print "yes\n" if $config{HAS_STRLCPY} eq "true";
106 print "no\n" if $config{HAS_STRLCPY} eq "false";
108 printf "Checking if kqueue exists... ";
111 open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
114 while (chomp($line = <KQUEUE>))
116 # try and find the delcaration of:
118 if ($line =~ /int(\0x9|\s)+kqueue/)
125 print "yes\n" if $has_kqueue == 1;
126 print "no\n" if $has_kqueue == 0;
128 printf "Checking if epoll exists... ";
131 open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
134 while (chomp($line = <EPOLL>))
136 # try and find the declaration of:
137 # extern int epoll_create (int __size) __THROW;
138 if (($line =~ /int(\0x9|\s)+epoll_create(\0x9|\s)+\(/) || ($line =~ /int(\0x9|\s)+epoll_create\(/))
145 print "yes\n" if $has_epoll == 1;
146 print "no\n" if $has_epoll == 0;
148 if ($config{OSNAME} =~ /CYGWIN/) {
149 $config{HAS_STRLCPY} = "true";
152 ################################################################################
153 # BEGIN INTERACTIVE PART #
154 ################################################################################
158 # Display Splash Logo..
160 chomp($wholeos = `uname -mnr`);
162 # Display Introduction Message..
164 Welcome to the InspIRCd Configuration program!
166 *** If you are unsure of any of these values, leave it blank for ***
167 *** standard settings that will work, and your server will run ***
168 *** using them. If you are running this server as part of a ***
169 *** larger network, you must consult with your network admins ***
170 *** for the proper values to use, or server links will be unstable! ***
172 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
173 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
174 dir, otherwise you won't have a config file!
176 Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $config{MAX_CLIENT_T}\n\n";
178 # Directory Settings..
179 dir_check("are the configuration files", "CONFIG_DIR");
180 dir_check("are the modules to be compiled to", "MODULE_DIR");
181 dir_check("is the IRCd binary to be placed", "BINARY_DIR");
182 dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
185 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?");
188 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?");
190 $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
193 print "No high-performance socket engines are available, or you chose\n";
194 print "not to enable one. Defaulting to select() engine.\n\n";
197 # File Descriptor Settings..
200 print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
201 print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
202 chomp($var = <STDIN>);
203 if ($var eq "") { $var = $config{MAX_CLIENT}; }
204 if ($var =~ /^\d+$/) {
205 if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
206 # Client has entered a larger number than the 'discovered' value
208 print "WARNING: Our scans have indicated that you are attempting
209 to use more sockets than there are avaliable. Are you sure
210 you wish to do this? It may cause the IRCd to malfunction [y/n]
211 [\033[1;32mn\033[0m] -> $c";
212 chomp($tmp = <STDIN>);
214 print "Please enter the correct value.\n\n";
219 print "You must enter a number in this field. Please try again.\n\n";
222 # If we get here, we should be good to go.
223 $config{MAX_CLIENT} = $var;
230 print "What is the Maximum length of nicknames?\n";
231 print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> ";
232 chomp($var = <STDIN>);
233 if ($var eq "") { $var = $config{NICK_LENGT}; }
234 if ($var =~ /^\d+$/) {
235 # We don't care what the number is, set it and be on our way.
236 $config{NICK_LENGT} = $var;
240 print "You must enter a number in this field. Please try again.\n\n";
246 print "What is the Maximum number of mode changes in one line?\n";
247 print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> ";
248 chomp($var = <STDIN>);
249 if ($var eq "") { $var = $config{MAXI_MODES}; }
250 if ($var =~ /^\d+$/) {
251 # We don't care what the number is, set it and be on our way.
252 $config{MAXI_MODES} = $var;
256 print "You must enter a number in this field. Please try again.\n\n";
261 print "Enter the Level Of Binary optimisation. This is a number between 0 and 3 (inclusive)
262 The InspIRCd Team will _NOT_ support any bug reports above 0.
263 Also note, the IRCd behaviour will be different depending on this value.
264 Please read the documentation for more information.
266 The Higher the number, the more optimised your binary will be. This value will default to 0
267 If you either a) Dont enter a number, or b) Enter a value outside the range.\n";
268 print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
269 chomp($var = <STDIN>);
271 $var = $config{OPTIMITEMP};
275 $config{OPTIMITEMP} = 1;
276 $config{OPTIMISATI} = "-O";
277 } elsif ($var eq "2") {
278 $config{OPTIMITEMP} = 2;
279 $config{OPTIMISATI} = "-O2";
280 } elsif ($var eq "3") {
281 $config{OPTIMITEMP} = 3;
282 $config{OPTIMISATI} = "-O3";
284 $config{OPTIMITEMP} = 0;
285 $config{OPTIMISATI} = "-g";
288 print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
289 print "\033[0mConfig path:\033[1;32m\t\t\t$config{CONFIG_DIR}\n";
290 print "\033[0mModule path:\033[1;32m\t\t\t$config{MODULE_DIR}\n";
291 print "\033[0mMax connections:\033[1;32m\t\t$config{MAX_CLIENT}\n";
292 print "\033[0mMax User Channels\033[1;32m\t\t$config{MAX_CHANNE}\n";
293 print "\033[0mMax nickname length:\033[1;32m\t\t$config{NICK_LENGT}\n";
294 print "\033[0mMax channel length:\033[1;32m\t\t$config{CHAN_LENGT}\n";
295 print "\033[0mMax mode length:\033[1;32m\t\t$config{MAXI_MODES}\n";
296 print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.$config{GCC34}\n";
297 print "\033[0mOptimatizaton Flag:\033[1;32m\t\t$config{OPTIMISATI}\033[0m\n";
298 print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n";
299 print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n\n";
305 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
306 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
307 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
308 print "\033[1;32mWARNING!\033[0m You are running OpenBSD but you are using the base gcc package\nrather than eg++. This compile will most likely fail, but i'm letting you\ngo ahead with it anyway, just in case i'm wrong :-)\n";
310 if ($config{OSNAME} =~ /CYGWIN/) {
312 \033[1;32mWARNING!\033[0m CYGWIN does not properly support shared modules,
313 so modules will be compiled statically into the core of the ircd. The modules
314 will act like they are being loaded from disk and being unloaded from RAM,
315 however they are in fact being enabled and disabled similar to features in
320 ################################################################################
322 ################################################################################
324 # Retrieves the .config.cache file, and loads values into the main config hash.
325 open(CACHE, ".config.cache") or return undef;
329 # Ignore Blank lines, and comments..
333 my ($key, $value) = split("=", $_);
334 $value =~ /^\"(.*)\"$/;
335 # Do something with data here!
343 # Dump the contents of %config
344 print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
345 open(FILEHANDLE, ">.config.cache");
346 foreach $key (keys %config)
348 print FILEHANDLE "$key=\"$config{$key}\"\n";
354 my ($desc, $hash_key) = @_;
357 print "In what directory $desc?\n";
358 print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
359 chomp($var = <STDIN>);
360 if ($var eq "") { $var = $config{$hash_key}; }
361 if ($var =~ /^\~\/(.+)$/) {
362 # Convert it to a full path..
363 $var = resolve_directory($ENV{HOME} . "/" . $1);
365 if (substr($var,0,1) ne "/")
367 # Assume relative Path was given.. fill in the rest.
368 $var = $this . "/$var";
370 $var = resolve_directory($var);
372 print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
373 chomp($tmp = <STDIN>);
374 if (($tmp eq "") || ($tmp =~ /^y/i)) {
375 # Attempt to Create the Dir..
376 $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
378 print "Unable to create directory. ($var)\n\n";
383 # They said they don't want to create, and we can't install there.
389 # Target exists, but is not a directory.
390 print "File $var exists, but is not a directory.\n\n";
394 # Either Dir Exists, or was created fine.
395 $config{$hash_key} = $var;
402 if ($config{OSNAME} =~ /BSD$/) {
403 $config{LDLIBS} = "-Ldl";
404 $config{FLAGS} = "-fPIC -frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
405 $config{MAKEPROG} = "gmake";
406 if ($config{OSNAME} eq "OpenBSD") {
407 chomp($foo = `eg++ -dumpversion | cut -c 1`);
408 # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
409 # if theyre not running this, configure lets the build continue but they probably wont manage to
410 # compile as this standard version is 2.95.3!
412 $config{CC} = "eg++";
413 chomp($config{GCCVER} = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change
414 chomp($config{GCC34} = `eg++ -dumpversion | cut -c 3`); # the compiler path
418 $config{LDLIBS} = "-ldl";
419 $config{FLAGS} = "-fPIC -frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
420 $config{MAKEPROG} = "make";
421 if ($config{OSNAME} =~ /CYGWIN/) {
422 $config{FLAGS} = "-frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
423 $config{LDLIBS} = "";
424 $config{MAKEPROG} = "/usr/bin/make";
425 $config{MAKEORDER} = "mods ircd config bininst";
426 $config{STATICLIBS} = "modules/mods.a";
427 $config{STATIC_LINK} = "yes";
430 if ($config{OSNAME} =~ /SunOS/) {
431 # solaris/sunos needs these
432 # socket = bsd sockets api
434 # rt = POSIX realtime extensions
435 # resolv = inet_aton only (why isnt this in nsl?!)
436 $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
454 opendir(DIRHANDLE, "src/modules");
455 foreach $name (sort readdir(DIRHANDLE)) {
456 if ($name =~ /^m_(.+)\.cpp$/)
459 if ($mod !~ /_static$/) {
460 $modlist[$i++] = $mod;
469 print "Writing \033[1;32minspircd_config.h\033[0m\n";
470 # First File.. inspircd_config.h
471 chomp(my $incos = `uname -n -s -r`);
472 chomp(my $version = `sh ./src/version.sh`);
473 open(FILEHANDLE, ">include/inspircd_config.h");
474 print FILEHANDLE <<EOF;
475 /* Auto generated by configure, do not modify! */
476 #define SYSLOG_FACILITY LOG_DAEMON
477 #define SYSLOG_LEVEL LOG_NOTICE
478 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
479 #define MOD_PATH "$config{MODULE_DIR}"
480 #define VERSION "$version"
481 #define MAXCLIENTS $config{MAX_CLIENT}
482 #define NICKMAX $config{NICK_LENGT}
483 #define CHANMAX $config{CHAN_LENGT}
484 #define MAXCHANS $config{MAX_CHANNE}
485 #define MAXMODES $config{MAXI_MODES}
486 #define OPTIMISATION $config{OPTIMITEMP}
487 #define SYSTEM "$incos"
491 if ($config{OSNAME} =~ /SunOS/) {
492 print FILEHANDLE "#define IS_SOLARIS\n";
494 if ($config{STATIC_LINK} eq "yes") {
495 print FILEHANDLE "#define STATIC_LINK\n";
497 if ($config{GCCVER} > 3) {
498 print FILEHANDLE "#define GCC3\n";
499 print FILEHANDLE "#define GCC34\n";
503 if ($config{GCCVER} == 3) {
504 print FILEHANDLE "#define GCC3\n";
505 if ($config{GCC34} > 3) {
506 print FILEHANDLE "#define GCC34\n";
510 if ($config{HAS_STRLCPY} eq "true") {
511 print FILEHANDLE "#define HAS_STRLCPY\n";
514 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
515 print FILEHANDLE "#define USE_KQUEUE\n";
518 if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
519 print FILEHANDLE "#define USE_EPOLL\n";
522 # user didn't choose either epoll or select for their OS.
523 # default them to USE_SELECT (ewwy puke puke)
525 print FILEHANDLE "#define USE_SELECT\n";
529 # Create a Modules List..
531 foreach $i (@modlist)
533 if ($config{OSNAME} =~ /CYGWIN/) {
534 $modules .= "m_".$i.".o ";
537 $modules .= "m_".$i.".so ";
540 chomp($modules); # Remove Redundant whitespace..
543 # Write all .in files.
546 my $exe = "inspircd";
548 if ($config{OSNAME} =~ /CYGWIN/) {
549 $exe = "inspircd.exe";
552 opendir(DIRHANDLE, $this);
553 foreach $name (sort readdir(DIRHANDLE)) {
554 if ($name =~ /^\.(.+)\.inc$/)
557 # All .name.inc files need parsing!
559 open(FILEHANDLE, ".$file.inc");
560 while (<FILEHANDLE>) {
565 $tmp =~ s/\@CC\@/$config{CC}/;
566 $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
567 $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
568 $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
569 $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
570 $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
571 $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
572 $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
573 $tmp =~ s/\@MODULES\@/$modules/;
574 $tmp =~ s/\@EXECUTABLE\@/$exe/;
575 $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
576 $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
578 print "Writing \033[1;32m$file\033[0m\n";
579 open(FILEHANDLE, ">$file");
580 print FILEHANDLE $tmp;
585 # Make inspircd executable!
586 chmod 0744, 'inspircd';
588 if ($config{OSNAME} =~ /CYGWIN/) {
589 print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
590 write_static_makefile();
593 print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
594 write_dynamic_makefile();
599 print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
600 open(FILEHANDLE, ">src/modules/Makefile");
601 print FILEHANDLE <<EOF;
602 # (C) ChatSpike development team
603 # Makefile by <Craig\@ChatSpike.net>
604 # Many Thanks to Andrew Church <achurch\@achurch.org>
605 # for assisting with making this work right.
607 # Automatically Generated by ./configure to add a modules
608 # please run ./configure --update
614 # Create a Modules List..
617 if ($config{OSNAME} =~ /CYGWIN/) {
618 open(MODLIST,">include/modlist.h");
619 print MODLIST <<HEADER;
620 // Generated automatically by configure. DO NOT EDIT!
622 #ifndef __SYMBOLS__H_CONFIGURED__
623 #define __SYMBOLS__H_CONFIGURED__
626 foreach $i (@modlist) {
627 if ($i !~ /_static$/) {
628 print MODLIST "extern \"C\" void * $i\_init (void);\n";
631 print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
633 foreach $i (@modlist)
635 if ($i !~ /_static$/) {
636 $flags = getcompilerflags("src/modules/m_".$i.".cpp");
637 if ($config{OSNAME} =~ /CYGWIN/) {
638 print FILEHANDLE <<EOCHEESE;
639 m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h
640 \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
641 mv m_$i\_static.o ../m_$i.o
644 print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
645 open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
646 open(MUNGED,">src/modules/m_".$i."_static.cpp") or die("Could not create m_".$i."_static.cpp");
647 while (chomp($a = <MODULE>)) {
648 $a =~ s/init_module/$i\_init/g;
649 $a =~ s/Srv/$i\Srv/g;
654 print MODLIST <<EOENT;
655 {"m_$i.so",\&$i\_init},
660 print FILEHANDLE <<EOCHEESE;
661 m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h
662 \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i.cpp
663 \$(CC) \$(FLAGS) -shared $flags -o m_$i.so m_$i.o
664 cp m_$i.so \$(MODPATH)/
665 chmod 0700 \$(MODPATH)/m_$i.so
671 if ($config{OSNAME} =~ /CYGWIN/) {
672 print MODLIST "{0}};\n\n#endif\n";
677 sub getcompilerflags {
681 if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
691 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";
692 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";
693 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";
694 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";
695 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";
696 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";
697 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";
698 print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n";
701 sub resolve_directory {
703 return File::Spec->rel2abs($_[0]);
707 my ($flag,$prompt) = @_;
708 print "$prompt [\033[1;32m$config{$flag}\033[0m] -> ";
709 chomp($tmp = <STDIN>);
710 if ($tmp eq "") { $tmp = $config{$flag} }
712 if (($tmp eq "") || ($tmp =~ /^y/i)) {
713 $config{$flag} = "y";
715 $config{$flag} = "n";
721 sub write_static_makefile {
722 open(FH,">src/Makefile") or die("Could not write src/Makefile!");
726 # (C) ChatSpike development team
727 # Makefile by <Craig\@ChatSpike.net>
728 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
733 CXXFLAGS = -I../include \${FLAGS}
735 all: hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o connection.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o servers.o helperfuncs.o \$(MODULES) inspircd.exe
737 inspircd.exe: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h
738 \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o connection.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o servers.o helperfuncs.o hashcomp.o \$(MODULES)
740 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
741 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
743 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
744 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
746 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
747 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
749 mode.o: mode.cpp ../include/base.h ../include/mode.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
750 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
752 xline.o: xline.cpp ../include/base.h ../include/xline.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
753 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
755 inspstring.o: inspstring.cpp ../include/base.h ../include/inspstring.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
756 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
758 dns.o: dns.cpp ../include/base.h ../include/dns.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
759 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
761 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
762 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
764 inspircd_util.o: inspircd_util.cpp ../include/base.h ../include/inspircd_util.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
765 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_util.cpp
767 inspircd_io.o: inspircd_io.cpp ../include/base.h ../include/inspircd_io.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
768 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
770 connection.o: connection.cpp ../include/base.h ../include/connection.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
771 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c connection.cpp
773 message.o: message.cpp ../include/base.h ../include/message.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
774 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
776 commands.o: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
777 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
779 dnsqueue.o: dnsqueue.cpp ../include/base.h ../include/dnsqueue.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
780 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
782 dynamic.o: dynamic.cpp ../include/base.h ../include/dynamic.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
783 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
785 users.o: users.cpp ../include/base.h ../include/users.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
786 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
788 modules.o: modules.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
789 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
791 wildcard.o: wildcard.cpp ../include/base.h ../include/wildcard.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
792 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
794 servers.o: servers.cpp ../include/base.h ../include/servers.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
795 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c servers.cpp
802 sub write_dynamic_makefile {
803 open(FH,">src/Makefile") or die("Could not write src/Makefile");
807 # (C) ChatSpike development team
808 # Makefile by <Craig\@ChatSpike.net>
809 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
814 CXXFLAGS = -I../include \${FLAGS}
816 all: libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDutil.so libIRCDio.so libIRCDconnection.so libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDservers.so libIRCDhelper.so inspircd
818 inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h
819 \$(CC) -I../include \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDutil.so libIRCDio.so libIRCDconnection.so libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDservers.so libIRCDhelper.so libIRCDhash.so
821 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
822 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
823 \$(CC) -shared -o libIRCDhash.so hashcomp.o
825 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
826 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
827 \$(CC) -shared -o libIRCDhelper.so helperfuncs.o
829 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
830 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
831 \$(CC) -shared -o libIRCDchannels.so channels.o
833 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
834 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
835 \$(CC) -shared -o libIRCDmode.so mode.o
837 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
838 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
839 \$(CC) -shared -o libIRCDxline.so xline.o
841 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
842 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
843 \$(CC) -shared -o libIRCDstring.so inspstring.o
845 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
846 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
847 \$(CC) -shared -o libIRCDasyncdns.so dns.o
849 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
850 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
851 \$(CC) -shared -o libIRCDbase.so base.o
853 libIRCDutil.so: inspircd_util.cpp ../include/base.h ../include/inspircd_util.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
854 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_util.cpp
855 \$(CC) -shared -o libIRCDutil.so inspircd_util.o
857 libIRCDio.so: inspircd_io.cpp ../include/base.h ../include/inspircd_io.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
858 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
859 \$(CC) -shared -o libIRCDio.so inspircd_io.o
861 libIRCDconnection.so: connection.cpp ../include/base.h ../include/connection.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
862 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c connection.cpp
863 \$(CC) -shared -o libIRCDconnection.so connection.o
865 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
866 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
867 \$(CC) -shared -o libIRCDmessage.so message.o
869 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
870 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
871 \$(CC) -shared -o libIRCDcommands.so commands.o
873 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
874 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
875 \$(CC) -shared -o libIRCDdnsqueue.so dnsqueue.o
877 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
878 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
879 \$(CC) -shared -o libIRCDdynamic.so dynamic.o
881 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 ../include/connection.h
882 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
883 \$(CC) -shared -o libIRCDusers.so users.o
885 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
886 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
887 \$(CC) -shared -o libIRCDmodules.so modules.o
889 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
890 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
891 \$(CC) -shared -o libIRCDwildcard.so wildcard.o
893 libIRCDservers.so: servers.cpp ../include/base.h ../include/servers.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
894 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c servers.cpp
895 \$(CC) -shared -o libIRCDservers.so servers.o