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{BASE_DIR} = $config{ME}; # Use CWD as 'Base' Directory.
20 $config{CONFIG_DIR} = resolve_directory($config{ME}."/conf"); # Configuration Directory
21 $config{MODULE_DIR} = resolve_directory($config{ME}."/modules"); # Modules Directory
22 $config{BINARY_DIR} = resolve_directory($config{ME}."/bin"); # Binary Directory
23 $config{LIBRARY_DIR} = resolve_directory($config{ME}."/lib"); # Library Directory
24 $config{OPTIMITEMP} = "0"; # Default Optimisation Value
25 $config{OPTIMISATI} = "-g"; # Optimisation Flag
26 $config{NICK_LENGT} = "31"; # Default Nick Length
27 $config{CHAN_LENGT} = "64"; # Default Channel Name Length
28 $config{MAX_CHANNE} = "20"; # Default Max. Channels per user
29 $config{MAX_OPERCH} = "60"; # Default Max. Channels per oper
30 $config{MAXI_MODES} = "20"; # Default Max. Number of Modes set at once.
31 $config{HAS_STRLCPY} = "false"; # strlcpy Check.
32 $config{USE_KQUEUE} = "y"; # kqueue enabled
33 $config{USE_EPOLL} = "y"; # epoll enabled
34 $config{THREADED_DNS} = "n"; # threaded dns (experimental)
35 $config{STATIC_LINK} = "no"; # are doing static modules?
36 chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`); # FD Limit
37 chomp($config{MAX_DESCRIPTORS} = `sh -c \"ulimit -n\"`); # Hard FD Limit
38 chomp($config{GCCVER} = `gcc -dumpversion | cut -c 1`); # Major GCC Version
39 chomp($config{GCC34} = `gcc -dumpversion | cut -c 3`); # Minor GCC Version
40 chomp($config{OSNAME} = `/bin/uname`); # Operating System Name
41 $config{CC} = "g++"; # C++ compiler
42 $config{MAKEORDER} = "ircd mods config bininst"; # build order
43 $config{STATICLIBS} = ""; # library archive path
44 $config{MAX_IDENT} = "12"; # max ident size
45 $config{MAX_QUIT} = "255"; # max quit message size
46 $config{MAX_TOPIC} = "307"; # max topic size
47 $config{MAX_KICK} = "255"; # max kick message size
48 $config{MAX_GECOS} = "128"; # max GECOS size
49 $config{MAX_AWAY} = "200"; # max AWAY size
51 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
52 chomp($config{OSNAME} = `/usr/bin/uname`);
53 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){
54 $config{OSNAME} = "Unknown";
58 if (!$config{MAX_CLIENT_T}) {
59 $config{MAX_CLIENT_T} = 1024; # Set a reasonable 'Default'
60 $fd_scan_fail = "true"; # Used Later
63 # Get and Set some important vars..
66 my $arg = $ARGV[0]; # Do Some Argument Checks..
67 if ($arg eq "-clean") { `rm -rf .config.cache`; } # Remove the config.cache file.
69 if ($arg eq "-update") {
70 # Does the cache file exist?
72 # No, No it doesn't.. *BASH*
73 print "You have not run ./configure before. Please do this before trying to run the update script.\n";
76 # We've Loaded the cache file and all our variables..
77 print "Updating Files..\n";
79 $has_epoll = $config{HAS_EPOLL};
80 $has_kqueue = $config{HAS_KQUEUE};
87 print "Checking for cache from previous configure...\n";
89 print "Checking operating system version...\n";
92 if (!$config{MAX_CLIENT}) {
93 # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
94 # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
95 # higher than the found value" :))
96 $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
99 printf "Checking if strlcpy exists... ";
100 # Perform the strlcpy() test..
101 $config{HAS_STRLCPY} = "false";
103 open(STRLCPY, "</usr/include/string.h") or $fail = 1;
106 while (chomp($line = <STRLCPY>))
108 # try and find the delcaration of:
109 # size_t strlcpy(...)
110 if ($line =~ /size_t(\0x9|\s)+strlcpy/)
112 $config{HAS_STRLCPY} = "true";
117 print "yes\n" if $config{HAS_STRLCPY} eq "true";
118 print "no\n" if $config{HAS_STRLCPY} eq "false";
120 printf "Checking if kqueue exists... ";
123 open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
126 while (chomp($line = <KQUEUE>))
128 # try and find the delcaration of:
130 if ($line =~ /int(\0x9|\s)+kqueue/)
137 print "yes\n" if $has_kqueue == 1;
138 print "no\n" if $has_kqueue == 0;
140 printf "Checking if epoll exists... ";
143 open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
146 while (chomp($line = <EPOLL>))
148 # try and find the declaration of:
149 # extern int epoll_create (int __size) __THROW;
150 if (($line =~ /int(\0x9|\s)+epoll_create(\0x9|\s)+\(/) || ($line =~ /int(\0x9|\s)+epoll_create\(/))
158 my $kernel = `uname -r`;
160 if (($kernel =~ /2\.0/) || ($kernel =~ /2\.2/) || ($kernel =~ /2\.4/)) {
164 print "yes\n" if $has_epoll == 1;
165 print "no\n" if $has_epoll == 0;
167 if ($config{OSNAME} =~ /CYGWIN/) {
168 $config{HAS_STRLCPY} = "true";
171 $config{HAS_EPOLL} = $has_epoll;
172 $config{HAS_KQUEUE} = $has_kqueue;
174 ################################################################################
175 # BEGIN INTERACTIVE PART #
176 ################################################################################
180 # Display Splash Logo..
182 chomp($wholeos = `uname -mnr`);
184 # Display Introduction Message..
186 Welcome to the InspIRCd Configuration program!
188 *** If you are unsure of any of these values, leave it blank for ***
189 *** standard settings that will work, and your server will run ***
190 *** using them. If you are running this server as part of a ***
191 *** larger network, you must consult with your network admins ***
192 *** for the proper values to use, or server links will be unstable! ***
194 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
195 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
196 dir, otherwise you won't have a config file!
198 Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $config{MAX_CLIENT_T}\n\n";
200 $config{CHANGE_COMPILER} = "n";
201 print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.$config{GCC34}\033[0m)\n";
203 if ($config{GCCVER} < 3)
205 print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
206 should NOT be used. You should probably specify a newer compiler.\n";
208 yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
209 if ($config{CHANGE_COMPILER} =~ /y/i)
211 print "What command do you want to use to invoke your compiler?\n";
212 print "[\033[1;32m$config{CC}\033[0m] -> ";
213 chomp($config{CC} = <STDIN>);
214 if ($config{CC} eq "") { $config{CC} = "g++"; }
215 chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
217 chomp($config{GCCVER} = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change
218 chomp($config{GCC34} = `$config{CC} -dumpversion | cut -c 3`); # the compiler path
219 print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.$config{GCC34}\033[0m)\n";
223 print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
229 # Directory Settings..
230 my $tmpbase = $config{BASE_DIR};
231 dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
232 if ($tmpbase ne $config{BASE_DIR}) {
233 $config{CONFIG_DIR} = resolve_directory($config{BASE_DIR}."/conf"); # Configuration Directory
234 $config{MODULE_DIR} = resolve_directory($config{BASE_DIR}."/modules"); # Modules Directory
235 $config{BINARY_DIR} = resolve_directory($config{BASE_DIR}."/bin"); # Binary Directory
236 $config{LIBRARY_DIR} = resolve_directory($config{BASE_DIR}."/lib"); # Library Directory
239 dir_check("are the configuration files", "CONFIG_DIR");
240 dir_check("are the modules to be compiled to", "MODULE_DIR");
241 dir_check("is the IRCd binary to be placed", "BINARY_DIR");
242 dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
245 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?");
249 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?");
252 $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
255 print "No high-performance socket engines are available, or you chose\n";
256 print "not to enable one. Defaulting to select() engine.\n\n";
259 yesno(THREADED_DNS,"Would you like to enable the experimental multi-threaded DNS lookup?");
262 print "\nThe following questions will ask you for various figures relating\n";
263 print "To your IRCd install. Please note that these should usually be left\n";
264 print "as defaults unless you have a real reason to change them. If they\n";
265 print "changed, then the values must be identical on all servers on your\n";
266 print "network, or malfunctions and/or crashes may occur, with the exception\n";
267 print "of the 'maximum number of clients' setting which may be different on\n";
268 print "different servers on the network.\n\n";
270 # File Descriptor Settings..
273 print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
274 print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
275 chomp($var = <STDIN>);
276 if ($var eq "") { $var = $config{MAX_CLIENT}; }
277 if ($var =~ /^\d+$/) {
278 if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
279 # Client has entered a larger number than the 'discovered' value
281 print "WARNING: Our scans have indicated that you are attempting
282 to use more sockets than there are avaliable. Are you sure
283 you wish to do this? It may cause the IRCd to malfunction [y/n]
284 [\033[1;32mn\033[0m] -> $c";
285 chomp($tmp = <STDIN>);
287 print "Please enter the correct value.\n\n";
292 print "You must enter a number in this field. Please try again.\n\n";
295 # If we get here, we should be good to go.
296 $config{MAX_CLIENT} = $var;
303 print "What is the maximum length of nicknames?\n";
304 print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> ";
305 chomp($var = <STDIN>);
306 if ($var eq "") { $var = $config{NICK_LENGT}; }
307 if ($var =~ /^\d+$/) {
308 # We don't care what the number is, set it and be on our way.
309 $config{NICK_LENGT} = $var;
313 print "You must enter a number in this field. Please try again.\n\n";
319 print "What is the maximum length of channel names?\n";
320 print "[\033[1;32m$config{CHAN_LENGT}\033[0m] -> ";
321 chomp($var = <STDIN>);
322 if ($var eq "") { $var = $config{CHAN_LENGT}; }
323 if ($var =~ /^\d+$/) {
324 # We don't care what the number is, set it and be on our way.
325 $config{CHAN_LENGT} = $var;
329 print "You must enter a number in this field. Please try again.\n\n";
335 print "What is the maximum number of channels a normal user may join at any one time?\n";
336 print "[\033[1;32m$config{MAX_CHANNE}\033[0m] -> ";
337 chomp($var = <STDIN>);
338 if ($var eq "") { $var = $config{MAX_CHANNE}; }
339 if ($var =~ /^\d+$/) {
340 # We don't care what the number is, set it and be on our way.
341 $config{MAX_CHANNE} = $var;
345 print "You must enter a number in this field. Please try again.\n\n";
351 print "What is the maximum number of channels an oper may join at any one time?\n";
352 print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> ";
353 chomp($var = <STDIN>);
354 if ($var eq "") { $var = $config{MAX_OPERCH}; }
355 if ($var =~ /^\d+$/) {
356 # We don't care what the number is, set it and be on our way.
357 $config{MAX_OPERCH} = $var;
365 print "What is the maximum number of mode changes in one line?\n";
366 print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> ";
367 chomp($var = <STDIN>);
368 if ($var eq "") { $var = $config{MAXI_MODES}; }
369 if ($var =~ /^\d+$/) {
370 # We don't care what the number is, set it and be on our way.
371 $config{MAXI_MODES} = $var;
375 print "You must enter a number in this field. Please try again.\n\n";
381 print "What is the maximum length of an ident (username)?\n";
382 print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> ";
383 chomp($var = <STDIN>);
384 if ($var eq "") { $var = $config{MAX_IDENT}; }
385 if ($var =~ /^\d+$/) {
386 # We don't care what the number is, set it and be on our way.
387 $config{MAX_IDENT} = $var;
391 print "You must enter a number in this field. Please try again.\n\n";
397 print "What is the maximum length of a quit message?\n";
398 print "[\033[1;32m$config{MAX_QUIT}\033[0m] -> ";
399 chomp($var = <STDIN>);
400 if ($var eq "") { $var = $config{MAX_QUIT}; }
401 if ($var =~ /^\d+$/) {
402 # We don't care what the number is, set it and be on our way.
403 $config{MAX_QUIT} = $var;
407 print "You must enter a number in this field. Please try again.\n\n";
413 print "What is the maximum length of a channel topic?\n";
414 print "[\033[1;32m$config{MAX_TOPIC}\033[0m] -> ";
415 chomp($var = <STDIN>);
416 if ($var eq "") { $var = $config{MAX_TOPIC}; }
417 if ($var =~ /^\d+$/) {
418 # We don't care what the number is, set it and be on our way.
419 $config{MAX_TOPIC} = $var;
423 print "You must enter a number in this field. Please try again.\n\n";
429 print "What is the maximum length of a kick message?\n";
430 print "[\033[1;32m$config{MAX_KICK}\033[0m] -> ";
431 chomp($var = <STDIN>);
432 if ($var eq "") { $var = $config{MAX_KICK}; }
433 if ($var =~ /^\d+$/) {
434 # We don't care what the number is, set it and be on our way.
435 $config{MAX_KICK} = $var;
439 print "You must enter a number in this field. Please try again.\n\n";
445 print "What is the maximum length of a GECOS (real name) field?\n";
446 print "[\033[1;32m$config{MAX_GECOS}\033[0m] -> ";
447 chomp($var = <STDIN>);
448 if ($var eq "") { $var = $config{MAX_GECOS}; }
449 if ($var =~ /^\d+$/) {
450 # We don't care what the number is, set it and be on our way.
451 $config{MAX_GECOS} = $var;
455 print "You must enter a number in this field. Please try again.\n\n";
461 print "What is the maximum length of an away message?\n";
462 print "[\033[1;32m$config{MAX_AWAY}\033[0m] -> ";
463 chomp($var = <STDIN>);
464 if ($var eq "") { $var = $config{MAX_AWAY}; }
465 if ($var =~ /^\d+$/) {
466 # We don't care what the number is, set it and be on our way.
467 $config{MAX_AWAY} = $var;
471 print "You must enter a number in this field. Please try again.\n\n";
476 print "Enter the Level Of Binary optimisation. This is a number between 0 and 3.
477 The InspIRCd Team will NOT support any bug reports above 0. Also note,
478 the IRCd behaviour will be different depending on this value. Please
479 read the documentation for more information.
481 The higher the number, the more optimised your binary will be. This
482 value will default to 0 if you either don't enter a number, or enter
483 a value outside the range.
485 As always, if you are unsure, just press enter and accept the default.\n\n";
486 print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
487 chomp($var = <STDIN>);
489 $var = $config{OPTIMITEMP};
493 $config{OPTIMITEMP} = 1;
494 $config{OPTIMISATI} = "-O";
495 } elsif ($var eq "2") {
496 $config{OPTIMITEMP} = 2;
497 $config{OPTIMISATI} = "-O2";
498 } elsif ($var eq "3") {
499 $config{OPTIMITEMP} = 3;
500 $config{OPTIMISATI} = "-O3";
502 $config{OPTIMITEMP} = 0;
503 $config{OPTIMISATI} = "-g";
506 print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
507 print "\033[0mBase install path:\033[1;32m\t\t$config{BASE_DIR}\n";
508 print "\033[0mConfig path:\033[1;32m\t\t\t$config{CONFIG_DIR}\n";
509 print "\033[0mModule path:\033[1;32m\t\t\t$config{MODULE_DIR}\n";
510 print "\033[0mLibrary path:\033[1;32m\t\t\t$config{LIBRARY_DIR}\n";
511 print "\033[0mMax connections:\033[1;32m\t\t$config{MAX_CLIENT}\n";
512 print "\033[0mMax User Channels:\033[1;32m\t\t$config{MAX_CHANNE}\n";
513 print "\033[0mMax Oper Channels:\033[1;32m\t\t$config{MAX_OPERCH}\n";
514 print "\033[0mMax nickname length:\033[1;32m\t\t$config{NICK_LENGT}\n";
515 print "\033[0mMax channel length:\033[1;32m\t\t$config{CHAN_LENGT}\n";
516 print "\033[0mMax mode length:\033[1;32m\t\t$config{MAXI_MODES}\n";
517 print "\033[0mMax ident length:\033[1;32m\t\t$config{MAX_IDENT}\n";
518 print "\033[0mMax quit length:\033[1;32m\t\t$config{MAX_QUIT}\n";
519 print "\033[0mMax topic length:\033[1;32m\t\t$config{MAX_TOPIC}\n";
520 print "\033[0mMax kick length:\033[1;32m\t\t$config{MAX_KICK}\n";
521 print "\033[0mMax name length:\033[1;32m\t\t$config{MAX_GECOS}\n";
522 print "\033[0mMax away length:\033[1;32m\t\t$config{MAX_AWAY}\n";
523 print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.$config{GCC34}\n";
524 print "\033[0mOptimatizaton Flag:\033[1;32m\t\t$config{OPTIMISATI}\033[0m\n";
525 print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n";
526 print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n";
527 print "\033[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n\n";
533 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
534 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
535 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
536 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";
538 if ($config{OSNAME} =~ /CYGWIN/) {
540 \033[1;32mWARNING!\033[0m CYGWIN does not properly support shared modules,
541 so modules will be compiled statically into the core of the ircd. The modules
542 will act like they are being loaded from disk and being unloaded from RAM,
543 however they are in fact being enabled and disabled similar to features in
548 if ($config{GCCVER} < "3") {
550 \033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
551 GCC 2.x series compilers only had partial (read as broken) C++ support, and
552 your compile will most likely fail horribly! If you have any problems, do NOT
553 report them to the bugtracker or forums without first upgrading your compiler
554 to a newer 3.x or 4.x (or whatever is available currently) version.
558 ################################################################################
560 ################################################################################
562 # Retrieves the .config.cache file, and loads values into the main config hash.
563 open(CACHE, ".config.cache") or return undef;
567 # Ignore Blank lines, and comments..
571 my ($key, $value) = split("=", $_);
572 $value =~ /^\"(.*)\"$/;
573 # Do something with data here!
581 # Dump the contents of %config
582 print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
583 open(FILEHANDLE, ">.config.cache");
584 foreach $key (keys %config)
586 print FILEHANDLE "$key=\"$config{$key}\"\n";
592 my ($desc, $hash_key) = @_;
595 print "In what directory $desc?\n";
596 print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
597 chomp($var = <STDIN>);
598 if ($var eq "") { $var = $config{$hash_key}; }
599 if ($var =~ /^\~\/(.+)$/) {
600 # Convert it to a full path..
601 $var = resolve_directory($ENV{HOME} . "/" . $1);
603 if (substr($var,0,1) ne "/")
605 # Assume relative Path was given.. fill in the rest.
606 $var = $this . "/$var";
608 $var = resolve_directory($var);
610 print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
611 chomp($tmp = <STDIN>);
612 if (($tmp eq "") || ($tmp =~ /^y/i)) {
613 # Attempt to Create the Dir..
614 $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
616 print "Unable to create directory. ($var)\n\n";
621 # They said they don't want to create, and we can't install there.
627 # Target exists, but is not a directory.
628 print "File $var exists, but is not a directory.\n\n";
632 # Either Dir Exists, or was created fine.
633 $config{$hash_key} = $var;
640 if ($config{OSNAME} =~ /BSD$/) {
641 $config{LDLIBS} = "-Ldl -lstdc++";
642 $config{FLAGS} = "-fPIC -frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
643 $config{MAKEPROG} = "gmake";
644 if ($config{OSNAME} eq "OpenBSD") {
645 chomp($foo = `eg++ -dumpversion | cut -c 1`);
646 # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
647 # if theyre not running this, configure lets the build continue but they probably wont manage to
648 # compile as this standard version is 2.95.3!
650 $config{CC} = "eg++";
651 chomp($config{GCCVER} = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change
652 chomp($config{GCC34} = `eg++ -dumpversion | cut -c 3`); # the compiler path
656 $config{LDLIBS} = "-ldl -lstdc++";
657 $config{FLAGS} = "-fPIC -frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
658 $config{MAKEPROG} = "make";
659 if ($config{OSNAME} =~ /CYGWIN/) {
660 $config{FLAGS} = "-frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
661 $config{LDLIBS} = "";
662 $config{MAKEPROG} = "/usr/bin/make";
663 $config{MAKEORDER} = "mods ircd config bininst";
664 $config{STATICLIBS} = "modules/mods.a";
665 $config{STATIC_LINK} = "yes";
668 if ($config{OSNAME} =~ /SunOS/) {
669 # solaris/sunos needs these
670 # socket = bsd sockets api
672 # rt = POSIX realtime extensions
673 # resolv = inet_aton only (why isnt this in nsl?!)
674 $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
692 opendir(DIRHANDLE, "src/modules");
693 foreach $name (sort readdir(DIRHANDLE)) {
694 if ($name =~ /^m_(.+)\.cpp$/)
697 if ($mod !~ /_static$/) {
698 $modlist[$i++] = $mod;
707 print "Writing \033[1;32minspircd_config.h\033[0m\n";
708 # First File.. inspircd_config.h
709 chomp(my $incos = `uname -n -s -r`);
710 chomp(my $version = `sh ./src/version.sh`);
711 open(FILEHANDLE, ">include/inspircd_config.h");
712 my $NL = $config{NICK_LENGT}+1;
713 my $CL = $config{CHAN_LENGT}+1;
714 print FILEHANDLE <<EOF;
715 /* Auto generated by configure, do not modify! */
716 #ifndef __CONFIGURATION_AUTO__
717 #define __CONFIGURATION_AUTO__
719 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
720 #define MOD_PATH "$config{MODULE_DIR}"
721 #define VERSION "$version"
722 #define MAXCLIENTS $config{MAX_CLIENT}
723 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
726 #define MAXCHANS $config{MAX_CHANNE}
727 #define OPERMAXCHANS $config{MAX_OPERCH}
728 #define MAXMODES $config{MAXI_MODES}
729 #define IDENTMAX $config{MAX_IDENT}
730 #define MAXQUIT $config{MAX_QUIT}
731 #define MAXTOPIC $config{MAX_TOPIC}
732 #define MAXKICK $config{MAX_KICK}
733 #define MAXGECOS $config{MAX_GECOS}
734 #define MAXAWAY $config{MAX_AWAY}
735 #define OPTIMISATION $config{OPTIMITEMP}
736 #define SYSTEM "$incos"
740 if ($config{OSNAME} =~ /SunOS/) {
741 print FILEHANDLE "#define IS_SOLARIS\n";
743 if ($config{OSNAME} =~ /CYGWIN/) {
744 print FILEHANDLE "#define IS_CYGWIN\n";
745 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE 1024\n#endif\n";
747 if ($config{STATIC_LINK} eq "yes") {
748 print FILEHANDLE "#define STATIC_LINK\n";
750 if ($config{GCCVER} > 3) {
751 print FILEHANDLE "#define GCC3\n";
752 print FILEHANDLE "#define GCC34\n";
756 if ($config{GCCVER} == 3) {
757 print FILEHANDLE "#define GCC3\n";
758 if ($config{GCC34} > 3) {
759 print FILEHANDLE "#define GCC34\n";
763 if ($config{HAS_STRLCPY} eq "true") {
764 print FILEHANDLE "#define HAS_STRLCPY\n";
766 if ($config{THREADED_DNS} =~ /y/i) {
767 print FILEHANDLE "#define THREADED_DNS\n";
770 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
771 print FILEHANDLE "#define USE_KQUEUE\n";
774 if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
775 print FILEHANDLE "#define USE_EPOLL\n";
778 # user didn't choose either epoll or select for their OS.
779 # default them to USE_SELECT (ewwy puke puke)
781 print FILEHANDLE "#define USE_SELECT\n";
783 print FILEHANDLE "\n#endif\n";
786 # Create a Modules List..
788 foreach $i (@modlist)
790 if ($config{OSNAME} =~ /CYGWIN/) {
791 $modules .= "m_".$i.".o ";
794 $modules .= "m_".$i.".so ";
797 chomp($modules); # Remove Redundant whitespace..
800 # Write all .in files.
803 my $exe = "inspircd";
805 if ($config{OSNAME} =~ /CYGWIN/) {
806 $exe = "inspircd.exe";
809 opendir(DIRHANDLE, $this);
810 if ($config{THREADED_DNS} =~ /y/i) {
811 $config{LDLIBS} = $config{LDLIBS} . " -pthread";
813 foreach $name (sort readdir(DIRHANDLE)) {
814 if ($name =~ /^\.(.+)\.inc$/)
817 # All .name.inc files need parsing!
819 open(FILEHANDLE, ".$file.inc");
820 while (<FILEHANDLE>) {
825 $tmp =~ s/\@CC\@/$config{CC}/;
826 $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
827 $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
828 $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
829 $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
830 $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
831 $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
832 $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
833 $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
834 $tmp =~ s/\@MODULES\@/$modules/;
835 $tmp =~ s/\@EXECUTABLE\@/$exe/;
836 $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
837 $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
839 print "Writing \033[1;32m$file\033[0m\n";
840 open(FILEHANDLE, ">$file");
841 print FILEHANDLE $tmp;
846 # Make inspircd executable!
847 chmod 0744, 'inspircd';
849 if ($config{OSNAME} =~ /CYGWIN/) {
850 print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
851 write_static_makefile();
854 print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
855 write_dynamic_makefile();
860 print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
861 open(FILEHANDLE, ">src/modules/Makefile");
862 print FILEHANDLE <<EOF;
863 # (C) ChatSpike development team
864 # Makefile by <Craig\@ChatSpike.net>
865 # Many Thanks to Andrew Church <achurch\@achurch.org>
866 # for assisting with making this work right.
868 # Automatically Generated by ./configure to add a modules
869 # please run ./configure --update
875 # Create a Modules List..
879 if ($config{OSNAME} =~ /CYGWIN/) {
880 open(MODLIST,">include/modlist.h");
881 print MODLIST <<HEADER;
882 // Generated automatically by configure. DO NOT EDIT!
884 #ifndef __SYMBOLS__H_CONFIGURED__
885 #define __SYMBOLS__H_CONFIGURED__
888 foreach $i (@modlist) {
889 if ($i !~ /_static$/) {
890 print MODLIST "extern \"C\" void * $i\_init (void);\n";
893 print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
895 foreach $i (@modlist)
897 if ($i !~ /_static$/) {
898 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
899 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
900 if ($config{OSNAME} =~ /CYGWIN/) {
901 print FILEHANDLE <<EOCHEESE;
902 m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
903 \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
904 mv m_$i\_static.o ../m_$i.o
907 print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
908 open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
909 open(MUNGED,">src/modules/m_".$i."_static.cpp") or die("Could not create m_".$i."_static.cpp");
910 while (chomp($a = <MODULE>)) {
911 $a =~ s/init_module/$i\_init/g;
912 $a =~ s/Srv/$i\Srv/g;
917 print MODLIST <<EOENT;
918 {"m_$i.so",\&$i\_init},
923 print FILEHANDLE <<EOCHEESE;
924 m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/inspircd_io.h
925 \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
926 \$(CC) \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o
927 \@-rm -f \$(MODPATH)/m_$i.so
928 install -C -v -m 0700 m_$i.so \$(MODPATH)
934 if ($config{OSNAME} =~ /CYGWIN/) {
935 print MODLIST "{0}};\n\n#endif\n";
940 sub getcompilerflags {
944 if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
957 if ($_ =~ /^\/\* \$LinkerFlags: (.+) \*\/$/) {
967 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";
968 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";
969 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";
970 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";
971 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";
972 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";
973 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";
974 print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n";
977 sub resolve_directory {
979 return File::Spec->rel2abs($_[0]);
983 my ($flag,$prompt) = @_;
984 print "$prompt [\033[1;32m$config{$flag}\033[0m] -> ";
985 chomp($tmp = <STDIN>);
986 if ($tmp eq "") { $tmp = $config{$flag} }
988 if (($tmp eq "") || ($tmp =~ /^y/i)) {
989 $config{$flag} = "y";
991 $config{$flag} = "n";
997 sub write_static_makefile {
998 open(FH,">src/Makefile") or die("Could not write src/Makefile!");
1001 opendir(DIRHANDLE, "src");
1002 foreach $name (sort readdir(DIRHANDLE)) {
1003 if ($name =~ /^cmd_(.+)\.cpp$/) {
1004 $cmdlist[$i++] = $1;
1007 closedir(DIRHANDLE);
1010 foreach my $cmd (@cmdlist) {
1011 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1012 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1017 # (C) ChatSpike development team
1018 # Makefile by <Craig\@ChatSpike.net>
1019 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
1022 CC = im a cheezeball
1024 CXXFLAGS = -I../include \${FLAGS}
1026 all: aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o \$(MODULES) inspircd.exe
1028 inspircd.exe: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/base.h
1029 \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o \$(MODULES)
1031 cull_list.o: cull_list.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/users.h ../include/channels.h
1032 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1034 command_parse.o: command_parse.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1035 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1037 userprocess.o: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1038 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1040 socketengine.o: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1041 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1043 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1044 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1046 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1047 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1049 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1050 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1052 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
1053 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1055 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
1056 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1058 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
1059 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1061 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
1062 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1064 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1065 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1067 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
1068 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1070 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
1071 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1073 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 $srcobjs
1074 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
1076 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
1077 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1079 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
1080 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1082 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
1083 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1085 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
1086 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1088 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
1089 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1091 socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1092 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1094 aes.o: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1095 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
1098 foreach my $cmd (@cmdlist) {
1100 cmd_$cmd.o: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/cmd_$cmd.h
1101 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1107 sub write_dynamic_makefile {
1111 opendir(DIRHANDLE, "src");
1112 foreach $name (sort readdir(DIRHANDLE)) {
1113 if ($name =~ /^cmd_(.+)\.cpp$/) {
1114 $cmdlist[$i++] = $1;
1117 closedir(DIRHANDLE);
1121 foreach my $cmd (@cmdlist) {
1122 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1123 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1126 open(FH,">src/Makefile") or die("Could not write src/Makefile");
1130 # (C) ChatSpike development team
1131 # Makefile by <Craig\@ChatSpike.net>
1132 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
1135 CC = im a cheezeball
1137 CXXFLAGS = -I../include \${FLAGS}
1139 all: 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 libIRCDio.so libIRCDmessage.so $cmdobjs libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so inspircd
1141 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
1142 \$(CC) -I../include -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 libIRCDio.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
1144 libIRCDsocketengine.so: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1145 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1146 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o
1148 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
1149 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1150 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
1152 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
1153 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1154 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
1156 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1157 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1158 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
1160 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1161 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1162 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
1164 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1165 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1166 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
1168 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1169 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1170 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
1172 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
1173 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1174 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o
1176 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
1177 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1178 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
1180 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
1181 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1182 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
1184 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
1185 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1186 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
1188 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1189 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1190 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
1192 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
1193 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1194 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDio.so inspircd_io.o
1196 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
1197 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1198 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmessage.so message.o
1200 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
1201 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1202 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o $cmdobjs
1204 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
1205 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1206 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdnsqueue.so dnsqueue.o
1208 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
1209 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1210 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
1212 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
1213 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1214 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
1216 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
1217 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1218 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
1220 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
1221 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1222 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
1224 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1225 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1226 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
1228 libIRCDaes.so: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1229 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
1230 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDaes.so aes.o
1233 foreach my $cmd (@cmdlist) {
1235 cmd_$cmd.o: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/cmd_$cmd.h
1236 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp