3 # InspIRCd Configuration Script
5 # Copyright 2002-2007 The ChatSpike Development Team
6 # <brain@chatspike.net>
7 # <Craig@chatspike.net>
9 # [14:21] Brain: <matrix impression> i know perl-fu!
13 ########################################
21 # Utility functions for our buildsystem
26 'enable-gnutls' => \$opt_use_gnutls,
27 'enable-openssl' => \$opt_use_openssl,
28 'disable-interactive' => \$opt_nointeractive,
29 'with-nick-length=i' => \$opt_nick_length,
30 'with-channel-length=i' => \$opt_chan_length,
31 'with-max-channels=i' => \$opt_maxchans,
32 'with-max-oper-channels=i' => \$opt_opermaxchans,
33 'with-max-clients=i' => \$opt_maxclients,
34 'enable-epoll' => \$opt_epoll,
35 'enable-kqueue' => \$opt_kqueue,
36 'disable-epoll' => \$opt_noepoll,
37 'disable-kqueue' => \$opt_nokqueue,
38 'enable-ipv6' => \$opt_ipv6,
39 'enable-remote-ipv6' => \$opt_ipv6links,
40 'disable-remote-ipv6' => \$opt_noipv6links,
41 'with-cc=s' => \$opt_cc,
42 'with-ident-length=i' => \$opt_ident,
43 'with-quit-length=i' => \$opt_quit,
44 'with-topic-length=i' => \$opt_topic,
45 'with-kick-length=i' => \$opt_kick,
46 'with-gecos-length=i' => \$opt_gecos,
47 'with-away-length=i' => \$opt_away,
48 'with-max-modes=i' => \$opt_modes,
49 'prefix=s' => \$opt_base_dir,
50 'config-dir=s' => \$opt_config_dir,
51 'module-dir=s' => \$opt_module_dir,
52 'binary-dir=s' => \$opt_binary_dir,
53 'library-dir=s' => \$opt_library_dir,
54 'disable-debuginfo' => sub { $opt_disable_debug = 1 },
55 'help' => sub { showhelp(); },
56 'modupdate' => sub { modupdate(); },
57 'update' => sub { update(); },
58 'svnupdate' => sub { svnupdate(); },
59 'clean' => sub { clean(); },
62 my $non_interactive = (
63 (defined $opt_library_dir) ||
64 (defined $opt_base_dir) ||
65 (defined $opt_config_dir) ||
66 (defined $opt_module_dir) ||
67 (defined $opt_base_dir) ||
68 (defined $opt_binary_dir) ||
69 (defined $opt_nointeractive) ||
70 (defined $opt_away) ||
71 (defined $opt_gecos) ||
72 (defined $opt_kick) ||
73 (defined $opt_maxclients) ||
74 (defined $opt_modes) ||
75 (defined $opt_topic) ||
76 (defined $opt_quit) ||
77 (defined $opt_ident) ||
79 (defined $opt_ipv6) ||
80 (defined $opt_ipv6links) ||
81 (defined $opt_noipv6links) ||
82 (defined $opt_kqueue) ||
83 (defined $opt_epoll) ||
84 (defined $opt_maxchans) ||
85 (defined $opt_opermaxchans) ||
86 (defined $opt_chan_length) ||
87 (defined $opt_nick_length) ||
88 (defined $opt_use_openssl) ||
89 (defined $opt_nokqueue) ||
90 (defined $opt_noepoll) ||
91 (defined $opt_use_gnutls)
93 my $interactive = !$non_interactive;
96 chomp($topdir = getcwd());
97 $this = resolve_directory($topdir); # PWD, Regardless.
98 @modlist = (); # Declare for Module List..
99 %config = (); # Initiate Configuration Hash..
100 $config{ME} = resolve_directory($topdir); # Present Working Directory
102 $config{BASE_DIR} = $config{ME};
104 if (defined $opt_base_dir)
106 $config{BASE_DIR} = $opt_base_dir;
109 $config{CONFIG_DIR} = resolve_directory($config{BASE_DIR}."/conf"); # Configuration Directory
110 $config{MODULE_DIR} = resolve_directory($config{BASE_DIR}."/modules"); # Modules Directory
111 $config{BINARY_DIR} = resolve_directory($config{BASE_DIR}."/bin"); # Binary Directory
112 $config{LIBRARY_DIR} = resolve_directory($config{BASE_DIR}."/lib"); # Library Directory
114 if (defined $opt_config_dir)
116 $config{CONFIG_DIR} = $opt_config_dir;
118 if (defined $opt_module_dir)
120 $config{MODULE_DIR} = $opt_module_dir;
122 if (defined $opt_binary_dir)
124 $config{BINARY_DIR} = $opt_binary_dir;
126 if (defined $opt_library_dir)
128 $config{LIBRARY_DIR} = $opt_library_dir;
130 chomp($config{HAS_GNUTLS} = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
131 chomp($config{HAS_OPENSSL} = `openssl version 2>/dev/null`); # Openssl version
132 $config{USE_GNUTLS} = "n";
133 if (defined $opt_use_gnutls)
135 $config{USE_GNUTLS} = "y"; # Use gnutls.
137 $config{USE_OPENSSL} = "n"; # Use openssl.
138 if (defined $opt_use_openssl)
140 $config{USE_OPENSSL} = "y";
143 # no, let's not change these.
144 $config{OPTIMITEMP} = "0"; # Default Optimisation Value
145 if (!defined $opt_disable_debug)
147 $config{OPTIMISATI} = "-g"; # Optimisation Flag
151 $config{OPTIMISATI} = ""; # DEBUGGING OFF!
154 $config{NICK_LENGT} = "31"; # Default Nick Length
155 if (defined $opt_nick_length)
157 $config{NICK_LENGT} = $opt_nick_length;
159 $config{CHAN_LENGT} = "64"; # Default Channel Name Length
160 if (defined $opt_chan_length)
162 $config{CHAN_LENGT} = $opt_chan_length;
164 $config{MAX_CHANNE} = "20"; # Default Max. Channels per user
165 if (defined $opt_maxchans)
167 $config{MAX_CHANNE} = $opt_maxchans;
169 $config{MAX_OPERCH} = "60"; # Default Max. Channels per oper
170 if (defined $opt_opermaxchans)
172 $config{MAX_OPERCH} = $opt_opermaxchans;
174 $config{MAXI_MODES} = "20"; # Default Max. Number of Modes set at once.
175 if (defined $opt_modes)
177 $config{MAXI_MODES} = $opt_modes;
179 $config{HAS_STRLCPY} = "false"; # strlcpy Check.
180 $config{HAS_STDINT} = "false"; # stdint.h check
181 $config{USE_KQUEUE} = "y"; # kqueue enabled
182 if (defined $opt_kqueue)
184 $config{USE_KQUEUE} = "y";
186 if (defined $opt_nokqueue)
188 $config{USE_KQUEUE} = "n";
190 $config{USE_EPOLL} = "y"; # epoll enabled
191 if (defined $opt_epoll)
193 $config{USE_EPOLL} = "y";
195 if (defined $opt_noepoll)
197 $config{USE_EPOLL} = "n";
199 $config{IPV6} = "n"; # IPv6 support (experimental)
200 if (defined $opt_ipv6)
204 $config{SUPPORT_IP6LINKS} = "y"; # IPv4 supporting IPv6 links (experimental)
205 if (defined $opt_ipv6links)
207 $config{SUPPORT_IP6LINKS} = "y";
209 if (defined $opt_noipv6links)
211 $config{SUPPORT_IP6LINKS} = "n";
213 $config{STATIC_LINK} = "no"; # are doing static modules?
214 chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`); # FD Limit
215 chomp($config{MAX_DESCRIPTORS} = `sh -c \"ulimit -n\"`); # Hard FD Limit
216 chomp($config{GCCVER} = `g++ -dumpversion | cut -c 1`); # Major GCC Version
217 $config{_SOMAXCONN} = SOMAXCONN; # Max connections in accept queue
218 $config{OSNAME} = $^O; # Operating System Name
219 $config{CC} = "g++"; # C++ compiler
222 $config{CC} = $opt_cc;
224 $exec = $config{CC} . " -dumpversion | cut -c 1";
225 chomp($config{GCCVER} = `$exec`); # Major GCC Version
226 $config{MAKEORDER} = "ircd mods"; # build order
227 $config{STATICLIBS} = ""; # library archive path
228 $config{MAX_IDENT} = "12"; # max ident size
229 $config{MAX_QUIT} = "255"; # max quit message size
230 $config{MAX_TOPIC} = "307"; # max topic size
231 $config{MAX_KICK} = "255"; # max kick message size
232 $config{MAX_GECOS} = "128"; # max GECOS size
233 $config{MAX_AWAY} = "200"; # max AWAY size
234 if (defined $opt_ident)
236 $config{MAX_IDENT} = $opt_ident;
238 if (defined $opt_quit)
240 $config{MAX_QUIT} = $opt_quit;
242 if (defined $opt_topic)
244 $config{MAX_TOPIC} = $opt_topic;
246 if (defined $opt_kick)
248 $config{MAX_KICK} = $opt_kick;
250 if (defined $opt_gecos)
252 $config{MAX_GECOS} = $opt_gecos;
254 if (defined $opt_away)
256 $config{MAX_AWAY} = $opt_away;
259 $config{HAS_OPENSSL} =~ /OpenSSL ([-[:digit:].]+)([a-z])?(\-[a-z][0-9])? (\w{3}|[0-9]+) (\w{3}|[0-9]+) [0-9]{4}/;
260 $config{HAS_OPENSSL} = $1;
262 if ($config{GCCVER} eq "") {
263 print $config{CC} . " was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n";
267 # Minihack! Convert Cygwin to 'Cyg-Static' so i can
268 # Keep my dynamic module experiments here for later
271 if ($config{OSNAME} =~ /CYGWIN/i)
273 $config{OSNAME} = "CYG-STATIC";
276 if (!$config{MAX_CLIENT_T}) {
277 $config{MAX_CLIENT_T} = 1024; # Set a reasonable 'Default'
278 $fd_scan_fail = "true"; # Used Later
281 # Get and Set some important vars..
286 system("rm -rf .config.cache");
291 chomp($topdir = getcwd());
292 $this = resolve_directory($topdir); # PWD, Regardless.
294 # Does the cache file exist?
296 # No, No it doesn't.. *BASH*
297 print "You have not run ./configure before. Please do this before trying to run the update script.\n";
300 # We've Loaded the cache file and all our variables..
301 print "Updating Files..\n";
303 if ($opt_disable_debug == 1)
305 print "Disabling debug information (-g).\n";
306 $config{OPTIMISATI} = "";
309 $has_epoll = $config{HAS_EPOLL};
310 $has_kqueue = $config{HAS_KQUEUE};
319 chomp($topdir = getcwd());
320 $this = resolve_directory($topdir); # PWD, Regardless.
322 # Does the cache file exist?
324 # No, No it doesn't.. *BASH*
325 print "You have not run ./configure before. Please do this before trying to run the update script.\n";
328 # We've Loaded the cache file and all our variables..
329 print "Updating Files..\n";
331 $has_epoll = $config{HAS_EPOLL};
332 $has_kqueue = $config{HAS_KQUEUE};
344 open(FH,"<.svn/entries") or $fail = 1;
346 print "This is not an SVN copy of InspIRCd.\n";
349 system("svn update");
350 system("perl configure -update");
351 if ($ARGV[1] eq "rebuild") {
352 system("make install");
357 print "Running non-interactive configure...\n" unless $interactive;
358 print "Checking for cache from previous configure... ";
359 print ((getcache() eq "true") ? "found\n" : "not found\n");
360 print "Checking operating system version... ";
361 print getosflags() . "\n";
363 if (defined $opt_maxclients)
365 $config{MAX_CLIENT} = $opt_maxclients;
368 if (!$config{MAX_CLIENT}) {
369 # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
370 # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
371 # higher than the found value" :))
372 $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
375 printf "Checking if stdint.h exists... ";
376 $config{HAS_STDINT} = "true";
378 open(STDINT, "</usr/include/stdint.h") or $config{HAS_STDINT} = "false";
379 if ($config{HAS_STDINT} eq "true") {
382 print "yes\n" if $config{HAS_STDINT} eq "true";
383 print "no\n" if $config{HAS_STDINT} eq "false";
386 printf "Checking if strlcpy exists... ";
387 # Perform the strlcpy() test..
388 $config{HAS_STRLCPY} = "false";
390 open(STRLCPY, "</usr/include/string.h") or $fail = 1;
392 while (chomp($line = <STRLCPY>)) {
393 # try and find the delcaration of:
394 # size_t strlcpy(...)
395 if ($line =~ /size_t(\0x9|\s)+strlcpy/) {
396 $config{HAS_STRLCPY} = "true";
401 print "yes\n" if $config{HAS_STRLCPY} eq "true";
402 print "no\n" if $config{HAS_STRLCPY} eq "false";
405 printf "Checking if kqueue exists... ";
408 open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
410 while (chomp($line = <KQUEUE>)) {
411 # try and find the delcaration of:
413 if ($line =~ /int(\0x9|\s)+kqueue/) {
419 print "yes\n" if $has_kqueue == 1;
420 print "no\n" if $has_kqueue == 0;
422 printf "Checking if epoll exists... ";
425 open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
431 my $kernel = `uname -r`;
433 if (($kernel =~ /2\.0/) || ($kernel =~ /2\.2/) || ($kernel =~ /2\.4/)) {
437 print "yes\n" if $has_epoll == 1;
438 print "no\n" if $has_epoll == 0;
440 if (($config{OSNAME} =~ /CYGWIN/) || ($config{OSNAME} eq "CYG-STATIC")) {
441 $config{HAS_STRLCPY} = "true";
444 $config{HAS_EPOLL} = $has_epoll;
445 $config{HAS_KQUEUE} = $has_kqueue;
447 printf "Checking for libgnutls... ";
448 if (($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS} >= 1.2) || ($config{HAS_GNUTLS} eq "y"))) {
450 $config{HAS_GNUTLS} = "y";
453 $config{HAS_GNUTLS} = "n";
456 printf "Checking for openssl... ";
457 if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPENSSL} eq "y"))) {
459 $config{HAS_OPENSSL} = "y";
462 $config{HAS_OPENSSL} = "n";
465 ################################################################################
466 # BEGIN INTERACTIVE PART #
467 ################################################################################
475 my $rev = getrevision();
476 # Display Introduction Message..
478 Welcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)
479 \033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m
481 *** If you are unsure of any of these values, leave it blank for ***
482 *** standard settings that will work, and your server will run ***
483 *** using them. Please consult your IRC network admin if in doubt. ***
485 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
486 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
487 dir, otherwise you won't have a config file!
489 Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos)
490 Maximum file descriptors: \033[1;32m$config{MAX_CLIENT_T}\033[0m
491 Your InspIRCd revision ID is \033[1;32mr$rev\033[0m";
493 print " (Non-SVN build)";
497 $config{CHANGE_COMPILER} = "n";
498 print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
500 while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
501 print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
502 should NOT be used. You should probably specify a newer compiler.\n\n";
503 yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
504 if ($config{CHANGE_COMPILER} =~ /y/i) {
505 print "What command do you want to use to invoke your compiler?\n";
506 print "[\033[1;32m$config{CC}\033[0m] -> ";
507 chomp($config{CC} = <STDIN>);
508 if ($config{CC} eq "") {
511 chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
513 chomp($config{GCCVER} = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change compilers
514 print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
515 if ($config{GCCVER} < 3) {
516 print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n";
520 print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
527 # Directory Settings..
528 my $tmpbase = $config{BASE_DIR};
529 dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
530 if ($tmpbase ne $config{BASE_DIR}) {
531 $config{CONFIG_DIR} = resolve_directory($config{BASE_DIR}."/conf"); # Configuration Dir
532 $config{MODULE_DIR} = resolve_directory($config{BASE_DIR}."/modules"); # Modules Directory
533 $config{BINARY_DIR} = resolve_directory($config{BASE_DIR}."/bin"); # Binary Directory
534 $config{LIBRARY_DIR} = resolve_directory($config{BASE_DIR}."/lib"); # Library Directory
537 dir_check("are the configuration files", "CONFIG_DIR");
538 dir_check("are the modules to be compiled to", "MODULE_DIR");
539 dir_check("is the IRCd binary to be placed", "BINARY_DIR");
540 dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
543 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?");
547 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?");
550 $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
551 if (!$chose_hiperf) {
552 print "No high-performance socket engines are available, or you chose\n";
553 print "not to enable one. Defaulting to select() engine.\n\n";
556 yesno(IPV6,"Would you like to build InspIRCd with IPv6 support?");
559 if ($config{IPV6} eq "y") {
560 print "You have chosen to build an \033[1;32mIPV6-only\033[0m server.\nTo accept IPV4 users, you must use the '::ffff:' notation of addresses.\n\n";
561 $config{SUPPORT_IP6LINKS} = "y";
563 yesno(SUPPORT_IP6LINKS,"You have chosen to build an \033[1;32mIPV4-only\033[0m server.\nWould you like to enable support for linking to IPV6-enabled\nInspIRCd servers which are using '::ffff:' notation?\nIf you are using a recent operating\nsystem and are unsure, answer yes.");
567 if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
568 print "I have detected both GnuTLS and OpenSSL on your system.\n";
569 print "I will default to GnuTLS. If you wish to use OpenSSL\n";
570 print "instead, you should enable the OpenSSL module yourself\n";
571 print "by copying it from src/modules/extra to src/modules.\n\n";
574 if ($config{HAS_GNUTLS} eq "y") {
575 yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
576 if ($config{USE_GNUTLS} eq "y") {
577 print "\nUsing GnuTLS SSL module.\n";
579 } elsif ($config{HAS_OPENSSL} eq "y") {
580 yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
581 if ($config{USE_OPENSSL} eq "y") {
582 print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
586 print "\nThe following questions will ask you for various figures relating\n";
587 print "To your IRCd install. Please note that these should usually be left\n";
588 print "as defaults unless you have a real reason to change them. If they\n";
589 print "changed, then the values must be identical on all servers on your\n";
590 print "network, or malfunctions and/or crashes may occur, with the exception\n";
591 print "of the 'maximum number of clients' setting which may be different on\n";
592 print "different servers on the network.\n\n";
594 # File Descriptor Settings..
595 promptnumeric("number of clients at any one time", "MAX_CLIENT_T");
596 $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
597 $config{MAX_DESCRIPTORS} = $config{MAX_CLIENT_T};
599 promptnumeric("length of nicknames", "NICK_LENGT");
600 promptnumeric("length of channel names", "CHAN_LENGT");
601 promptnumeric("number of channels a normal user may join at any one time", "MAX_CHANNE");
602 promptnumeric("number of channels an oper may join at any one time", "MAX_OPERCH");
603 promptnumeric("number of mode changes in one line", "MAXI_MODES");
604 promptnumeric("length of an ident (username)", "MAX_IDENT");
605 promptnumeric("length of a quit message", "MAX_QUIT");
606 promptnumeric("length of a channel topic", "MAX_TOPIC");
607 promptnumeric("length of a kick message", "MAX_KICK");
608 promptnumeric("length of a GECOS (real name)", "MAX_GECOS");
609 promptnumeric("length of an away message", "MAX_AWAY");
614 if (($config{USE_GNUTLS} eq "y") && ($config{HAS_GNUTLS} ne "y"))
616 print "Sorry, but i couldn't detect gnutls. Make sure gnutls-config is in your path.\n";
619 if (($config{USE_OPENSSL} eq "y") && ($config{HAS_OPENSSL} ne "y"))
621 print "Sorry, but i couldn't detect openssl. Make sure openssl is in your path.\n";
625 if ($config{USE_GNUTLS} eq "y") {
627 open(TMP, "<src/modules/m_ssl_gnutls.cpp") or $failed = 1;
630 print "Symlinking src/modules/m_ssl_gnutls.cpp from extra/\n";
631 chdir("src/modules");
632 system("ln -s extra/m_ssl_gnutls.cpp");
633 system("ln -s extra/ssl_cert.h");
640 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
642 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
645 print "SSL Certificates Not found, Generating.. \n\n
646 *************************************************************
647 * Generating the Private Key may take some time, go grab a *
648 * Coffee. Even better, to generate some more entropy if it *
649 * is taking a while, open another console and type du / a *
650 * few times and get that HD going :) Then answer the *
651 * Questions which follow. If you are unsure, just hit enter *
652 *************************************************************\n\n";
653 system("certtool --generate-privkey --outfile key.pem");
654 system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
655 print "\nCertificate generation complete, copying to config directory... ";
656 system("mv key.pem $config{CONFIG_DIR}/key.pem");
657 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
660 print "SSL Certificates found, skipping.\n\n"
665 print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
667 } elsif ($config{USE_OPENSSL} eq "y") {
669 open(TMP, "<src/modules/m_ssl_openssl.cpp") or $failed = 1;
672 print "Symlinking src/modules/m_ssl_openssl.cpp from extra/\n";
673 chdir("src/modules");
674 system("ln -s extra/m_ssl_openssl.cpp");
675 system("ln -s extra/ssl_cert.h");
682 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
684 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
687 print "SSL Certificates Not found, Generating.. \n\n
688 *************************************************************
689 * Generating the certificates may take some time, go grab a *
690 * coffee, or something. *
691 *************************************************************\n\n";
692 system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
693 system("openssl dhparam -out dhparams.pem 1024");
694 print "\nCertificate generation complete, copying to config directory... ";
695 system("mv key.pem $config{CONFIG_DIR}/key.pem");
696 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
697 system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
700 print "SSL Certificates found, skipping.\n\n"
705 print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
708 if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
709 print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
717 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
718 if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
719 print "Please remember that to enable \033[1;32mSSL support\033[0m you must\n";
720 print "load the required modules in your config. This configure process\n";
721 print "has just prepared these modules to be compiled for you, and has not\n";
722 print "configured them to be compiled into the core of the ircd.\n";
724 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
725 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
726 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";
729 if ($config{GCCVER} < "3") {
731 \033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
732 GCC 2.x series compilers only had partial (read as broken) C++ support, and
733 your compile will most likely fail horribly! If you have any problems, do NOT
734 report them to the bugtracker or forums without first upgrading your compiler
735 to a newer 3.x or 4.x (or whatever is available currently) version.
739 ################################################################################
741 ################################################################################
743 # Retrieves the .config.cache file, and loads values into the main config hash.
744 open(CACHE, ".config.cache") or return undef;
747 # Ignore Blank lines, and comments..
750 my ($key, $value) = split("=", $_);
751 $value =~ /^\"(.*)\"$/;
752 # Do something with data here!
760 # Dump the contents of %config
761 print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
762 open(FILEHANDLE, ">.config.cache");
763 foreach $key (keys %config) {
764 print FILEHANDLE "$key=\"$config{$key}\"\n";
770 my ($desc, $hash_key) = @_;
773 print "In what directory $desc?\n";
774 print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
775 chomp($var = <STDIN>);
777 $var = $config{$hash_key};
779 if ($var =~ /^\~\/(.+)$/) {
780 # Convert it to a full path..
781 $var = resolve_directory($ENV{HOME} . "/" . $1);
783 elsif ((($config{OSNAME} =~ /MINGW32/i) and ($var !~ /^[A-Z]{1}:\\.*/)) and (substr($var,0,1) ne "/"))
785 # Assume relative Path was given.. fill in the rest.
786 $var = $this . "/$var";
789 $var = resolve_directory($var);
791 print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
792 chomp($tmp = <STDIN>);
793 if (($tmp eq "") || ($tmp =~ /^y/i)) {
794 # Attempt to Create the Dir..
796 system("mkdir -p \"$var\" >> /dev/null 2>&1");
797 $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
799 print "Unable to create directory. ($var)\n\n";
804 # They said they don't want to create, and we can't install there.
810 # Target exists, but is not a directory.
811 print "File $var exists, but is not a directory.\n\n";
815 # Either Dir Exists, or was created fine.
816 $config{$hash_key} = $var;
824 $config{LDLIBS} = "-lstdc++";
825 $config{FLAGS} = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}";
826 $config{MAKEPROG} = "make";
828 if ($config{OSNAME} =~ /OpenBSD/i) {
829 $config{MAKEPROG} = "gmake";
830 chomp($foo = `eg++ -dumpversion | cut -c 1`);
831 # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
832 # if theyre not running this, configure lets the build continue but they probably wont manage to
833 # compile as this standard version is 2.95.3!
835 $config{CC} = "eg++";
836 chomp($config{GCCVER} = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change the compiler path
841 if ($config{OSNAME} =~ /Linux/i) {
842 $config{LDLIBS} = "-ldl -lstdc++";
843 $config{FLAGS} = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}";
844 $config{FLAGS} .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
845 $config{MAKEPROG} = "make";
846 if ($config{OSNAME} =~ /CYGWIN/) {
847 $config{FLAGS} = "-fno-strict-aliasing -Wall -Woverloaded-virtual $config{OPTIMISATI}";
848 $config{LDLIBS} = "";
849 $config{MAKEPROG} = "/usr/bin/make";
850 $config{MAKEORDER} = "ircd mods";
852 } elsif ($config{OSNAME} eq "CYG-STATIC") {
853 $config{FLAGS} = "-fno-strict-aliasing -Wall -Woverloaded-virtual $config{OPTIMISATI}";
854 $config{LDLIBS} = "";
855 $config{MAKEPROG} = "/usr/bin/make";
856 $config{MAKEORDER} = "mods ircd";
857 $config{STATICLIBS} = "modules/mods.a";
858 $config{STATIC_LINK} = "yes";
859 return "Cygwin-Static";
861 $config{FLAGS} .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
864 if ($config{OSNAME} =~ /SunOS/i)
866 # solaris/sunos needs these
867 # socket = bsd sockets api
869 # rt = POSIX realtime extensions
870 # resolv = inet_aton only (why isnt this in nsl?!)
871 $config{MAKEPROG} = "gmake";
872 $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
876 if($config{OSNAME} =~ /MINGW32/i)
878 # All code is position-independent on windows
879 $config{FLAGS} =~ s/-fPIC //;
883 return $config{OSNAME};
887 my($writeheader) = @_;
888 # First File.. inspircd_config.h
889 chomp(my $incos = `uname -n -s -r`);
890 chomp(my $version = `sh ./src/version.sh`);
891 chomp(my $revision = getrevision());
892 $version = "$version(r$revision)";
893 chomp(my $revision2 = getrevision());
894 if ($writeheader == 1)
896 print "Writing \033[1;32minspircd_config.h\033[0m\n";
897 open(FILEHANDLE, ">include/inspircd_config.h");
898 my $NL = $config{NICK_LENGT}+1;
899 my $CL = $config{CHAN_LENGT}+1;
900 print FILEHANDLE <<EOF;
901 /* Auto generated by configure, do not modify! */
902 #ifndef __CONFIGURATION_AUTO__
903 #define __CONFIGURATION_AUTO__
905 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
906 #define MOD_PATH "$config{MODULE_DIR}"
907 #define VERSION "$version"
908 #define REVISION "$revision2"
909 #define MAXCLIENTS $config{MAX_CLIENT}
910 #define MAXCLIENTS_S "$config{MAX_CLIENT}"
911 #define SOMAXCONN_S "$config{_SOMAXCONN}"
912 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
915 #define MAXCHANS $config{MAX_CHANNE}
916 #define OPERMAXCHANS $config{MAX_OPERCH}
917 #define MAXMODES $config{MAXI_MODES}
918 #define IDENTMAX $config{MAX_IDENT}
919 #define MAXQUIT $config{MAX_QUIT}
920 #define MAXTOPIC $config{MAX_TOPIC}
921 #define MAXKICK $config{MAX_KICK}
922 #define MAXGECOS $config{MAX_GECOS}
923 #define MAXAWAY $config{MAX_AWAY}
924 #define OPTIMISATION $config{OPTIMITEMP}
925 #define LIBRARYDIR "$config{LIBRARY_DIR}"
926 #define SYSTEM "$incos"
929 if ($config{OSNAME} =~ /SunOS/i) {
930 print FILEHANDLE "#define IS_SOLARIS\n";
932 if ($config{OSNAME} =~ /CYGWIN/i) {
933 print FILEHANDLE "#define IS_CYGWIN\n";
934 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE 1024\n#endif\n";
936 if ($config{OSNAME} =~ /MINGW32/i) {
937 print FILEHANDLE "#define IS_MINGW\n";
939 if ($config{OSNAME} =~ /CYG-STATIC/i) {
940 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE 1024\n#endif\n";
942 if ($config{STATIC_LINK} eq "yes") {
943 print FILEHANDLE "#define STATIC_LINK\n";
945 if ($config{GCCVER} >= 3) {
946 print FILEHANDLE "#define GCC3\n";
948 if ($config{HAS_STRLCPY} eq "true") {
949 print FILEHANDLE "#define HAS_STRLCPY\n";
951 if ($config{HAS_STDINT} eq "true") {
952 print FILEHANDLE "#define HAS_STDINT\n";
954 if ($config{IPV6} =~ /y/i) {
955 print FILEHANDLE "#define IPV6\n";
957 if ($config{SUPPORT_IP6LINKS} =~ /y/i) {
958 print FILEHANDLE "#define SUPPORT_IP6LINKS\n";
961 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
962 print FILEHANDLE "#define USE_KQUEUE\n";
963 $se = "socketengine_kqueue";
966 if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
967 print FILEHANDLE "#define USE_EPOLL\n";
968 $se = "socketengine_epoll";
971 # user didn't choose either epoll or select for their OS.
972 # default them to USE_SELECT (ewwy puke puke)
974 print FILEHANDLE "#define USE_SELECT\n";
975 $se = "socketengine_select";
977 print FILEHANDLE "\n#endif\n";
983 open(FILEHANDLE, ">include/inspircd_se_config.h");
984 print FILEHANDLE <<EOF;
985 /* Auto generated by configure, do not modify or commit to svn! */
986 #ifndef __CONFIGURATION_SOCKETENGINE__
987 #define __CONFIGURATION_SOCKETENGINE__
997 # Create a Modules List..
999 foreach $i (@modlist)
1001 if ($config{STATIC_LINK} eq "yes") {
1002 $modules .= "m_".$i.".o ";
1005 $modules .= "m_".$i.".so ";
1008 chomp($modules); # Remove Redundant whitespace..
1011 # Write all .in files.
1014 my $exe = "inspircd";
1016 if ($config{OSNAME} =~ /CYGWIN/i) {
1017 $exe = "inspircd.exe";
1020 opendir(DIRHANDLE, $this);
1022 # Do this once here, and cache it in the .*.inc files,
1023 # rather than attempting to read src/version.sh from
1024 # compiled code -- we might not have the source to hand.
1025 # Fix for bug#177 by Brain.
1027 chomp(my $version = `sh ./src/version.sh`);
1028 chomp(my $revision = getrevision());
1029 $version = "$version(r$revision)";
1031 # We can actually parse any file starting with . and ending with .inc,
1032 # but right now we only parse .inspircd.inc to form './inspircd'
1034 foreach $name (sort readdir(DIRHANDLE)) {
1035 if ($name =~ /^\.(.+)\.inc$/) {
1037 # All .name.inc files need parsing!
1039 open(FILEHANDLE, ".$file.inc");
1040 while (<FILEHANDLE>) {
1045 $tmp =~ s/\@CC\@/$config{CC}/;
1046 $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
1047 $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
1048 $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
1049 $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
1050 $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
1051 $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
1052 $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
1053 $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
1054 $tmp =~ s/\@MODULES\@/$modules/;
1055 $tmp =~ s/\@EXECUTABLE\@/$exe/;
1056 $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
1057 $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
1058 $tmp =~ s/\@VERSION\@/$version/;
1060 print "Writing \033[1;32m$file\033[0m\n";
1061 open(FILEHANDLE, ">$file");
1062 print FILEHANDLE $tmp;
1065 closedir(DIRHANDLE);
1067 # Make inspircd executable!
1068 chmod 0744, 'inspircd';
1070 if ($config{STATIC_LINK} eq "yes") {
1071 print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
1072 write_static_makefile();
1073 write_static_modules_makefile();
1074 } elsif ($config{OSNAME} =~ /CYGWIN/i) {
1075 print "Writing cygwin-build \033[1;32msrc/Makefile\033[0m\n";
1076 write_static_makefile();
1077 write_dynamic_modules_makefile();
1079 print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
1080 write_dynamic_makefile();
1081 write_dynamic_modules_makefile();
1085 sub write_static_modules_makefile {
1086 # Modules Makefile..
1087 print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1088 open(FILEHANDLE, ">src/modules/Makefile");
1091 # Module Makefile Header
1093 print FILEHANDLE <<EOF;
1094 # (C) ChatSpike development team
1095 # Makefile by <Craig\@ChatSpike.net>
1096 # Many Thanks to Andrew Church <achurch\@achurch.org>
1097 # for assisting with making this work right.
1099 # Automatically Generated by ./configure to add a modules
1100 # please run ./configure --update
1106 # End Module Makefile Header
1109 # Create a Modules List..
1114 open(MODLIST,">include/modlist.h");
1117 # Include File Header
1119 print MODLIST <<HEADER;
1120 // Generated automatically by configure. DO NOT EDIT!
1122 #ifndef __SYMBOLS__H_CONFIGURED__
1123 #define __SYMBOLS__H_CONFIGURED__
1127 # End Include File Header
1130 # Place Module List into Include
1131 foreach $i (@modlist) {
1132 if ($i !~ /_static$/) {
1133 print MODLIST "extern \"C\" void * $i\_init (void);\n";
1136 print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
1141 foreach $i (@modlist)
1143 if ($i !~ /_static$/) {
1144 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1145 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1146 $deps = getdependencies("src/modules/m_".$i.".cpp");
1148 #print "file: $i: cmflags=$cmflags; liflags=$liflags; deps=$deps\n";
1151 # Write Entry to the Makefile
1153 print FILEHANDLE <<EOCHEESE;
1154 m_$i.o: .m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h $deps
1155 \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c .m_$i\_static.cpp
1156 mv .m_$i\_static.o ../m_$i.o
1160 # End Write Entry to the MakeFile
1162 print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
1163 open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
1164 open(MUNGED,">src/modules/.m_".$i."_static.cpp") or die("Could not create .m_".$i."_static.cpp");
1165 while (chomp($a = <MODULE>)) {
1166 $a =~ s/init_module/$i\_init/g;
1167 print MUNGED "$a\n";
1171 print MODLIST <<EOENT;
1172 {"m_$i.so",\&$i\_init},
1178 print MODLIST "{0}};\n\n#endif\n";
1182 sub write_dynamic_modules_makefile {
1183 # Modules Makefile..
1184 print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1185 open(FILEHANDLE, ">src/modules/Makefile");
1188 if ($config{OSNAME} =~ /CYGWIN/i) {
1189 $extra = "../inspircd.dll.a";
1193 # Module Makefile Header
1195 print FILEHANDLE <<EOF;
1196 # (C) ChatSpike development team
1197 # Makefile by <Craig\@ChatSpike.net>
1198 # Many Thanks to Andrew Church <achurch\@achurch.org>
1199 # for assisting with making this work right.
1201 # Automatically Generated by ./configure to add a modules
1202 # please run ./configure -update or ./configure -modupdate
1208 # End Module Makefile Header
1211 # Create a Modules List..
1217 foreach $i (@modlist) {
1219 # Write Entry to the MakeFile
1221 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1222 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1223 $deps = getdependencies("src/modules/m_".$i.".cpp");
1225 #print "file: $i: cmflags=$cmflags; liflags=$liflags; deps=$deps\n";
1227 print FILEHANDLE <<EOCHEESE;
1228 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/configreader.h $deps
1229 \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
1230 \$(CC) -pipe \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o $extra
1233 $crud = $crud . " install -m \$(INSTMODE) m_$i.so \$(MODPATH)\n";
1235 # End Write Entry to the MakeFile
1239 opendir(DIRHANDLE, "src/modules");
1240 foreach $name (sort readdir(DIRHANDLE)) {
1241 if ($name =~ /^m_(.+?)$/) {
1243 $crap2 = "ar r $name.a ";
1245 # A module made of multiple files, in a dir, e.g. src/modules/m_spanningtree/
1246 if (opendir(MDIRHANDLE, "src/modules/$name") != 0) {
1247 print FILEHANDLE "$name.a: ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h $deps";
1248 foreach $fname (sort readdir(MDIRHANDLE)) {
1249 if ($fname =~ /\.cpp$/) {
1250 $cmflags = getcompilerflags("src/modules/$name/$fname");
1251 $liflags = getlinkerflags("src/modules/$name/$fname");
1252 $deps = getdependencies("src/modules/$name/$fname");
1253 print FILEHANDLE " $name/$fname";
1254 $crapola = $crapola . " \$(CC) -pipe -I../../../include \$(FLAGS) $cmflags -export-dynamic -c $name/$fname\n";
1256 $oname =~ s/\.cpp$/.o/g;
1257 $crap2 = $crap2 . " $name/$oname";
1258 $crap3 = $crap3 . " $name/$fname";
1261 print FILEHANDLE "\n$crapola\n";
1262 print FILEHANDLE "$name.so: $name.a ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h$crap3\n $crap2\n";
1263 print FILEHANDLE " ranlib $name.a$crap3\n";
1264 print FILEHANDLE " \$(CC) -pipe $liflags -shared -o $name.so $name.a\n";
1265 closedir(MDIRHANDLE);
1269 closedir(DIRHANDLE);
1271 print FILEHANDLE "modinst:\n \@echo \"Installing modules...\"\n" . $crud;
1275 sub write_static_makefile {
1276 open(FH,">src/Makefile") or die("Could not write src/Makefile!");
1279 opendir(DIRHANDLE, "src");
1280 foreach $name (sort readdir(DIRHANDLE)) {
1281 if ($name =~ /^cmd_(.+)\.cpp$/) {
1282 $cmdlist[$i++] = $1;
1285 closedir(DIRHANDLE);
1288 foreach my $cmd (@cmdlist) {
1289 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1290 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1295 # (C) ChatSpike development team
1296 # Makefile by <Craig\@ChatSpike.net>
1297 # Makefile version 2 (statically linked core) by <brain\@inspircd.org>
1300 CC = im a cheezeball
1302 CXXFLAGS = -I../include \${FLAGS}
1303 CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
1304 RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
1308 $se = "socketengine_select";
1309 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1310 $se = "socketengine_kqueue";
1312 elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1313 $se = "socketengine_epoll";
1317 # This next section is for cygwin dynamic module builds.
1318 # Basically, what we do, is build the inspircd core as a library
1319 # then the main executable uses that. the library is capable of
1320 # loading / unloading the modules dynamically :)
1321 # Massive thanks to the guys on #cygwin @ irc.freenode.net for helping
1325 if ($config{OSNAME} =~ /CYGWIN/i) {
1327 all: timer.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 configreader.o inspsocket.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o inspircd.exe
1329 inspircd.exe: inspircd.dll.a
1332 inspircd.dll inspircd.dll.a: inspircd.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs commands.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 timer.o snomasks.o
1333 \$(CC) -shared -Wl,--out-implib=inspircd.dll.a -o inspircd.dll \$^
1337 all: timer.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 configreader.o inspsocket.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o \$(MODULES) inspircd.exe
1339 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
1340 \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspsocket.o configreader.o $cmdobjs commands.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 timer.o snomasks.o modes/modeclasses.a \$(MODULES)
1346 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
1347 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1349 snomasks.o: snomasks.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/channels.h
1350 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1352 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
1353 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1355 userprocess.o: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1356 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1358 socketengine.o: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1359 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
1361 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1362 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1364 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1365 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1367 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1368 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1370 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 \$(RELCPPFILES) modes/modeclasses.a
1371 \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS)
1372 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1374 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
1375 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1377 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
1378 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1380 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 ../include/timer.h
1381 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1383 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1384 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1386 configreader.o: configreader.cpp ../include/base.h ../include/configreader.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1387 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
1389 commands.o: commands.cpp ../include/base.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h $srcobjs
1390 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
1392 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
1393 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1395 users.o: users.cpp ../include/base.h ../include/users.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1396 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1398 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 ../include/timer.h
1399 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1401 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
1402 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1404 socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1405 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1407 inspsocket.o: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1408 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1410 timer.o: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1411 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1414 foreach my $cmd (@cmdlist) {
1416 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/commands/cmd_$cmd.h
1417 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1423 sub write_dynamic_makefile {
1427 opendir(DIRHANDLE, "src");
1428 foreach $name (sort readdir(DIRHANDLE)) {
1429 if ($name =~ /^cmd_(.+)\.cpp$/) {
1430 $cmdlist[$i++] = $1;
1433 closedir(DIRHANDLE);
1437 foreach my $cmd (@cmdlist) {
1438 $cmdobjs = $cmdobjs . "cmd_$cmd.so ";
1439 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1442 $se = "socketengine_select";
1443 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1444 $se = "socketengine_kqueue";
1446 elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1447 $se = "socketengine_epoll";
1450 open(FH,">src/Makefile") or die("Could not write src/Makefile");
1454 # (C) ChatSpike development team
1455 # Makefile by <Craig\@ChatSpike.net>
1456 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
1459 CC = im a cheezeball
1461 CXXFLAGS = -I../include \${FLAGS}
1462 CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
1463 RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
1465 all: libIRCDtimer.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so $cmdobjs libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so libIRCDsnomasks.so inspircd
1467 inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/socket.h libIRCDtimer.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so $cmdobjs libIRCDsnomasks.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so
1468 \$(CC) -pipe -I../include $extra -Wl,--rpath -Wl,$config{LIBRARY_DIR} \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDhash.so libIRCDsocket.so libIRCDsocketengine.so libIRCDuserprocess.so libIRCDcull_list.so libIRCDcommand_parse.so libIRCDtimer.so libIRCDsnomasks.so
1470 libIRCDsocketengine.so: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1471 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
1472 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o $se.o
1474 libIRCDsnomasks.so: snomasks.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/channels.h
1475 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1476 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsnomasks.so snomasks.o
1478 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
1479 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1480 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
1482 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
1483 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1484 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
1486 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1487 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1488 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
1490 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1491 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1492 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
1494 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1495 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1496 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
1498 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1499 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1500 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
1502 libIRCDmode.so: mode.cpp ../include/base.h ../include/mode.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h \$(RELCPPFILES)
1503 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1504 \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
1505 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o modes/modeclasses.a
1507 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 ../include/timer.h
1508 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1509 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
1511 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
1512 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1513 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
1515 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 ../include/timer.h
1516 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1517 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
1519 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1520 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1521 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
1523 libIRCDconfigreader.so: configreader.cpp ../include/base.h ../include/configreader.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1524 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
1525 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDconfigreader.so configreader.o
1527 libIRCDcommands.so: commands.cpp ../include/base.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1528 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1529 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o
1531 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
1532 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1533 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
1535 libIRCDusers.so: users.cpp ../include/base.h ../include/users.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1536 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1537 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
1539 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 ../include/timer.h
1540 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1541 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
1543 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
1544 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1545 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
1547 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1548 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1549 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
1551 libIRCDinspsocket.so: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1552 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1553 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDinspsocket.so inspsocket.o
1555 libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1556 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1557 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDtimer.so timer.o
1560 foreach my $cmd (@cmdlist) {
1562 cmd_$cmd.so: 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/commands/cmd_$cmd.h
1563 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1564 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o cmd_$cmd.so cmd_$cmd.o