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 chomp($config{HAS_GNUTLS} = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
25 chomp($config{HAS_OPENSSL} = `openssl version 2>/dev/null`); # Openssl version
26 $config{USE_GNUTLS} = "n"; # Use gnutls.
27 $config{USE_OPENSSL} = "n"; # Use openssl.
28 $config{OPTIMITEMP} = "0"; # Default Optimisation Value
29 $config{OPTIMISATI} = "-g"; # Optimisation Flag
30 $config{NICK_LENGT} = "31"; # Default Nick Length
31 $config{CHAN_LENGT} = "64"; # Default Channel Name Length
32 $config{MAX_CHANNE} = "20"; # Default Max. Channels per user
33 $config{MAX_OPERCH} = "60"; # Default Max. Channels per oper
34 $config{MAXI_MODES} = "20"; # Default Max. Number of Modes set at once.
35 $config{HAS_STRLCPY} = "false"; # strlcpy Check.
36 $config{USE_KQUEUE} = "y"; # kqueue enabled
37 $config{USE_EPOLL} = "y"; # epoll enabled
38 $config{THREADED_DNS} = "n"; # threaded dns (experimental)
39 $config{STATIC_LINK} = "no"; # are doing static modules?
40 chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`); # FD Limit
41 chomp($config{MAX_DESCRIPTORS} = `sh -c \"ulimit -n\"`); # Hard FD Limit
42 chomp($config{GCCVER} = `gcc -dumpversion | cut -c 1`); # Major GCC Version
43 chomp($config{GCC34} = `gcc -dumpversion | cut -c 3`); # Minor GCC Version
44 chomp($config{OSNAME} = `/bin/uname`); # Operating System Name
45 $config{CC} = "g++"; # C++ compiler
46 $config{MAKEORDER} = "ircd mods config bininst"; # build order
47 $config{STATICLIBS} = ""; # library archive path
48 $config{MAX_IDENT} = "12"; # max ident size
49 $config{MAX_QUIT} = "255"; # max quit message size
50 $config{MAX_TOPIC} = "307"; # max topic size
51 $config{MAX_KICK} = "255"; # max kick message size
52 $config{MAX_GECOS} = "128"; # max GECOS size
53 $config{MAX_AWAY} = "200"; # max AWAY size
55 $config{HAS_OPENSSL} =~ /OpenSSL (\S+) \d+ \S+ \d{4}/;
56 $config{HAS_OPENSSL} = $1;
58 # Minihack! Convert Cygwin to 'Cyg-Static' so i can
59 # Keep my dynamic module experiments here for later
62 if ($config{OSNAME} =~ /CYGWIN/) {
63 $config{OSNAME} = "CYG-STATIC";
66 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
67 chomp($config{OSNAME} = `/usr/bin/uname`);
68 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){
69 $config{OSNAME} = "Unknown";
73 if (!$config{MAX_CLIENT_T}) {
74 $config{MAX_CLIENT_T} = 1024; # Set a reasonable 'Default'
75 $fd_scan_fail = "true"; # Used Later
78 # Get and Set some important vars..
81 my $arg = $ARGV[0]; # Do Some Argument Checks..
82 if ($arg eq "-clean") {
83 system("rm -rf .config.cache");
84 } # Remove the config.cache file.
86 if ($arg eq "-update") {
87 # Does the cache file exist?
89 # No, No it doesn't.. *BASH*
90 print "You have not run ./configure before. Please do this before trying to run the update script.\n";
93 # We've Loaded the cache file and all our variables..
94 print "Updating Files..\n";
96 $has_epoll = $config{HAS_EPOLL};
97 $has_kqueue = $config{HAS_KQUEUE};
104 if ($arg eq "-modupdate") {
105 # Does the cache file exist?
107 # No, No it doesn't.. *BASH*
108 print "You have not run ./configure before. Please do this before trying to run the update script.\n";
111 # We've Loaded the cache file and all our variables..
112 print "Updating Files..\n";
114 $has_epoll = $config{HAS_EPOLL};
115 $has_kqueue = $config{HAS_KQUEUE};
116 if ($config{STATIC_LINK} eq "yes") {
117 write_static_modules_makefile();
119 write_dynamic_modules_makefile();
126 print "Checking for cache from previous configure...\n";
128 print "Checking operating system version...\n";
131 if (!$config{MAX_CLIENT}) {
132 # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
133 # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
134 # higher than the found value" :))
135 $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
138 printf "Checking if strlcpy exists... ";
139 # Perform the strlcpy() test..
140 $config{HAS_STRLCPY} = "false";
142 open(STRLCPY, "</usr/include/string.h") or $fail = 1;
144 while (chomp($line = <STRLCPY>)) {
145 # try and find the delcaration of:
146 # size_t strlcpy(...)
147 if ($line =~ /size_t(\0x9|\s)+strlcpy/) {
148 $config{HAS_STRLCPY} = "true";
153 print "yes\n" if $config{HAS_STRLCPY} eq "true";
154 print "no\n" if $config{HAS_STRLCPY} eq "false";
156 printf "Checking if kqueue exists... ";
159 open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
161 while (chomp($line = <KQUEUE>)) {
162 # try and find the delcaration of:
164 if ($line =~ /int(\0x9|\s)+kqueue/) {
170 print "yes\n" if $has_kqueue == 1;
171 print "no\n" if $has_kqueue == 0;
173 printf "Checking if epoll exists... ";
176 open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
178 while (chomp($line = <EPOLL>)) {
179 # try and find the declaration of:
180 # extern int epoll_create (int __size) __THROW;
181 if (($line =~ /int(\0x9|\s)+epoll_create(\0x9|\s)+\(/) || ($line =~ /int(\0x9|\s)+epoll_create\(/)) {
188 my $kernel = `uname -r`;
190 if (($kernel =~ /2\.0/) || ($kernel =~ /2\.2/) || ($kernel =~ /2\.4/)) {
194 print "yes\n" if $has_epoll == 1;
195 print "no\n" if $has_epoll == 0;
197 if (($config{OSNAME} =~ /CYGWIN/) || ($config{OSNAME} eq "CYG-STATIC")) {
198 $config{HAS_STRLCPY} = "true";
201 $config{HAS_EPOLL} = $has_epoll;
202 $config{HAS_KQUEUE} = $has_kqueue;
204 printf "Checking for libgnutls... ";
205 if (($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS} >= 1.2) || ($config{HAS_GNUTLS} eq "y"))) {
207 $config{HAS_GNUTLS} = "y";
210 $config{HAS_GNUTLS} = "n";
213 printf "Checking for openssl... ";
214 if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPENSSL} eq "y"))) {
216 $config{HAS_OPENSSL} = "y";
219 $config{HAS_OPENSSL} = "n";
222 ################################################################################
223 # BEGIN INTERACTIVE PART #
224 ################################################################################
228 # Display Splash Logo..
230 chomp($wholeos = `uname -mnr`);
232 # Display Introduction Message..
234 Welcome to the InspIRCd Configuration program!
236 *** If you are unsure of any of these values, leave it blank for ***
237 *** standard settings that will work, and your server will run ***
238 *** using them. If you are running this server as part of a ***
239 *** larger network, you must consult with your network admins ***
240 *** for the proper values to use, or server links will be unstable! ***
242 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
243 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
244 dir, otherwise you won't have a config file!
246 Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $config{MAX_CLIENT_T}\n\n";
248 $config{CHANGE_COMPILER} = "n";
249 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";
251 while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
252 print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
253 should NOT be used. You should probably specify a newer compiler.\n\n";
254 yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
255 if ($config{CHANGE_COMPILER} =~ /y/i) {
256 print "What command do you want to use to invoke your compiler?\n";
257 print "[\033[1;32m$config{CC}\033[0m] -> ";
258 chomp($config{CC} = <STDIN>);
259 if ($config{CC} eq "") {
262 chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
264 chomp($config{GCCVER} = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change
265 chomp($config{GCC34} = `$config{CC} -dumpversion | cut -c 3`); # the compiler path
266 print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.$config{GCC34}\033[0m)\n";
267 if ($config{GCCVER} < 3) {
268 print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n";
272 print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
279 # Directory Settings..
280 my $tmpbase = $config{BASE_DIR};
281 dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
282 if ($tmpbase ne $config{BASE_DIR}) {
283 $config{CONFIG_DIR} = resolve_directory($config{BASE_DIR}."/conf"); # Configuration Directory
284 $config{MODULE_DIR} = resolve_directory($config{BASE_DIR}."/modules"); # Modules Directory
285 $config{BINARY_DIR} = resolve_directory($config{BASE_DIR}."/bin"); # Binary Directory
286 $config{LIBRARY_DIR} = resolve_directory($config{BASE_DIR}."/lib"); # Library Directory
289 dir_check("are the configuration files", "CONFIG_DIR");
290 dir_check("are the modules to be compiled to", "MODULE_DIR");
291 dir_check("is the IRCd binary to be placed", "BINARY_DIR");
292 dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
295 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?");
299 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?");
302 $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
303 if (!$chose_hiperf) {
304 print "No high-performance socket engines are available, or you chose\n";
305 print "not to enable one. Defaulting to select() engine.\n\n";
308 yesno(THREADED_DNS,"Would you like to enable the experimental multi-threaded DNS lookup?");
311 if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
312 print "I have detected both GnuTLS and OpenSSL on your system.\n";
313 print "I will default to GnuTLS. If you wish to use OpenSSL\n";
314 print "instead, you should enable the OpenSSL module yourself\n";
315 print "by copying it from src/modules/extra to src/modules.\n\n";
318 if ($config{HAS_GNUTLS} eq "y") {
319 yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
320 if ($config{USE_GNUTLS} eq "y") {
321 print "\nUsing GnuTLS SSL module.\n";
323 } elsif ($config{HAS_OPENSSL} eq "y") {
324 yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
325 if ($config{USE_OPENSSL} eq "y") {
326 print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
330 print "\nThe following questions will ask you for various figures relating\n";
331 print "To your IRCd install. Please note that these should usually be left\n";
332 print "as defaults unless you have a real reason to change them. If they\n";
333 print "changed, then the values must be identical on all servers on your\n";
334 print "network, or malfunctions and/or crashes may occur, with the exception\n";
335 print "of the 'maximum number of clients' setting which may be different on\n";
336 print "different servers on the network.\n\n";
338 # File Descriptor Settings..
341 print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
342 print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
343 chomp($var = <STDIN>);
345 $var = $config{MAX_CLIENT};
347 if ($var =~ /^\d+$/) {
348 if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
349 # Client has entered a larger number than the 'discovered' value
351 print "WARNING: Our scans have indicated that you are attempting
352 to use more sockets than there are avaliable. Are you sure
353 you wish to do this? It may cause the IRCd to malfunction [y/n]
354 [\033[1;32mn\033[0m] -> $c";
355 chomp($tmp = <STDIN>);
357 print "Please enter the correct value.\n\n";
362 print "You must enter a number in this field. Please try again.\n\n";
365 # If we get here, we should be good to go.
366 $config{MAX_CLIENT} = $var;
373 print "What is the maximum length of nicknames?\n";
374 print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> ";
375 chomp($var = <STDIN>);
377 $var = $config{NICK_LENGT};
379 if ($var =~ /^\d+$/) {
380 # We don't care what the number is, set it and be on our way.
381 $config{NICK_LENGT} = $var;
385 print "You must enter a number in this field. Please try again.\n\n";
391 print "What is the maximum length of channel names?\n";
392 print "[\033[1;32m$config{CHAN_LENGT}\033[0m] -> ";
393 chomp($var = <STDIN>);
395 $var = $config{CHAN_LENGT};
397 if ($var =~ /^\d+$/) {
398 # We don't care what the number is, set it and be on our way.
399 $config{CHAN_LENGT} = $var;
403 print "You must enter a number in this field. Please try again.\n\n";
409 print "What is the maximum number of channels a normal user may join at any one time?\n";
410 print "[\033[1;32m$config{MAX_CHANNE}\033[0m] -> ";
411 chomp($var = <STDIN>);
413 $var = $config{MAX_CHANNE};
415 if ($var =~ /^\d+$/) {
416 # We don't care what the number is, set it and be on our way.
417 $config{MAX_CHANNE} = $var;
421 print "You must enter a number in this field. Please try again.\n\n";
427 print "What is the maximum number of channels an oper may join at any one time?\n";
428 print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> ";
429 chomp($var = <STDIN>);
431 $var = $config{MAX_OPERCH};
433 if ($var =~ /^\d+$/) {
434 # We don't care what the number is, set it and be on our way.
435 $config{MAX_OPERCH} = $var;
443 print "What is the maximum number of mode changes in one line?\n";
444 print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> ";
445 chomp($var = <STDIN>);
447 $var = $config{MAXI_MODES};
449 if ($var =~ /^\d+$/) {
450 # We don't care what the number is, set it and be on our way.
451 $config{MAXI_MODES} = $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 ident (username)?\n";
462 print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> ";
463 chomp($var = <STDIN>);
465 $var = $config{MAX_IDENT};
467 if ($var =~ /^\d+$/) {
468 # We don't care what the number is, set it and be on our way.
469 $config{MAX_IDENT} = $var;
473 print "You must enter a number in this field. Please try again.\n\n";
479 print "What is the maximum length of a quit message?\n";
480 print "[\033[1;32m$config{MAX_QUIT}\033[0m] -> ";
481 chomp($var = <STDIN>);
483 $var = $config{MAX_QUIT};
485 if ($var =~ /^\d+$/) {
486 # We don't care what the number is, set it and be on our way.
487 $config{MAX_QUIT} = $var;
491 print "You must enter a number in this field. Please try again.\n\n";
497 print "What is the maximum length of a channel topic?\n";
498 print "[\033[1;32m$config{MAX_TOPIC}\033[0m] -> ";
499 chomp($var = <STDIN>);
501 $var = $config{MAX_TOPIC};
503 if ($var =~ /^\d+$/) {
504 # We don't care what the number is, set it and be on our way.
505 $config{MAX_TOPIC} = $var;
509 print "You must enter a number in this field. Please try again.\n\n";
515 print "What is the maximum length of a kick message?\n";
516 print "[\033[1;32m$config{MAX_KICK}\033[0m] -> ";
517 chomp($var = <STDIN>);
519 $var = $config{MAX_KICK};
521 if ($var =~ /^\d+$/) {
522 # We don't care what the number is, set it and be on our way.
523 $config{MAX_KICK} = $var;
527 print "You must enter a number in this field. Please try again.\n\n";
533 print "What is the maximum length of a GECOS (real name) field?\n";
534 print "[\033[1;32m$config{MAX_GECOS}\033[0m] -> ";
535 chomp($var = <STDIN>);
537 $var = $config{MAX_GECOS};
539 if ($var =~ /^\d+$/) {
540 # We don't care what the number is, set it and be on our way.
541 $config{MAX_GECOS} = $var;
545 print "You must enter a number in this field. Please try again.\n\n";
551 print "What is the maximum length of an away message?\n";
552 print "[\033[1;32m$config{MAX_AWAY}\033[0m] -> ";
553 chomp($var = <STDIN>);
555 $var = $config{MAX_AWAY};
557 if ($var =~ /^\d+$/) {
558 # We don't care what the number is, set it and be on our way.
559 $config{MAX_AWAY} = $var;
563 print "You must enter a number in this field. Please try again.\n\n";
568 print "Enter the Level Of Binary optimisation. This is a number between 0 and 3.
569 The InspIRCd Team will NOT support any bug reports above 0. Also note,
570 the IRCd behaviour will be different depending on this value. Please
571 read the documentation for more information.
573 The higher the number, the more optimised your binary will be. This
574 value will default to 0 if you either don't enter a number, or enter
575 a value outside the range.
577 As always, if you are unsure, just press enter and accept the default.\n\n";
578 print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
579 chomp($var = <STDIN>);
581 $var = $config{OPTIMITEMP};
585 $config{OPTIMITEMP} = 1;
586 $config{OPTIMISATI} = "-O";
587 } elsif ($var eq "2") {
588 $config{OPTIMITEMP} = 2;
589 $config{OPTIMISATI} = "-O2";
590 } elsif ($var eq "3") {
591 $config{OPTIMITEMP} = 3;
592 $config{OPTIMISATI} = "-O3";
594 $config{OPTIMITEMP} = 0;
595 $config{OPTIMISATI} = "-g";
598 print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
599 print "\033[0mBase install path:\033[1;32m\t\t$config{BASE_DIR}\n";
600 print "\033[0mConfig path:\033[1;32m\t\t\t$config{CONFIG_DIR}\n";
601 print "\033[0mModule path:\033[1;32m\t\t\t$config{MODULE_DIR}\n";
602 print "\033[0mLibrary path:\033[1;32m\t\t\t$config{LIBRARY_DIR}\n";
603 print "\033[0mMax connections:\033[1;32m\t\t$config{MAX_CLIENT}\n";
604 print "\033[0mMax User Channels:\033[1;32m\t\t$config{MAX_CHANNE}\n";
605 print "\033[0mMax Oper Channels:\033[1;32m\t\t$config{MAX_OPERCH}\n";
606 print "\033[0mMax nickname length:\033[1;32m\t\t$config{NICK_LENGT}\n";
607 print "\033[0mMax channel length:\033[1;32m\t\t$config{CHAN_LENGT}\n";
608 print "\033[0mMax mode length:\033[1;32m\t\t$config{MAXI_MODES}\n";
609 print "\033[0mMax ident length:\033[1;32m\t\t$config{MAX_IDENT}\n";
610 print "\033[0mMax quit length:\033[1;32m\t\t$config{MAX_QUIT}\n";
611 print "\033[0mMax topic length:\033[1;32m\t\t$config{MAX_TOPIC}\n";
612 print "\033[0mMax kick length:\033[1;32m\t\t$config{MAX_KICK}\n";
613 print "\033[0mMax name length:\033[1;32m\t\t$config{MAX_GECOS}\n";
614 print "\033[0mMax away length:\033[1;32m\t\t$config{MAX_AWAY}\n";
615 print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.$config{GCC34}\n";
616 print "\033[0mOptimization Flag:\033[1;32m\t\t$config{OPTIMISATI}\033[0m\n";
617 print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n";
618 print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n";
619 print "\033[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n";
620 print "\033[0mGnuTLS Support:\033[1;32m\t\t\t$config{USE_GNUTLS}\033[0m\n";
621 print "\033[0mOpenSSL Support:\033[1;32m\t\t$config{USE_OPENSSL}\033[0m\n\n";
623 if ($config{USE_GNUTLS} eq "y") {
625 open(TMP, "<src/modules/m_ssl_gnutls.cpp") or $failed = 1;
628 print "Symlinking src/modules/m_ssl_gnutls.cpp from extra/\n";
629 chdir("src/modules");
630 system("ln -s extra/m_ssl_gnutls.cpp");
635 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
637 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
640 print "SSL Certificates Not found, Generating.. \n\n
641 *************************************************************
642 * Generating the Private Key may take some time, go grab a *
643 * Coffee. Even better, to generate some more entropy if it *
644 * is taking a while, open another console and type du / a *
645 * few times and get that HD going :) Then answer the *
646 * Questions which follow. If you are unsure, just hit enter *
647 *************************************************************\n\n";
648 system("certtool --generate-privkey --outfile key.pem");
649 system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
650 print "\nCertificate generation complete, copying to config directory... ";
651 system("mv key.pem $config{CONFIG_DIR}/key.pem");
652 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
655 print "SSL Certificates found, skipping.\n\n"
657 } elsif ($config{USE_OPENSSL} eq "y") {
659 open(TMP, "<src/modules/m_ssl_openssl.cpp") or $failed = 1;
662 print "Symlinking src/modules/m_ssl_openssl.cpp from extra/\n";
663 chdir("src/modules");
664 system("ln -s extra/m_ssl_openssl.cpp");
669 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
671 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
674 print "SSL Certificates Not found, Generating.. \n\n
675 *************************************************************
676 * Generating the certificates may take some time, go grab a *
677 * coffee, or something. *
678 *************************************************************\n\n";
679 system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
680 system("openssl dhparam -out dhparams.pem 1024");
681 print "\nCertificate generation complete, copying to config directory... ";
682 system("mv key.pem $config{CONFIG_DIR}/key.pem");
683 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
684 system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
687 print "SSL Certificates found, skipping.\n\n"
690 if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
691 print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
699 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
700 if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
701 print "Please remember that to enable \033[1;32mSSL support\033[0m you must\n";
702 print "load the required modules in your config. This configure process\n";
703 print "has just prepared these modules to be compiled for you, and has not\n";
704 print "configured them to be compiled into the core of the ircd.\n";
706 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
707 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
708 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";
711 if ($config{GCCVER} < "3") {
713 \033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
714 GCC 2.x series compilers only had partial (read as broken) C++ support, and
715 your compile will most likely fail horribly! If you have any problems, do NOT
716 report them to the bugtracker or forums without first upgrading your compiler
717 to a newer 3.x or 4.x (or whatever is available currently) version.
721 ################################################################################
723 ################################################################################
725 # Retrieves the .config.cache file, and loads values into the main config hash.
726 open(CACHE, ".config.cache") or return undef;
729 # Ignore Blank lines, and comments..
732 my ($key, $value) = split("=", $_);
733 $value =~ /^\"(.*)\"$/;
734 # Do something with data here!
742 # Dump the contents of %config
743 print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
744 open(FILEHANDLE, ">.config.cache");
745 foreach $key (keys %config) {
746 print FILEHANDLE "$key=\"$config{$key}\"\n";
752 my ($desc, $hash_key) = @_;
755 print "In what directory $desc?\n";
756 print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
757 chomp($var = <STDIN>);
759 $var = $config{$hash_key};
761 if ($var =~ /^\~\/(.+)$/) {
762 # Convert it to a full path..
763 $var = resolve_directory($ENV{HOME} . "/" . $1);
765 if (substr($var,0,1) ne "/")
767 # Assume relative Path was given.. fill in the rest.
768 $var = $this . "/$var";
770 $var = resolve_directory($var);
772 print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
773 chomp($tmp = <STDIN>);
774 if (($tmp eq "") || ($tmp =~ /^y/i)) {
775 # Attempt to Create the Dir..
776 $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
778 print "Unable to create directory. ($var)\n\n";
783 # They said they don't want to create, and we can't install there.
789 # Target exists, but is not a directory.
790 print "File $var exists, but is not a directory.\n\n";
794 # Either Dir Exists, or was created fine.
795 $config{$hash_key} = $var;
802 if ($config{OSNAME} =~ /BSD$/) {
803 $config{LDLIBS} = "-Ldl -lstdc++";
804 $config{FLAGS} = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
805 $config{MAKEPROG} = "gmake";
806 if ($config{OSNAME} eq "OpenBSD") {
807 chomp($foo = `eg++ -dumpversion | cut -c 1`);
808 # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
809 # if theyre not running this, configure lets the build continue but they probably wont manage to
810 # compile as this standard version is 2.95.3!
812 $config{CC} = "eg++";
813 chomp($config{GCCVER} = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change
814 chomp($config{GCC34} = `eg++ -dumpversion | cut -c 3`); # the compiler path
818 $config{LDLIBS} = "-ldl -lstdc++";
819 $config{FLAGS} = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
820 $config{MAKEPROG} = "make";
821 if ($config{OSNAME} =~ /CYGWIN/) {
822 $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
823 $config{LDLIBS} = "";
824 $config{MAKEPROG} = "/usr/bin/make";
825 $config{MAKEORDER} = "ircd mods config bininst";
826 } elsif ($config{OSNAME} eq "CYG-STATIC") {
827 $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
828 $config{LDLIBS} = "";
829 $config{MAKEPROG} = "/usr/bin/make";
830 $config{MAKEORDER} = "mods ircd config bininst";
831 $config{STATICLIBS} = "modules/mods.a";
832 $config{STATIC_LINK} = "yes";
835 if ($config{OSNAME} =~ /SunOS/) {
836 # solaris/sunos needs these
837 # socket = bsd sockets api
839 # rt = POSIX realtime extensions
840 # resolv = inet_aton only (why isnt this in nsl?!)
841 $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
859 opendir(DIRHANDLE, "src/modules");
860 foreach $name (sort readdir(DIRHANDLE)) {
861 if ($name =~ /^m_(.+)\.cpp$/)
864 if ($mod !~ /_static$/) {
865 $modlist[$i++] = $mod;
873 print "Writing \033[1;32minspircd_config.h\033[0m\n";
874 # First File.. inspircd_config.h
875 chomp(my $incos = `uname -n -s -r`);
876 chomp(my $version = `sh ./src/version.sh`);
877 chomp(my $revision = " (r" + `./src/svn-rev.sh`);
878 $revision = $revision + ")";
879 my $version = $version + $revision;
880 chomp(my $revision2 = `./src/svn-rev.sh`);
881 open(FILEHANDLE, ">include/inspircd_config.h");
882 my $NL = $config{NICK_LENGT}+1;
883 my $CL = $config{CHAN_LENGT}+1;
884 print FILEHANDLE <<EOF;
885 /* Auto generated by configure, do not modify! */
886 #ifndef __CONFIGURATION_AUTO__
887 #define __CONFIGURATION_AUTO__
889 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
890 #define MOD_PATH "$config{MODULE_DIR}"
891 #define VERSION "$version"
892 #define REVISION "$revision2"
893 #define MAXCLIENTS $config{MAX_CLIENT}
894 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
897 #define MAXCHANS $config{MAX_CHANNE}
898 #define OPERMAXCHANS $config{MAX_OPERCH}
899 #define MAXMODES $config{MAXI_MODES}
900 #define IDENTMAX $config{MAX_IDENT}
901 #define MAXQUIT $config{MAX_QUIT}
902 #define MAXTOPIC $config{MAX_TOPIC}
903 #define MAXKICK $config{MAX_KICK}
904 #define MAXGECOS $config{MAX_GECOS}
905 #define MAXAWAY $config{MAX_AWAY}
906 #define OPTIMISATION $config{OPTIMITEMP}
907 #define SYSTEM "$incos"
910 if ($config{OSNAME} =~ /SunOS/) {
911 print FILEHANDLE "#define IS_SOLARIS\n";
913 if ($config{OSNAME} =~ /CYGWIN/) {
914 print FILEHANDLE "#define IS_CYGWIN\n";
915 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE 1024\n#endif\n";
917 if ($config{OSNAME} eq "CYG-STATIC") {
918 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE 1024\n#endif\n";
921 if ($config{STATIC_LINK} eq "yes") {
922 print FILEHANDLE "#define STATIC_LINK\n";
924 if ($config{GCCVER} > 3) {
925 print FILEHANDLE "#define GCC3\n";
926 print FILEHANDLE "#define GCC34\n";
930 if ($config{GCCVER} == 3) {
931 print FILEHANDLE "#define GCC3\n";
932 if ($config{GCC34} > 3) {
933 print FILEHANDLE "#define GCC34\n";
937 if ($config{HAS_STRLCPY} eq "true") {
938 print FILEHANDLE "#define HAS_STRLCPY\n";
940 if ($config{THREADED_DNS} =~ /y/i) {
941 print FILEHANDLE "#define THREADED_DNS\n";
944 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
945 print FILEHANDLE "#define USE_KQUEUE\n";
948 if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
949 print FILEHANDLE "#define USE_EPOLL\n";
952 # user didn't choose either epoll or select for their OS.
953 # default them to USE_SELECT (ewwy puke puke)
955 print FILEHANDLE "#define USE_SELECT\n";
957 print FILEHANDLE "\n#endif\n";
960 # Create a Modules List..
962 foreach $i (@modlist)
964 if ($config{STATIC_LINK} eq "yes") {
965 $modules .= "m_".$i.".o ";
968 $modules .= "m_".$i.".so ";
971 chomp($modules); # Remove Redundant whitespace..
974 # Write all .in files.
977 my $exe = "inspircd";
979 if ($config{OSNAME} =~ /CYGWIN/) {
980 $exe = "inspircd.exe";
983 opendir(DIRHANDLE, $this);
984 if ($config{THREADED_DNS} =~ /y/i) {
985 $config{LDLIBS} = $config{LDLIBS} . " -pthread";
987 foreach $name (sort readdir(DIRHANDLE)) {
988 if ($name =~ /^\.(.+)\.inc$/) {
990 # All .name.inc files need parsing!
992 open(FILEHANDLE, ".$file.inc");
993 while (<FILEHANDLE>) {
998 $tmp =~ s/\@CC\@/$config{CC}/;
999 $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
1000 $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
1001 $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
1002 $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
1003 $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
1004 $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
1005 $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
1006 $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
1007 $tmp =~ s/\@MODULES\@/$modules/;
1008 $tmp =~ s/\@EXECUTABLE\@/$exe/;
1009 $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
1010 $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
1012 print "Writing \033[1;32m$file\033[0m\n";
1013 open(FILEHANDLE, ">$file");
1014 print FILEHANDLE $tmp;
1017 closedir(DIRHANDLE);
1019 # Make inspircd executable!
1020 chmod 0744, 'inspircd';
1022 if ($config{STATIC_LINK} eq "yes") {
1023 print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
1024 write_static_makefile();
1025 write_static_modules_makefile();
1026 } elsif ($config{OSNAME} =~ /CYGWIN/) {
1027 print "Writing cygwin-build \033[1;32msrc/Makefile\033[0m\n";
1028 write_static_makefile();
1029 write_dynamic_modules_makefile();
1031 print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
1032 write_dynamic_makefile();
1033 write_dynamic_modules_makefile();
1037 sub getcompilerflags {
1041 if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
1050 sub getlinkerflags {
1054 if ($_ =~ /^\/\* \$LinkerFlags: (.+) \*\/$/) {
1064 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";
1065 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";
1066 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";
1067 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";
1068 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";
1069 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";
1070 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";
1071 print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n";
1074 sub resolve_directory {
1076 return File::Spec->rel2abs($_[0]);
1080 my ($flag,$prompt) = @_;
1081 print "$prompt [\033[1;32m$config{$flag}\033[0m] -> ";
1082 chomp($tmp = <STDIN>);
1083 if ($tmp eq "") { $tmp = $config{$flag} }
1085 if (($tmp eq "") || ($tmp =~ /^y/i)) {
1086 $config{$flag} = "y";
1088 $config{$flag} = "n";
1093 sub write_static_modules_makefile {
1094 # Modules Makefile..
1095 print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1096 open(FILEHANDLE, ">src/modules/Makefile");
1099 # Module Makefile Header
1101 print FILEHANDLE <<EOF;
1102 # (C) ChatSpike development team
1103 # Makefile by <Craig\@ChatSpike.net>
1104 # Many Thanks to Andrew Church <achurch\@achurch.org>
1105 # for assisting with making this work right.
1107 # Automatically Generated by ./configure to add a modules
1108 # please run ./configure --update
1114 # End Module Makefile Header
1117 # Create a Modules List..
1122 open(MODLIST,">include/modlist.h");
1125 # Include File Header
1127 print MODLIST <<HEADER;
1128 // Generated automatically by configure. DO NOT EDIT!
1130 #ifndef __SYMBOLS__H_CONFIGURED__
1131 #define __SYMBOLS__H_CONFIGURED__
1135 # End Include File Header
1138 # Place Module List into Include
1139 foreach $i (@modlist) {
1140 if ($i !~ /_static$/) {
1141 print MODLIST "extern \"C\" void * $i\_init (void);\n";
1144 print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
1149 foreach $i (@modlist)
1151 if ($i !~ /_static$/) {
1152 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1153 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1156 # Write Entry to the Makefile
1158 print FILEHANDLE <<EOCHEESE;
1159 m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
1160 \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
1161 mv m_$i\_static.o ../m_$i.o
1165 # End Write Entry to the MakeFile
1167 print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
1168 open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
1169 open(MUNGED,">src/modules/m_".$i."_static.cpp") or die("Could not create m_".$i."_static.cpp");
1170 while (chomp($a = <MODULE>)) {
1171 $a =~ s/init_module/$i\_init/g;
1172 print MUNGED "$a\n";
1176 print MODLIST <<EOENT;
1177 {"m_$i.so",\&$i\_init},
1182 print MODLIST "{0}};\n\n#endif\n";
1186 sub write_dynamic_modules_makefile {
1187 # Modules Makefile..
1188 print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1189 open(FILEHANDLE, ">src/modules/Makefile");
1192 if ($config{OSNAME} =~ /CYGWIN/) {
1193 $extra = "../inspircd.dll.a";
1197 # Module Makefile Header
1199 print FILEHANDLE <<EOF;
1200 # (C) ChatSpike development team
1201 # Makefile by <Craig\@ChatSpike.net>
1202 # Many Thanks to Andrew Church <achurch\@achurch.org>
1203 # for assisting with making this work right.
1205 # Automatically Generated by ./configure to add a modules
1206 # please run ./configure -update or ./configure -modupdate
1212 # End Module Makefile Header
1215 # Create a Modules List..
1220 foreach $i (@modlist) {
1222 # Write Entry to the MakeFile
1224 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1225 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1226 print FILEHANDLE <<EOCHEESE;
1227 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
1228 \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
1229 \$(CC) \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o $extra
1230 \@-rm -f \$(MODPATH)/m_$i.so
1231 install -v -m 0700 m_$i.so \$(MODPATH)
1235 # End Write Entry to the MakeFile
1241 sub write_static_makefile {
1242 open(FH,">src/Makefile") or die("Could not write src/Makefile!");
1245 opendir(DIRHANDLE, "src");
1246 foreach $name (sort readdir(DIRHANDLE)) {
1247 if ($name =~ /^cmd_(.+)\.cpp$/) {
1248 $cmdlist[$i++] = $1;
1251 closedir(DIRHANDLE);
1254 foreach my $cmd (@cmdlist) {
1255 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1256 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1261 # (C) ChatSpike development team
1262 # Makefile by <Craig\@ChatSpike.net>
1263 # Makefile version 2 (statically linked core) by <brain\@inspircd.org>
1266 CC = im a cheezeball
1268 CXXFLAGS = -I../include \${FLAGS}
1272 # This next section is for cygwin dynamic module builds.
1273 # Basically, what we do, is build the inspircd core as a library
1274 # then the main executable uses that. the library is capable of
1275 # loading / unloading the modules dynamically :)
1276 # Massive thanks to the guys on #cygwin @ irc.freenode.net for helping
1280 if ($config{OSNAME} =~ /CYGWIN/) {
1282 all: timer.o 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 inspircd.exe
1284 inspircd.exe: inspircd.dll.a
1287 inspircd.dll inspircd.dll.a: inspircd.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 hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o
1288 \$(CC) -shared -Wl,--out-implib=inspircd.dll.a -o inspircd.dll \$^
1292 all: timer.o 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
1294 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
1295 \$(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 timer.o \$(MODULES)
1301 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
1302 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1304 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
1305 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1307 userprocess.o: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1308 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1310 socketengine.o: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1311 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1313 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1314 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1316 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1317 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1319 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1320 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1322 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
1323 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1325 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
1326 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1328 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
1329 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1331 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
1332 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1334 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1335 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1337 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
1338 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1340 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
1341 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1343 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
1344 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
1346 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
1347 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1349 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
1350 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1352 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
1353 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1355 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
1356 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1358 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
1359 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1361 socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1362 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1364 aes.o: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1365 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
1367 timer.o: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1368 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1371 foreach my $cmd (@cmdlist) {
1373 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
1374 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1380 sub write_dynamic_makefile {
1384 opendir(DIRHANDLE, "src");
1385 foreach $name (sort readdir(DIRHANDLE)) {
1386 if ($name =~ /^cmd_(.+)\.cpp$/) {
1387 $cmdlist[$i++] = $1;
1390 closedir(DIRHANDLE);
1394 foreach my $cmd (@cmdlist) {
1395 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1396 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1399 open(FH,">src/Makefile") or die("Could not write src/Makefile");
1403 # (C) ChatSpike development team
1404 # Makefile by <Craig\@ChatSpike.net>
1405 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
1408 CC = im a cheezeball
1410 CXXFLAGS = -I../include \${FLAGS}
1412 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 libIRCDio.so libIRCDmessage.so $cmdobjs libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so inspircd
1414 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
1415 \$(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 libIRCDtimer.so
1417 libIRCDsocketengine.so: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1418 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1419 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o
1421 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
1422 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1423 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
1425 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
1426 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1427 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
1429 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1430 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1431 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
1433 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1434 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1435 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
1437 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1438 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1439 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
1441 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1442 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1443 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
1445 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
1446 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1447 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o
1449 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
1450 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1451 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
1453 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
1454 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1455 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
1457 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
1458 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1459 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
1461 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1462 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1463 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
1465 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
1466 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1467 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDio.so inspircd_io.o
1469 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
1470 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1471 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmessage.so message.o
1473 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
1474 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1475 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o $cmdobjs
1477 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
1478 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1479 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdnsqueue.so dnsqueue.o
1481 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
1482 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1483 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
1485 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
1486 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1487 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
1489 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
1490 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1491 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
1493 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
1494 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1495 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
1497 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1498 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1499 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
1501 libIRCDaes.so: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1502 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
1503 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDaes.so aes.o
1505 libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1506 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1507 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDtimer.so timer.o
1510 foreach my $cmd (@cmdlist) {
1512 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
1513 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp