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},
1177 print MODLIST "{0}};\n\n#endif\n";
1181 sub write_dynamic_modules_makefile {
1182 # Modules Makefile..
1183 print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1184 open(FILEHANDLE, ">src/modules/Makefile");
1187 if ($config{OSNAME} =~ /CYGWIN/i) {
1188 $extra = "../inspircd.dll.a";
1192 # Module Makefile Header
1194 print FILEHANDLE <<EOF;
1195 # (C) ChatSpike development team
1196 # Makefile by <Craig\@ChatSpike.net>
1197 # Many Thanks to Andrew Church <achurch\@achurch.org>
1198 # for assisting with making this work right.
1200 # Automatically Generated by ./configure to add a modules
1201 # please run ./configure -update or ./configure -modupdate
1207 # End Module Makefile Header
1210 # Create a Modules List..
1216 foreach $i (@modlist) {
1218 # Write Entry to the MakeFile
1220 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1221 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1222 $deps = getdependencies("src/modules/m_".$i.".cpp");
1224 #print "file: $i: cmflags=$cmflags; liflags=$liflags; deps=$deps\n";
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/configreader.h $deps
1228 \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
1229 \$(CC) -pipe \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o $extra
1232 $crud = $crud . " install -m \$(INSTMODE) m_$i.so \$(MODPATH)\n";
1234 # End Write Entry to the MakeFile
1237 print FILEHANDLE "modinst:\n \@echo \"Installing modules...\"\n" . $crud;
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}
1269 CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
1270 RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
1274 $se = "socketengine_select";
1275 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1276 $se = "socketengine_kqueue";
1278 elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1279 $se = "socketengine_epoll";
1283 # This next section is for cygwin dynamic module builds.
1284 # Basically, what we do, is build the inspircd core as a library
1285 # then the main executable uses that. the library is capable of
1286 # loading / unloading the modules dynamically :)
1287 # Massive thanks to the guys on #cygwin @ irc.freenode.net for helping
1291 if ($config{OSNAME} =~ /CYGWIN/i) {
1293 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
1295 inspircd.exe: inspircd.dll.a
1298 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
1299 \$(CC) -shared -Wl,--out-implib=inspircd.dll.a -o inspircd.dll \$^
1303 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
1305 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
1306 \$(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)
1312 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
1313 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1315 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
1316 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1318 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
1319 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1321 userprocess.o: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1322 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1324 socketengine.o: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1325 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
1327 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1328 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1330 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1331 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1333 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1334 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1336 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
1337 \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS)
1338 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1340 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
1341 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1343 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
1344 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1346 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
1347 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1349 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1350 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1352 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
1353 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
1355 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
1356 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
1358 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
1359 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1361 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
1362 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1364 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
1365 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1367 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
1368 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1370 socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1371 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1373 inspsocket.o: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1374 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1376 timer.o: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1377 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1380 foreach my $cmd (@cmdlist) {
1382 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
1383 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1389 sub write_dynamic_makefile {
1393 opendir(DIRHANDLE, "src");
1394 foreach $name (sort readdir(DIRHANDLE)) {
1395 if ($name =~ /^cmd_(.+)\.cpp$/) {
1396 $cmdlist[$i++] = $1;
1399 closedir(DIRHANDLE);
1403 foreach my $cmd (@cmdlist) {
1404 $cmdobjs = $cmdobjs . "cmd_$cmd.so ";
1405 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1408 $se = "socketengine_select";
1409 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1410 $se = "socketengine_kqueue";
1412 elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1413 $se = "socketengine_epoll";
1416 open(FH,">src/Makefile") or die("Could not write src/Makefile");
1420 # (C) ChatSpike development team
1421 # Makefile by <Craig\@ChatSpike.net>
1422 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
1425 CC = im a cheezeball
1427 CXXFLAGS = -I../include \${FLAGS}
1428 CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
1429 RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
1431 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
1433 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
1434 \$(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
1436 libIRCDsocketengine.so: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1437 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
1438 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o $se.o
1440 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
1441 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1442 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsnomasks.so snomasks.o
1444 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
1445 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1446 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
1448 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
1449 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1450 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
1452 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1453 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1454 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
1456 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1457 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1458 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
1460 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1461 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1462 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
1464 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1465 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1466 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
1468 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)
1469 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1470 \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
1471 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o modes/modeclasses.a
1473 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
1474 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1475 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
1477 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
1478 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1479 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
1481 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
1482 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1483 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
1485 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1486 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1487 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
1489 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
1490 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
1491 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDconfigreader.so configreader.o
1493 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
1494 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1495 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o
1497 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
1498 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1499 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
1501 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
1502 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1503 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
1505 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
1506 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1507 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
1509 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
1510 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1511 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
1513 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1514 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1515 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
1517 libIRCDinspsocket.so: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1518 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1519 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDinspsocket.so inspsocket.o
1521 libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1522 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1523 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDtimer.so timer.o
1526 foreach my $cmd (@cmdlist) {
1528 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
1529 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1530 \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o cmd_$cmd.so cmd_$cmd.o