]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - configure
Add m_nickflood to example conf.
[user/henk/code/inspircd.git] / configure
1 #!/usr/bin/perl
2 ###################################################
3 # InspIRCd Configuration Script
4 #
5 # Copyright 2002-2007 The InspIRCd Development Team
6 #  http://www.inspircd.org/wiki/index.php/Credits
7 #
8 # Licensed under GPL, please see the COPYING file
9 # for more information
10 #
11 # $Id$
12 #
13 ###################################################
14
15 require 5.6.0;
16 use Socket;
17 use Cwd;
18 use Getopt::Long;
19
20 # Utility functions for our buildsystem
21 use make::utilities;
22 use make::configure;
23 use make::gnutlscert;
24 use make::opensslcert;
25
26 GetOptions (
27         'enable-gnutls' => \$opt_use_gnutls,
28         'rebuild' => \$opt_rebuild,
29         'enable-openssl' => \$opt_use_openssl,
30         'disable-interactive' => \$opt_nointeractive,
31         'with-nick-length=i' => \$opt_nick_length,
32         'with-channel-length=i' => \$opt_chan_length,
33         'with-max-clients=i' => \$opt_maxclients,
34         'enable-ports' => \$opt_ports,
35         'enable-epoll' => \$opt_epoll,
36         'enable-kqueue' => \$opt_kqueue,
37         'disable-ports' => \$opt_noports,
38         'disable-epoll' => \$opt_noepoll,
39         'disable-kqueue' => \$opt_nokqueue,
40         'enable-ipv6' => \$opt_ipv6,
41         'enable-remote-ipv6' => \$opt_ipv6links,
42         'disable-remote-ipv6' => \$opt_noipv6links,
43         'with-cc=s' => \$opt_cc,
44         'with-ident-length=i' => \$opt_ident,
45         'with-quit-length=i' => \$opt_quit,
46         'with-topic-length=i' => \$opt_topic,
47         'with-maxbuf=i' => \$opt_maxbuf,
48         'with-kick-length=i' => \$opt_kick,
49         'with-gecos-length=i' => \$opt_gecos,
50         'with-away-length=i' => \$opt_away,
51         'with-max-modes=i' => \$opt_modes,
52         'prefix=s' => \$opt_base_dir,
53         'config-dir=s' => \$opt_config_dir,
54         'module-dir=s' => \$opt_module_dir,
55         'binary-dir=s' => \$opt_binary_dir,
56         'library-dir=s' => \$opt_library_dir,
57         'disable-debuginfo' => sub { $opt_disable_debug = 1 },
58         'help'  => sub { showhelp(); },
59         'modupdate' => sub { modupdate(); },
60         'update' => sub { update(); },
61         'svnupdate' => sub { svnupdate(); },
62         'clean' => sub { clean(); },
63 );
64
65 my $non_interactive = (
66         (defined $opt_library_dir) ||
67         (defined $opt_base_dir) ||
68         (defined $opt_config_dir) ||
69         (defined $opt_module_dir) ||
70         (defined $opt_base_dir) ||
71         (defined $opt_binary_dir) ||
72         (defined $opt_nointeractive) ||
73         (defined $opt_away) ||
74         (defined $opt_gecos) ||
75         (defined $opt_kick) ||
76         (defined $opt_maxclients) ||
77         (defined $opt_modes) ||
78         (defined $opt_topic) ||
79         (defined $opt_quit) ||
80         (defined $opt_ident) ||
81         (defined $opt_cc) ||
82         (defined $opt_ipv6) ||
83         (defined $opt_ipv6links) ||
84         (defined $opt_noipv6links) ||
85         (defined $opt_kqueue) ||
86         (defined $opt_epoll) ||
87         (defined $opt_ports) ||
88         (defined $opt_maxchans) ||
89         (defined $opt_opermaxchans) ||
90         (defined $opt_chan_length) ||
91         (defined $opt_nick_length) ||
92         (defined $opt_use_openssl) ||
93         (defined $opt_nokqueue) ||
94         (defined $opt_noepoll) ||
95         (defined $opt_noports) ||
96         (defined $opt_maxbuf) ||
97         (defined $opt_use_gnutls)
98 );
99 my $interactive = !$non_interactive;
100
101
102 chomp($topdir = getcwd());
103 $this = resolve_directory($topdir);                                             # PWD, Regardless.
104 @modlist = ();                                                                  # Declare for Module List..
105 %config = ();                                                                   # Initiate Configuration Hash..
106 $config{ME}              = resolve_directory($topdir);                          # Present Working Directory
107
108 $config{BASE_DIR}          = $config{ME};
109
110 if (defined $opt_base_dir)
111 {
112         $config{BASE_DIR} = $opt_base_dir;
113 }
114
115 $config{CONFIG_DIR}      = resolve_directory($config{BASE_DIR}."/conf");        # Configuration Directory
116 $config{MODULE_DIR}      = resolve_directory($config{BASE_DIR}."/modules");     # Modules Directory
117 $config{BINARY_DIR}      = resolve_directory($config{BASE_DIR}."/bin");         # Binary Directory
118 $config{LIBRARY_DIR}    = resolve_directory($config{BASE_DIR}."/lib");          # Library Directory
119
120 if (defined $opt_config_dir)
121 {
122         $config{CONFIG_DIR} = $opt_config_dir;
123 }
124 if (defined $opt_module_dir)
125 {
126         $config{MODULE_DIR} = $opt_module_dir;
127 }
128 if (defined $opt_binary_dir)
129 {
130         $config{BINARY_DIR} = $opt_binary_dir;
131 }
132 if (defined $opt_library_dir)
133 {
134         $config{LIBRARY_DIR} = $opt_library_dir;
135 }
136 chomp($config{HAS_GNUTLS}   = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
137 chomp($config{HAS_OPENSSL}  = `pkg-config --modversion openssl 2>/dev/null`);           # Openssl version
138 chomp($gnutls_ver = $config{HAS_GNUTLS});
139 chomp($openssl_ver = $config{HAS_OPENSSL});
140 $config{USE_GNUTLS}         = "n";
141 if (defined $opt_use_gnutls)
142 {
143         $config{USE_GNUTLS} = "y";                                      # Use gnutls.
144 }
145 $config{USE_OPENSSL}    = "n";                                          # Use openssl.
146 if (defined $opt_use_openssl)
147 {
148         $config{USE_OPENSSL} = "y";
149 }
150
151 # no, let's not change these.
152 $config{OPTIMITEMP}      = "0";                                         # Default Optimisation Value
153 if (!defined $opt_disable_debug)
154 {
155         $config{OPTIMISATI}      = "-g1";                               # Optimisation Flag
156 }
157 else
158 {
159         $config{OPTIMISATI}      = "-O2";                               # DEBUGGING OFF!
160 }
161
162 $config{NICK_LENGT}      = "31";                                        # Default Nick Length
163 if (defined $opt_nick_length)
164 {
165         $config{NICK_LENGT} = $opt_nick_length;
166 }
167 $config{CHAN_LENGT}      = "64";                                        # Default Channel Name Length
168 if (defined $opt_chan_length)
169 {
170         $config{CHAN_LENGT} = $opt_chan_length;
171 }
172 $config{MAXI_MODES}      = "20";                                        # Default Max. Number of Modes set at once.
173 if (defined $opt_modes)
174 {
175         $config{MAXI_MODES} = $opt_modes;
176 }
177 $config{HAS_STRLCPY}    = "false";                                      # strlcpy Check.
178 $config{HAS_STDINT}      = "false";                                     # stdint.h check
179 $config{USE_KQUEUE}      = "y";                                         # kqueue enabled
180 if (defined $opt_kqueue)
181 {
182         $config{USE_KQUEUE} = "y";
183 }
184 if (defined $opt_nokqueue)
185 {
186         $config{USE_KQUEUE} = "n";
187 }
188 $config{USE_EPOLL}        = "y";                                        # epoll enabled
189 if (defined $opt_epoll)
190 {
191         $config{USE_EPOLL} = "y";
192 }
193 if (defined $opt_noepoll)
194 {
195         $config{USE_EPOLL} = "n";
196 }
197 $config{USE_PORTS}        = "y";                                        # epoll enabled
198 if (defined $opt_ports)
199 {
200         $config{USE_PORTS} = "y";
201 }
202 if (defined $opt_noports)
203 {
204         $config{USE_PORTS} = "n";
205 }
206 $config{IPV6}          = "n";                                           # IPv6 support (experimental)
207 if (defined $opt_ipv6)
208 {
209         $config{IPV6} = "y";
210 }
211 $config{SUPPORT_IP6LINKS}   = "y";                                      # IPv4 supporting IPv6 links (experimental)
212 if (defined $opt_ipv6links)
213 {
214         $config{SUPPORT_IP6LINKS} = "y";
215 }
216 if (defined $opt_noipv6links)
217 {
218         $config{SUPPORT_IP6LINKS} = "n";
219 }
220 chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`);                   # FD Limit
221 chomp($config{MAX_DESCRIPTORS} = `sh -c \"ulimit -n\"`);                # Hard FD Limit
222 chomp($config{GCCVER}       = `g++ -dumpversion | cut -c 1`);           # Major GCC Version
223 $config{_SOMAXCONN} = SOMAXCONN;                                        # Max connections in accept queue
224 $config{OSNAME}             = $^O;                                      # Operating System Name
225 $config{IS_DARWIN}          = "NO";                                     # Is OSX?
226 $config{STARTSCRIPT}          = "inspircd";                     # start script?
227 $config{DESTINATION}          = "BASE";                         # Is target path.
228 $config{EXTRA_DIR}          = "";                                               # Is empty.
229 if ($config{OSNAME} =~ /darwin/i)
230 {
231         $config{IS_DARWIN} = "YES";
232         $config{STARTSCRIPT}          = "org.inspircd.plist";           # start script for OSX.
233         $config{DESTINATION}          = "LAUNCHDPATH";                          # Is OSX target.
234         $config{EXTRA_DIR}            = " launchd_dir";                         # Is OSX specific path.
235 }
236 $config{CC}                 = "g++";                                            # C++ compiler
237 if (defined $opt_cc)
238 {
239         $config{CC} = $opt_cc;
240 }
241 $exec = $config{CC} . " -dumpversion | cut -c 1";
242 chomp($config{GCCVER}           = `$exec`);                             # Major GCC Version
243 $config{MAKEORDER}              = "ircd mods";                          # build order
244 $config{MAX_IDENT}              = "12";                                 # max ident size
245 $config{MAX_QUIT}               = "255";                                # max quit message size
246 $config{MAX_TOPIC}              = "307";                                # max topic size
247 $config{MAX_KICK}               = "255";                                # max kick message size
248 $config{MAX_GECOS}              = "128";                                # max GECOS size
249 $config{MAX_AWAY}               = "200";                                # max AWAY size
250 $config{MAXBUF}                 = "512";                                # Max buffer size
251 if (defined $opt_ident)
252 {
253         $config{MAX_IDENT} = $opt_ident;
254 }
255 if (defined $opt_quit)
256 {
257         $config{MAX_QUIT} = $opt_quit;
258 }
259 if (defined $opt_topic)
260 {
261         $config{MAX_TOPIC} = $opt_topic;
262 }
263 if (defined $opt_kick)
264 {
265         $config{MAX_KICK} = $opt_kick;
266 }
267 if (defined $opt_gecos)
268 {
269         $config{MAX_GECOS} = $opt_gecos;
270 }
271 if (defined $opt_away)
272 {
273         $config{MAX_AWAY} = $opt_away;
274 }
275
276 $config{HAS_OPENSSL} =~ /^([-[:digit:].]+)([a-z])?(\-[a-z][0-9])?$/;
277 $config{HAS_OPENSSL} = $1;
278
279 if ($config{GCCVER} eq "") {
280         print $config{CC} . " was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n";
281         exit;
282 }
283
284 if (!$config{MAX_CLIENT_T}) { 
285         $config{MAX_CLIENT_T} = 1024;                            # Set a reasonable 'Default'
286         $fd_scan_fail = "true";                                # Used Later
287 }
288
289 # Get and Set some important vars..
290 getmodules();
291
292 sub clean
293 {
294         system("rm -rf .config.cache");
295 }
296
297 sub update
298 {
299         eval {
300                 chomp($topdir = getcwd());
301                 $this = resolve_directory($topdir);                                          # PWD, Regardless.
302                 getmodules();
303                 # Does the cache file exist?
304                 if (!getcache()) {
305                         # No, No it doesn't.. *BASH*
306                         print "You have not run ./configure before. Please do this before trying to run the update script.\n";
307                         exit 0;
308                 } else {
309                         # We've Loaded the cache file and all our variables..
310                         print "Updating Files..\n";
311                         getosflags();
312                         if ($opt_disable_debug == 1)
313                         {
314                                 print "Disabling debug information (-g).\n";
315                                 $config{OPTIMISATI} = "";
316                                 getosflags();
317                         }
318                         $has_epoll = $config{HAS_EPOLL};
319                         $has_ports = $config{HAS_PORTS};
320                         $has_kqueue = $config{HAS_KQUEUE};
321                         writefiles(1);
322                         makecache();
323                         print "Complete.\n";
324                         exit;
325                 }
326         };
327         if ($@)
328         {
329                 print "Configure update failed: $@\n";
330         }
331         exit;
332 }
333
334 sub modupdate
335 {
336         eval {
337                 chomp($topdir = getcwd());
338                 $this = resolve_directory($topdir);                                          # PWD, Regardless.
339                 getmodules();
340                 # Does the cache file exist?
341                 if (!getcache()) {
342                         # No, No it doesn't.. *BASH*
343                         print "You have not run ./configure before. Please do this before trying to run the update script.\n";
344                         exit 0;
345                 } else {
346                         # We've Loaded the cache file and all our variables..
347                         print "Updating Files..\n";
348                         getosflags();
349                         $has_epoll = $config{HAS_EPOLL};
350                         $has_ports = $config{HAS_PORTS};
351                         $has_kqueue = $config{HAS_KQUEUE};
352                         writefiles(0);
353                         makecache();
354                         print "Complete.\n";
355                         exit;
356                 }
357         };
358         if ($@)
359         {
360                 print "Module update failed: $@\n";
361         }
362         exit;
363 }
364
365
366
367 sub svnupdate
368 {
369         my $fail = 0;
370         open(FH,"<.svn/entries") or $fail = 1;
371         if ($fail) {
372                 print "This is not an SVN copy of InspIRCd.\n";
373                 exit;
374         }
375         else
376         {
377                 close(FH);
378         }
379         system("svn update");
380         system("perl configure -update");
381         if (defined $opt_rebuild) {
382                 system("make install");
383         }
384         exit;
385 }
386
387 print "Running non-interactive configure...\n" unless $interactive;
388 print "Checking for cache from previous configure... ";
389 print ((!getcache()) ? "not found\n" : "found\n");
390 print "Checking operating system version... ";
391 print getosflags() . "\n";
392
393 if (defined $opt_maxclients)
394 {
395         $config{MAX_CLIENT} = $opt_maxclients;
396 }
397
398 if (!$config{MAX_CLIENT}) { 
399         # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
400         # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
401         # higher than the found value" :))
402         $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
403 }
404
405 printf "Checking if stdint.h exists... ";
406 $config{HAS_STDINT} = "true";
407 my $fail = 0;
408 open(STDINT, "</usr/include/stdint.h") or $config{HAS_STDINT} = "false";
409 if ($config{HAS_STDINT} eq "true") {
410         close(STDINT);
411 }
412 print "yes\n" if $config{HAS_STDINT} eq "true";
413 print "no\n" if $config{HAS_STDINT} eq "false";
414
415
416 printf "Checking if strlcpy exists... ";
417 # Perform the strlcpy() test..
418 $config{HAS_STRLCPY} = "false";
419 my $fail = 0;
420 open(STRLCPY, "</usr/include/string.h") or $fail = 1;
421 if (!$fail) {
422         while (chomp($line = <STRLCPY>)) {
423                 # try and find the delcaration of:
424                 # size_t strlcpy(...)
425                 if ($line =~ /size_t(\0x9|\s)+strlcpy/) {
426                         $config{HAS_STRLCPY} = "true";
427                 }
428         }
429         close(STRLCPY);
430 }
431 print "yes\n" if $config{HAS_STRLCPY} eq "true";
432 print "no\n" if $config{HAS_STRLCPY} eq "false";
433
434
435 printf "Checking if kqueue exists... ";
436 $has_kqueue = 0;
437 $fail = 0;
438 open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
439 if (!$fail) {
440         while (chomp($line = <KQUEUE>)) {
441                 # try and find the delcaration of:
442                 # int kqueue(void);
443                 if ($line =~ /int(\0x9|\s)+kqueue/) {
444                         $has_kqueue = 1;
445                 }
446         }
447         close(KQUEUE);
448 }
449 print "yes\n" if $has_kqueue == 1;
450 print "no\n" if $has_kqueue == 0;
451
452 printf "Checking if epoll exists... ";
453 $has_epoll = 0;
454 $fail = 0;
455 open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
456 if (!$fail) {
457         $has_epoll = 1;
458         close(EPOLL);
459 }
460 if ($has_epoll) {
461         my $kernel = `uname -r`;
462         chomp($kernel);
463         if (($kernel =~ /^2\.0\./) || ($kernel =~ /^2\.2\./) || ($kernel =~ /^2\.4\./)) {
464                 $has_epoll = 0;
465         }
466         else
467         {
468                 # Suggestion from nenolod, weed out odd systems which have glibc built
469                 # against 2.4 kernels (ick)
470
471                 $libcv = 0.0;
472                 $kernelv = 0.0;
473                 open (FH,"/lib/libc.so.6|") or $has_epoll = 0;
474                 if ($has_epoll)
475                 {
476                         while (chomp($line = <FH>))
477                         {
478                                 if ($line =~ /GNU C Library .* version (.*?) /)
479                                 {
480                                         $libcv = $1;
481                                         $libcv =~  /([0-9\.\-])+/;
482                                         $libcv = $1;
483                                 }
484                                 elsif ($line =~ /Compiled on a Linux (.*?\..*?)\.* system/)
485                                 {
486                                         $kernelv = $1;
487                                         # Fix for some retarded libc builds, strip off >> and << etc.
488                                         $kernelv =~ /([0-9\.\-])+/;
489                                         $kernelv = $1;
490                                 }
491                         }
492                         close FH;
493                         if ($libcv < 2.3)
494                         {
495                                 $has_epoll = 0;
496                                 printf "libc too old: $libcv... ";
497                         }
498                         if ($kernelv < 2.6)
499                         {
500                                 $has_epoll = 0;
501                                 printf "libc built against older kernel $kernelv... ";
502                         }
503                 }
504         }
505 }
506 print "yes\n" if $has_epoll == 1;
507 print "no\n" if $has_epoll == 0;
508
509 printf "Checking if Solaris I/O completion ports are available... ";
510 $has_ports = 0;
511 my $system = `uname -s`;
512 chomp ($system);
513 $has_ports = 1 if ($system eq "SunOS");
514
515 if ($has_ports) {
516         my $kernel = `uname -r`;
517         chomp($kernel);
518         if (($kernel !~ /^5\.1./)) {
519                 $has_ports = 0;
520         }
521 }
522 print "yes\n" if $has_ports == 1;
523 print "no\n" if $has_ports == 0;
524
525 $config{HAS_EPOLL} = $has_epoll;
526 $config{HAS_KQUEUE} = $has_kqueue; 
527
528 printf "Checking for libgnutls... ";
529 if (($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS} >= 1.2) || ($config{HAS_GNUTLS} eq "y"))) {
530         print "yes\n";
531         $config{HAS_GNUTLS} = "y";
532 } else {
533         print "no\n";
534         $config{HAS_GNUTLS} = "n";
535 }
536
537 printf "Checking for openssl... ";
538 if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPENSSL} eq "y"))) {
539         print "yes\n";
540         $config{HAS_OPENSSL} = "y";
541 } else {
542         print "no\n";
543         $config{HAS_OPENSSL} = "n";
544 }
545
546 ################################################################################
547 #                         BEGIN INTERACTIVE PART                              #
548 ################################################################################
549
550 # Clear the Screen..
551 if ($interactive)
552 {
553         system("clear");
554         $wholeos = $^O;
555
556         my $rev = getrevision();
557         # Display Introduction Message..
558         print "
559 Welcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)
560 \033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m
561
562 *** If you are unsure of any of these values, leave it blank for    ***
563 *** standard settings that will work, and your server will run      ***
564 *** using them. Please consult your IRC network admin if in doubt.  ***
565
566 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
567 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
568 dir, otherwise you won't have a config file!
569
570 Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos)
571 Maximum file descriptors: \033[1;32m$config{MAX_CLIENT_T}\033[0m
572 Your InspIRCd revision ID is \033[1;32mr$rev\033[0m";
573         if ($rev eq "r0") {
574                 print " (Non-SVN build)";
575         }
576         print ".\n\n";
577
578         $config{CHANGE_COMPILER} = "n";
579         print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
580
581         while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
582                 print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
583 should NOT be used. You should probably specify a newer compiler.\n\n";
584                 yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
585                 if ($config{CHANGE_COMPILER} =~ /y/i) {
586                         print "What command do you want to use to invoke your compiler?\n";
587                         print "[\033[1;32m$config{CC}\033[0m] -> ";
588                         chomp($config{CC} = <STDIN>);
589                         if ($config{CC} eq "") {
590                                 $config{CC} = "g++";
591                         }
592                         chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
593                         if ($foo ne "") {
594                                 chomp($config{GCCVER}       = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change compilers
595                                 print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
596                                 if ($config{GCCVER} < 3) {
597                                         print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n";
598                                 }
599                         }
600                         else {
601                                 print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
602                         }
603                 }
604         }
605
606         print "\n";
607
608         # Directory Settings..
609         my $tmpbase = $config{BASE_DIR};
610         dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
611         if ($tmpbase ne $config{BASE_DIR}) {
612                 $config{CONFIG_DIR}      = resolve_directory($config{BASE_DIR}."/conf");           # Configuration Dir
613                 $config{MODULE_DIR}      = resolve_directory($config{BASE_DIR}."/modules");     # Modules Directory
614                 $config{BINARY_DIR}      = resolve_directory($config{BASE_DIR}."/bin");     # Binary Directory
615                 $config{LIBRARY_DIR}    = resolve_directory($config{BASE_DIR}."/lib");      # Library Directory
616         }
617
618         dir_check("are the configuration files", "CONFIG_DIR");
619         dir_check("are the modules to be compiled to", "MODULE_DIR");
620         dir_check("is the IRCd binary to be placed", "BINARY_DIR");
621         dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
622
623         if ($has_kqueue) {
624                 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?");
625                 print "\n";
626         }
627         if ($has_epoll) {
628                 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?");
629                 print "\n";
630         }
631         if ($has_ports) {
632                 yesno(USE_PORTS,"You are running Solaris 10.\nWould you like to enable I/O completion ports support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable support for I/O completion ports?");
633                 print "\n";
634         }
635         $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y") || ($config{USE_PORTS} eq "y"));
636         if (!$chose_hiperf) {
637                 print "No high-performance socket engines are available, or you chose\n";
638                 print "not to enable one. Defaulting to select() engine.\n\n";
639         }
640
641         yesno(IPV6,"Would you like to build InspIRCd with IPv6 support?");
642         print "\n";
643
644         if ($config{IPV6} eq "y") {
645                 print "You have chosen to build an \033[1;32mIPV6-enabled\033[0m server.\nTo accept IPV4 users, you can still use IPV4 addresses\nin your port bindings..\n\n";
646                 $config{SUPPORT_IP6LINKS} = "y";
647         } else {
648                 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?\nIf you are using a recent operating\nsystem and are unsure, answer yes.\nIf you answer 'no' here, your InspIRCd server will be unable\nto parse IPV6 addresses (e.g. for CIDR bans)");
649                 print "\n";
650         }
651
652         if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
653                 print "I have detected both \033[1;32mGnuTLS\033[0m and \033[1;32mOpenSSL\033[0m on your system.\n";
654                 print "I will default to GnuTLS. If you wish to use OpenSSL\n";
655                 print "instead, you should enable the OpenSSL module yourself\n";
656                 print "by copying it from src/modules/extra to src/modules.\n\n";
657                 print "Detected GnuTLS version: \033[1;32m" . $gnutls_ver . "\033[0m\n";
658                 print "Detected OpenSSL version: \033[1;32m" . $openssl_ver . "\033[0m\n\n";
659         }
660
661         if ($config{HAS_GNUTLS} eq "y") {
662                 yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
663                 if ($config{USE_GNUTLS} eq "y") {
664                         print "\nUsing GnuTLS SSL module.\n";
665                 }
666         } elsif ($config{HAS_OPENSSL} eq "y") {
667                         yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
668         if ($config{USE_OPENSSL} eq "y") {
669                         print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
670                 }
671         }
672         else {
673                 print "\nCould not detect OpenSSL or GnuTLS. Make sure pkg-config is installed if\nyou intend to use OpenSSL, or that GnuTLS is in your path if you intend\nto use GnuTLS.\n\n";
674         }
675
676         print "\nThe following questions will ask you for various figures relating\n";
677         print "To your IRCd install. Please note that these should usually be left\n";
678         print "as defaults unless you have a real reason to change them. If they\n";
679         print "changed, then the values must be identical on all servers on your\n";
680         print "network, or malfunctions and/or crashes may occur, with the exception\n";
681         print "of the 'maximum number of clients' setting which may be different on\n";
682         print "different servers on the network.\n\n";
683
684         # File Descriptor Settings..
685         promptnumeric("number of clients at any one time", "MAX_CLIENT_T");
686         $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
687         $config{MAX_DESCRIPTORS} = $config{MAX_CLIENT_T};
688
689         promptnumeric("length of nicknames", "NICK_LENGT");
690         promptnumeric("length of channel names", "CHAN_LENGT");
691         promptnumeric("number of mode changes in one line", "MAXI_MODES");
692         promptnumeric("length of an ident (username)", "MAX_IDENT");
693         promptnumeric("length of a quit message", "MAX_QUIT");
694         promptnumeric("length of a channel topic", "MAX_TOPIC");
695         promptnumeric("length of a kick message", "MAX_KICK");
696         promptnumeric("length of a GECOS (real name)", "MAX_GECOS");
697         promptnumeric("length of an away message", "MAX_AWAY");
698 }
699
700 dumphash();
701
702 if (($config{USE_GNUTLS} eq "y") && ($config{HAS_GNUTLS} ne "y"))
703 {
704         print "Sorry, but i couldn't detect gnutls. Make sure gnutls-config is in your path.\n";
705         exit(0);
706 }
707 if (($config{USE_OPENSSL} eq "y") && ($config{HAS_OPENSSL} ne "y"))
708 {
709         print "Sorry, but i couldn't detect openssl. Make sure openssl is in your path.\n";
710         exit(0);
711 }
712
713 if ($config{USE_GNUTLS} eq "y") {
714         $failed = 0;
715         open(TMP, "<src/modules/m_ssl_gnutls.cpp") or $failed = 1;
716         close(TMP);
717         if ($failed) {
718                 print "Symlinking src/modules/m_ssl_gnutls.cpp from extra/\n";
719                 chdir("src/modules");
720                 system("ln -s extra/m_ssl_gnutls.cpp");
721                 chdir("../..");
722         }
723         getmodules();
724         if ($interactive)
725         {
726                 $failed = 0;
727                 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
728                 close(TMP);
729                 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
730                 close(TMP);
731                 if ($failed) {
732                         print "SSL Certificates Not found, Generating.. \n\n
733 *************************************************************
734 * Generating the Private Key may take some time, go grab a  *
735 * Coffee. Even better, to generate some more entropy if it  *
736 * is taking a while, open another console and type du / a   *
737 * few times and get that HD going :) Then answer the        *
738 * Questions which follow. If you are unsure, just hit enter *
739 *************************************************************\n\n";
740                         $failed = make_gnutls_cert();
741                         if ($failed) {
742                                 print "\n\033[1;32mCertificate generation failed!\033[0m\n\n";
743                         } else {
744                                 print "\nCertificate generation complete, copying to config directory... ";
745                                 system("mv key.pem $config{CONFIG_DIR}/key.pem");
746                                 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
747                                 print "Done.\n\n";
748                         }
749                 }
750                 else {
751                         print "SSL Certificates found, skipping.\n\n";
752                 }
753         }
754         else
755         {
756                 print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
757         }
758 } elsif ($config{USE_OPENSSL} eq "y") {
759         $failed = 0;
760         open(TMP, "<src/modules/m_ssl_openssl.cpp") or $failed = 1;
761         close(TMP);
762         if ($failed) {
763                 print "Symlinking src/modules/m_ssl_openssl.cpp from extra/\n";
764                 chdir("src/modules");
765                 system("ln -s extra/m_ssl_openssl.cpp");
766                 chdir("../..");
767         }
768         getmodules();
769         $failed = 0;
770         if ($interactive)
771         {
772                 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
773                 close(TMP);
774                 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
775                 close(TMP);
776                 if ($failed) {
777                         print "SSL Certificates Not found, Generating.. \n\n
778 *************************************************************
779 * Generating the certificates may take some time, go grab a *
780 * coffee, or something.                                     *
781 *************************************************************\n\n";
782                         make_openssl_cert();
783                         print "\nCertificate generation complete, copying to config directory... ";
784                         system("mv key.pem $config{CONFIG_DIR}/key.pem");
785                         system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
786                         system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
787                         print "Done.\n\n";
788                 } else {
789                         print "SSL Certificates found, skipping.\n\n"
790                 }
791         }
792         else
793         {
794                 print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
795         }
796 }
797 if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
798         print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
799 }
800
801 getosflags();
802 writefiles(1);
803 makecache();
804
805 print "\n\n";
806 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
807 if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
808         print "Please remember that to enable \033[1;32mSSL support\033[0m you must\n";
809         print "load the required modules in your config. This configure process\n";
810         print "has just prepared these modules to be compiled for you, and has not\n";
811         print "configured them to be compiled into the core of the ircd.\n";
812 }
813 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
814 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
815         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";
816 }
817
818 if ($config{GCCVER} < "3") {
819         print <<FOO2;
820 \033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
821 GCC 2.x series compilers only had partial (read as broken) C++ support, and
822 your compile will most likely fail horribly! If you have any problems, do NOT
823 report them to the bugtracker or forums without first upgrading your compiler
824 to a newer 3.x or 4.x (or whatever is available currently) version.
825 FOO2
826 }
827
828 ################################################################################
829 #                             HELPER FUNCTIONS                          #
830 ################################################################################
831 sub getcache {
832         # Retrieves the .config.cache file, and loads values into the main config hash.
833         open(CACHE, ".config.cache") or return 0;
834         while (<CACHE>) {
835                 chomp;
836                 # Ignore Blank lines, and comments..
837                 next if /^\s*$/;
838                 next if /^\s*#/;
839                 my ($key, $value) = split("=", $_, 2);
840                 $value =~ /^\"(.*)\"$/;
841                 # Do something with data here!
842                 $config{$key} = $1;
843         }
844         close(CONFIG);
845         return 1;
846 }
847
848 sub makecache {
849         # Dump the contents of %config
850         print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
851         open(FILEHANDLE, ">.config.cache");
852         foreach $key (keys %config) {
853                 print FILEHANDLE "$key=\"$config{$key}\"\n";
854         }
855         close(FILEHANDLE);
856 }
857
858 sub dir_check {
859         my ($desc, $hash_key) = @_;
860         my $complete = 0;
861         while (!$complete) {
862                 print "In what directory $desc?\n";
863                 print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
864                 chomp($var = <STDIN>);
865                 if ($var eq "") {
866                         $var = $config{$hash_key};
867                 }
868                 if ($var =~ /^\~\/(.+)$/) {
869                         # Convert it to a full path..
870                         $var = resolve_directory($ENV{HOME} . "/" . $1);
871                 }
872                 elsif ((($config{OSNAME} =~ /MINGW32/i) and ($var !~ /^[A-Z]{1}:\\.*/)) and (substr($var,0,1) ne "/"))
873                 {
874                         # Assume relative Path was given.. fill in the rest.
875                         $var = $this . "/$var";
876                 }
877                 
878                 $var = resolve_directory($var); 
879                 if (! -e $var) {
880                         print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
881                         chomp($tmp = <STDIN>);
882                         if (($tmp eq "") || ($tmp =~ /^y/i)) {
883                                 # Attempt to Create the Dir..
884                                 
885                                 system("mkdir -p \"$var\" >> /dev/null 2>&1");
886                                 $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
887                                 if ($chk != 0) {
888                                         print "Unable to create directory. ($var)\n\n";
889                                         # Restart Loop..
890                                         next;
891                                 }
892                         } else {
893                                 # They said they don't want to create, and we can't install there.
894                                 print "\n\n";
895                                 next;
896                         }
897                 } else {
898                         if (!is_dir($var)) {
899                                 # Target exists, but is not a directory.
900                                 print "File $var exists, but is not a directory.\n\n";
901                                 next;
902                         }
903                 }
904                 # Either Dir Exists, or was created fine.
905                 $config{$hash_key} = $var;
906                 $complete = 1;
907                 print "\n";
908         }
909 }
910
911 sub getosflags {
912
913         $config{LDLIBS} = "-lstdc++";
914         $config{FLAGS}  = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual -Wno-deprecated $config{OPTIMISATI}";
915         $config{DEVELOPER} = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual -Wno-deprecated -g";
916         $SHARED = "-Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared";
917         $config{MAKEPROG} = "make";
918
919         if ($config{OSNAME} =~ /darwin/i) {
920                 $config{FLAGS}  = "-DDARWIN -frtti -fPIC -Wall -Woverloaded-virtual -Wno-deprecated $config{OPTIMISATI}";
921                 $SHARED = "-bundle -twolevel_namespace -undefined dynamic_lookup";
922                 $config{LDLIBS} = "-ldl -lstdc++";
923         }
924
925         if ($config{OSNAME} =~ /OpenBSD/i) {
926                 $config{MAKEPROG} = "gmake";
927                 chomp($foo = `eg++ -dumpversion | cut -c 1`);
928                 # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
929                 # if theyre not running this, configure lets the build continue but they probably wont manage to
930                 # compile as this standard version is 2.95.3!
931                 if ($foo ne "") {
932                         $config{CC} = "eg++";
933                         chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change the compiler path
934                 }
935                 return "OpenBSD";
936         }
937
938         if ($config{OSNAME} =~ /Linux/i) {
939                 $config{LDLIBS} = "-ldl -lstdc++";
940                 $config{FLAGS}  = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual -Wno-deprecated $config{OPTIMISATI}";
941                 $config{FLAGS}  .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
942                 $config{LDLIBS} .= " " . $ENV{LDLIBS} if exists($ENV{LDLIBS});
943                 $config{MAKEPROG} = "make";
944         }
945
946         if ($config{OSNAME} =~ /FreeBSD/i) {
947                 $config{FLAGS}  .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
948                 $config{LDLIBS} .= " " . $ENV{LDLIBS} if exists($ENV{LDLIBS});
949         }
950
951         if ($config{OSNAME} =~ /SunOS/i or $config{OSNAME} =~ /solaris/i)
952         {
953                 # solaris/sunos needs these
954                 # socket = bsd sockets api
955                 # nsl = dns stuff
956                 # rt = POSIX realtime extensions
957                 # resolv = inet_aton only (why isnt this in nsl?!)
958                 $config{MAKEPROG} = "gmake";
959                 $config{LDLIBS} .= " -lsocket -lnsl -lrt -lresolv";
960                 return "Solaris";
961         }
962         
963         if($config{OSNAME} =~ /MINGW32/i)
964         {
965                 # All code is position-independent on windows
966                 $config{FLAGS} =~ s/-fPIC //;
967                 return "MinGW";
968         }
969
970         return $config{OSNAME};
971 }
972
973 sub writefiles {
974         my($writeheader) = @_;
975         # First File.. inspircd_config.h
976         chomp(my $incos = `uname -n -s -r`);
977         chomp($version = `sh src/version.sh`);
978         chomp(my $revision2 = getrevision());
979         if ($writeheader == 1)
980         {
981                 print "Writing \033[1;32minspircd_config.h\033[0m\n";
982                 open(FILEHANDLE, ">include/inspircd_config.h");
983                 my $NL = $config{NICK_LENGT}+1;
984                 my $CL = $config{CHAN_LENGT}+1;
985                 print FILEHANDLE <<EOF;
986 /* Auto generated by configure, do not modify! */
987 #ifndef __CONFIGURATION_AUTO__
988 #define __CONFIGURATION_AUTO__
989
990 /* this is for windows support. */
991 #define CoreExport /**/
992 #define DllExport /**/
993
994 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
995 #define MOD_PATH "$config{MODULE_DIR}"
996 #define VERSION "$version"
997 #define REVISION "$revision2"
998 #define MAXCLIENTS $config{MAX_CLIENT}
999 #define MAXCLIENTS_S "$config{MAX_CLIENT}"
1000 #define SOMAXCONN_S "$config{_SOMAXCONN}"
1001 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
1002 #define NICKMAX $NL
1003 #define CHANMAX $CL
1004 #define MAXMODES $config{MAXI_MODES}
1005 #define IDENTMAX $config{MAX_IDENT}
1006 #define MAXQUIT $config{MAX_QUIT}
1007 #define MAXTOPIC $config{MAX_TOPIC}
1008 #define MAXKICK $config{MAX_KICK}
1009 #define MAXGECOS $config{MAX_GECOS}
1010 #define MAXAWAY $config{MAX_AWAY}
1011 #define OPTIMISATION $config{OPTIMITEMP}
1012 #define LIBRARYDIR "$config{LIBRARY_DIR}"
1013 #define SYSTEM "$incos"
1014 EOF
1015 print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\n";
1016
1017                 if ($config{OSNAME} =~ /SunOS/i) {
1018                         print FILEHANDLE "#define IS_SOLARIS\n";
1019                 }
1020                 if ($config{OSNAME} =~ /MINGW32/i) {
1021                         print FILEHANDLE "#define IS_MINGW\n";
1022                 }
1023                 if ($config{GCCVER} >= 3) {
1024                         print FILEHANDLE "#define GCC3\n";
1025                 }
1026                 if ($config{HAS_STRLCPY} eq "true") {
1027                         print FILEHANDLE "#define HAS_STRLCPY\n";
1028                 }
1029                 if ($config{HAS_STDINT} eq "true") {
1030                         print FILEHANDLE "#define HAS_STDINT\n";
1031                 }
1032                 if ($config{IPV6} =~ /y/i) {
1033                         print FILEHANDLE "#define IPV6\n";
1034                 }
1035                 if ($config{SUPPORT_IP6LINKS} =~ /y/i) {
1036                         print FILEHANDLE "#define SUPPORT_IP6LINKS\n";
1037                 }
1038                 my $use_hiperf = 0;
1039                 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1040                         print FILEHANDLE "#define USE_KQUEUE\n";
1041                         $se = "socketengine_kqueue";
1042                         $use_hiperf = 1;
1043                 }
1044                 if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1045                         print FILEHANDLE "#define USE_EPOLL\n";
1046                         $se = "socketengine_epoll";
1047                         $use_hiperf = 1;
1048                 }
1049                 if (($has_ports) && ($config{USE_PORTS} eq "y")) {
1050                         print FILEHANDLE "#define USE_PORTS\n";
1051                         $se = "socketengine_ports";
1052                         $use_hiperf = 1;
1053                 }
1054                 # user didn't choose either epoll or select for their OS.
1055                 # default them to USE_SELECT (ewwy puke puke)
1056                 if (!$use_hiperf) {
1057                         print FILEHANDLE "#define USE_SELECT\n";
1058                         $se = "socketengine_select";
1059                 }
1060                 print FILEHANDLE "\n#endif\n";
1061                 close(FILEHANDLE);
1062         }
1063
1064         if ($writeheader)
1065         {
1066                 open(FILEHANDLE, ">include/inspircd_se_config.h");
1067                 print FILEHANDLE <<EOF;
1068 /* Auto generated by configure, do not modify or commit to svn! */
1069 #ifndef __CONFIGURATION_SOCKETENGINE__
1070 #define __CONFIGURATION_SOCKETENGINE__
1071
1072 #include "$se.h"
1073
1074 #endif
1075 EOF
1076                 close(FILEHANDLE);
1077         }
1078
1079
1080         # Create a Modules List..
1081         my $modules = "";
1082         foreach $i (@modlist)
1083         {
1084                 $modules .= "m_".$i.".so ";
1085         }
1086         chomp($modules);   # Remove Redundant whitespace..
1087
1088         opendir(DIRHANDLE, "src/modules");
1089         foreach $name (sort readdir(DIRHANDLE)) {
1090                 if ($name =~ /^m_(.+?)$/) {
1091                         if (opendir(MDIRHANDLE, "src/modules/$name") != 0) {
1092                                 closedir(MDIRHANDLE);
1093                                 $modules .= "$name.so ";
1094                         }
1095                 }
1096         }
1097         closedir(DIRHANDLE);
1098
1099
1100         # Write all .in files.
1101         my $tmp = "";
1102         my $file = "";
1103         my $exe = "inspircd";
1104
1105         opendir(DIRHANDLE, $this);
1106
1107         # Do this once here, and cache it in the .*.inc files,
1108         # rather than attempting to read src/version.sh from
1109         # compiled code -- we might not have the source to hand.
1110         # Fix for bug#177 by Brain.
1111
1112         chomp(my $version = `sh ./src/version.sh`);
1113         chomp(my $revision = getrevision());
1114         $version = "$version(r$revision)";
1115
1116         my $LIBEXT = "so";
1117         if ($config{IS_DARWIN} eq "YES")
1118         {
1119                 $LIBEXT = "dylib";
1120         }
1121         # We can actually parse any file starting with . and ending with .inc,
1122         # but right now we only parse .inspircd.inc to form './inspircd'
1123
1124         foreach $name (sort readdir(DIRHANDLE)) {
1125                 if ($name =~ /^\.(.+)\.inc$/) {
1126                         $file = $1;
1127
1128                         # Bug #353, omit this on non-darwin
1129                         next if (($config{OSNAME} !~ /darwin/) && ($file eq "org.inspircd.plist"));
1130
1131                         # All .name.inc files need parsing!
1132                         $tmp = "";
1133                         open(FILEHANDLE, ".$file.inc");
1134                         while (<FILEHANDLE>) {
1135                                 $tmp .= $_;
1136                         }
1137                         close(FILEHANDLE);
1138
1139                         $tmp =~ s/\@CC\@/$config{CC}/;
1140                         $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
1141                         $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
1142                         $tmp =~ s/\@DEVELOPER\@/$config{DEVELOPER}/;
1143                         $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
1144                         $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
1145                         $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
1146                         $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
1147                         $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
1148                         $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
1149                         $tmp =~ s/\@LIBRARY_EXT\@/$LIBEXT/;
1150                         $tmp =~ s/\@MODULES\@/$modules/;
1151                         $tmp =~ s/\@STARTSCRIPT\@/$config{STARTSCRIPT}/;
1152                         $tmp =~ s/\@DESTINATION\@/$config{DESTINATION}/;
1153                         $tmp =~ s/\@EXTRA_DIR\@/$config{EXTRA_DIR}/;
1154                         $tmp =~ s/\@EXECUTABLE\@/$exe/;
1155                         $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
1156                         $tmp =~ s/\@VERSION\@/$version/;
1157
1158                         print "Writing \033[1;32m$file\033[0m\n";
1159                         open(FILEHANDLE, ">$file");
1160                         print FILEHANDLE $tmp;
1161                 }
1162         }
1163         closedir(DIRHANDLE);
1164
1165         # Make inspircd executable!
1166         chmod 0744, 'inspircd';
1167
1168         print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
1169         write_dynamic_makefile();
1170         write_dynamic_modules_makefile();
1171 }
1172
1173 sub write_dynamic_modules_makefile {
1174         # Modules Makefile..
1175         print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1176         open(FILEHANDLE, ">src/modules/Makefile");
1177
1178 ###
1179 # Module Makefile Header
1180 ###
1181         print FILEHANDLE <<EOF;
1182 ###################################################
1183 # Copyright 2002-2007 The InspIRCd Development Team
1184 #  http://www.inspircd.org/wiki/index.php/Credits
1185 #
1186 # Thanks to Andrew Church <achurch\@achurch.org>
1187 #   for assisting with making this work right.
1188 #
1189 # Automatically Generated by ./configure to add a
1190 #  modules please run ./configure -modupdate
1191 ###################################################
1192
1193 all: \$(MODULES)
1194
1195 EOF
1196         ###
1197         # End Module Makefile Header
1198         ###
1199
1200         # Create a Modules List..
1201         my $modules = "";
1202         my $cmflags = "";
1203         my $liflags = "";
1204         my $crud = "";
1205
1206         foreach $i (@modlist) {
1207                 ###
1208                 # Write Entry to the MakeFile
1209                 ###
1210                 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1211                 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1212                 $deps = getdependencies("src/modules/m_".$i.".cpp");
1213         
1214                 #print "file: $i: cmflags=$cmflags; liflags=$liflags; deps=$deps\n";
1215         
1216                 print FILEHANDLE <<EOCHEESE;
1217 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
1218         \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
1219 EOCHEESE
1220
1221 if ($config{OSNAME} =~ /darwin/) {
1222                 print FILEHANDLE <<EOCHEESE;
1223         \$(CC) -pipe -twolevel_namespace -undefined dynamic_lookup \$(FLAGS) -bundle $liflags -o m_$i.so m_$i.o
1224
1225 EOCHEESE
1226 } else {
1227                 print FILEHANDLE <<EOCHEESE;
1228         \$(CC) -pipe \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o
1229
1230 EOCHEESE
1231 }
1232                 $crud = $crud . "       install -m \$(INSTMODE) m_$i.so \$(MODPATH)\n";
1233 ###
1234                 # End Write Entry to the MakeFile
1235                 ###
1236         }
1237
1238         opendir(DIRHANDLE, "src/modules");
1239         foreach $name (sort readdir(DIRHANDLE)) {
1240                 if ($name =~ /^m_(.+?)$/) {
1241                         $crapola = "";
1242                         $crap3 = "";
1243                         $mliflags = "";
1244                         # A module made of multiple files, in a dir, e.g. src/modules/m_spanningtree/
1245                         if (opendir(MDIRHANDLE, "src/modules/$name") != 0) {
1246                                 my $i = 0;
1247                                 print FILEHANDLE "$name.so: ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h"; 
1248                                 foreach $fname (sort readdir(MDIRHANDLE)) {
1249                                         if ($fname =~ /\.cpp$/) {
1250                                                 $cmflags = getcompilerflags("src/modules/$name/$fname");
1251                                                 $mliflags = $mliflags . " " . getlinkerflags("src/modules/$name/$fname");
1252                                                 $deps = getdependencies("src/modules/$name/$fname");
1253                                                 $oname = $fname;
1254                                                 $oname =~ s/\.cpp$/.o/g;
1255                                                 print FILEHANDLE " $name/$oname";
1256                                                 $crapola = $crapola .  "$name/$oname: $name/$fname ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h $deps\n";
1257                                                 $crapola = $crapola .  "        \$(CC) -pipe -I../../include -I. \$(FLAGS) $cmflags -export-dynamic -o $name/$oname -c $name/$fname\n\n";
1258                                                 $crap3 = $crap3 . " $name/$oname";
1259                                                 $i++;
1260                                         }
1261                                 }
1262                                 print "Composing Makefile rules for directory \033[1;32m$name\033[0m... (\033[1;32m$i files found\033[0m)\n";
1263                                 if ($config{IS_DARWIN} eq "YES") {
1264                                         print FILEHANDLE "\n    \$(CC) -pipe -twolevel_namespace -undefined dynamic_lookup \$(FLAGS) -bundle -o $name.so $crap3\n"; 
1265                                 } else {
1266                                         print FILEHANDLE "\n    \$(CC) -pipe \$(FLAGS) -shared $mliflags -o $name.so $crap3\n";
1267                                 }
1268                                 print FILEHANDLE "\n$crapola\n";
1269                                 closedir(MDIRHANDLE);
1270                                 $crud = $crud . "       install -m \$(INSTMODE) $name.so \$(MODPATH)\n";
1271                         }
1272                 }
1273         }
1274         closedir(DIRHANDLE);
1275
1276         print FILEHANDLE "modinst:\n    \@echo \"Installing modules...\"\n" . $crud;
1277 }
1278
1279 sub write_dynamic_makefile {
1280
1281         my $i = 0;
1282         my @cmdlist = ();
1283         opendir(DIRHANDLE, "src");
1284         foreach $name (sort readdir(DIRHANDLE)) {
1285                 if ($name =~ /^cmd_(.+)\.cpp$/) {
1286                         $cmdlist[$i++] = $1;
1287                 }
1288         }
1289         closedir(DIRHANDLE);
1290
1291         my $cmdobjs = "";
1292         my $srcobjs = "";
1293         foreach my $cmd (@cmdlist) {
1294                 $cmdobjs = $cmdobjs . "cmd_$cmd.so ";
1295                 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1296         }
1297
1298         $se = "socketengine_select";
1299         if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1300                 $se = "socketengine_kqueue";
1301         }
1302         elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1303                 $se = "socketengine_epoll";
1304         }
1305         elsif (($has_ports) && ($config{USE_PORTS} eq "y")) {
1306                 $se = "socketengine_ports";
1307         }
1308
1309         open(FH,">src/Makefile") or die("Could not write src/Makefile");
1310         print FH <<EOM;
1311 ###################################################
1312 # Copyright 2002-2007 The InspIRCd Development Team
1313 #  http://www.inspircd.org/wiki/index.php/Credits
1314 #
1315 # Thanks to Andrew Church <achurch\@achurch.org>
1316 #  for assisting with making this work right.
1317 #
1318 # This file is automagically generated by configure 
1319 # Any changes made will be lost on ./configure         
1320 ###################################################
1321
1322 CC = im a cheezeball
1323
1324 CXXFLAGS = -I../include \${FLAGS}
1325 CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
1326 RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
1327
1328 EOM
1329
1330 if ($config{IS_DARWIN} eq "YES") {
1331         print FH <<EOM;
1332 all: libIRCDtimer.dylib libIRCDcull_list.dylib libIRCDuserprocess.dylib libIRCDsocketengine.dylib libIRCDsocket.dylib libIRCDhash.dylib libIRCDchannels.dylib libIRCDmode.dylib libIRCDxline.dylib libIRCDstring.dylib libIRCDasyncdns.dylib libIRCDbase.dylib libIRCDconfigreader.dylib libIRCDinspsocket.dylib libIRCDcommands.dylib libIRCDdynamic.dylib libIRCDusers.dylib libIRCDmodules.dylib libIRCDwildcard.dylib libIRCDhelper.dylib libIRCDcommand_parse.dylib libIRCDsnomasks.dylib libIRCDserver.dylib libIRCDfilelogger.dylib inspircd
1333
1334 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 $cmdobjs libIRCDtimer.dylib libIRCDcull_list.dylib libIRCDuserprocess.dylib libIRCDsocketengine.dylib libIRCDsocket.dylib libIRCDhash.dylib libIRCDchannels.dylib libIRCDmode.dylib libIRCDxline.dylib libIRCDstring.dylib libIRCDasyncdns.dylib libIRCDbase.dylib libIRCDconfigreader.dylib libIRCDinspsocket.dylib libIRCDsnomasks.dylib libIRCDcommands.dylib libIRCDdynamic.dylib libIRCDusers.dylib libIRCDmodules.dylib libIRCDwildcard.dylib libIRCDhelper.dylib libIRCDcommand_parse.dylib libIRCDserver.dylib libIRCDfilelogger.dylib
1335         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd.cpp
1336         \$(CC) -pipe -dynamic -bind_at_load -L. -o inspircd \$(LDLIBS) inspircd.o libIRCDchannels.dylib libIRCDmode.dylib libIRCDxline.dylib libIRCDstring.dylib libIRCDasyncdns.dylib libIRCDbase.dylib libIRCDconfigreader.dylib libIRCDinspsocket.dylib libIRCDcommands.dylib libIRCDdynamic.dylib libIRCDusers.dylib libIRCDmodules.dylib libIRCDwildcard.dylib libIRCDhelper.dylib libIRCDhash.dylib libIRCDsocket.dylib libIRCDsocketengine.dylib libIRCDuserprocess.dylib libIRCDcull_list.dylib libIRCDcommand_parse.dylib libIRCDtimer.dylib libIRCDsnomasks.dylib libIRCDserver.dylib libIRCDfilelogger.dylib
1337
1338 libIRCDsocketengine.dylib: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1339         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1340         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c $se.cpp
1341         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDsocketengine.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDsocketengine.dylib socketengine.o $se.o
1342
1343 libIRCDsnomasks.dylib: snomasks.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/channels.h
1344         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1345         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDsnomasks.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDsnomasks.dylib snomasks.o
1346
1347 libIRCDcommand_parse.dylib: command_parse.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1348         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1349         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDcommand_parse.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDcommand_parse.dylib command_parse.o
1350
1351 libIRCDcull_list.dylib: cull_list.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/users.h ../include/channels.h
1352         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1353         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDcull_list.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDcull_list.dylib cull_list.o
1354
1355 libIRCDuserprocess.dylib: 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
1357         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDuserprocess.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDuserprocess.dylib userprocess.o
1358
1359 libIRCDhash.dylib: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1360         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1361         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDhash.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDhash.dylib hashcomp.o
1362
1363 libIRCDhelper.dylib: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1364         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1365         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDhelper.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDhelper.dylib helperfuncs.o
1366
1367 libIRCDchannels.dylib: 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
1369         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDchannels.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDchannels.dylib channels.o
1370
1371 libIRCDmode.dylib: 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)
1372         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1373         \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
1374         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDmode.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDmode.dylib mode.o modes/modeclasses.a
1375
1376 libIRCDxline.dylib: 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
1377         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1378         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDxline.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDxline.dylib xline.o
1379
1380 libIRCDstring.dylib: inspstring.cpp ../include/base.h ../include/inspstring.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1381         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1382         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDstring.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDstring.dylib inspstring.o
1383
1384 libIRCDasyncdns.dylib: 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
1385         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1386         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDasyncdns.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDasyncdns.dylib dns.o
1387
1388 libIRCDbase.dylib: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1389         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1390         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDbase.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDbase.dylib base.o
1391
1392 libIRCDconfigreader.dylib: configreader.cpp ../include/base.h ../include/configreader.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 configreader.cpp
1394         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDconfigreader.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDconfigreader.dylib configreader.o
1395
1396 libIRCDcommands.dylib: commands.cpp ../include/base.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1397         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1398         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDcommands.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDcommands.dylib commands.o
1399
1400 libIRCDdynamic.dylib: dynamic.cpp ../include/base.h ../include/dynamic.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1401         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1402         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDdynamic.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDdynamic.dylib dynamic.o
1403
1404 libIRCDusers.dylib: 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
1405         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1406         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDusers.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDusers.dylib users.o
1407
1408 libIRCDmodules.dylib: 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
1409         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1410         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDmodules.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDmodules.dylib modules.o
1411
1412 libIRCDwildcard.dylib: wildcard.cpp ../include/base.h ../include/wildcard.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1413         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1414         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDwildcard.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDwildcard.dylib wildcard.o
1415
1416 libIRCDsocket.dylib: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1417         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1418         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDsocket.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDsocket.dylib socket.o
1419
1420 libIRCDinspsocket.dylib: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1421         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1422         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDinspsocket.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDinspsocket.dylib inspsocket.o
1423
1424 libIRCDtimer.dylib: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1425         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1426         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDtimer.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDtimer.dylib timer.o
1427
1428 libIRCDserver.dylib: server.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1429         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c server.cpp
1430         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDserver.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDserver.dylib server.o
1431
1432 libIRCDfilelogger.dylib: filelogger.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1433         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c filelogger.cpp
1434         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDfilelogger.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDfilelogger.dylib filelogger.o
1435
1436 EOM
1437
1438 } else {
1439
1440         print FH <<EOM;
1441 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 libIRCDserver.so libIRCDfilelogger.so inspircd
1442
1443 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 libIRCDserver.so libIRCDfilelogger.so
1444         \$(CC) -pipe -I../include -Wl,--rpath -Wl,$config{LIBRARY_DIR} \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so 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 libIRCDserver.so libIRCDfilelogger.so
1445
1446 libIRCDsocketengine.so: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1447         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
1448         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o $se.o
1449
1450 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
1451         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1452         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsnomasks.so snomasks.o
1453
1454 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
1455         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1456         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
1457
1458 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
1459         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1460         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
1461
1462 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1463         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1464         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
1465
1466 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1467         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1468         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
1469
1470 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1471         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1472         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
1473
1474 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1475         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1476         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
1477
1478 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)
1479         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1480         \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
1481         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o modes/modeclasses.a
1482
1483 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
1484         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1485         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
1486
1487 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
1488         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1489         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
1490
1491 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
1492         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1493         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
1494
1495 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1496         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1497         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
1498
1499 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
1500         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
1501         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDconfigreader.so configreader.o
1502
1503 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
1504         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1505         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o
1506
1507 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
1508         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1509         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
1510
1511 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
1512         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1513         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
1514
1515 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
1516         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1517         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
1518
1519 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
1520         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1521         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
1522
1523 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1524         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1525         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
1526
1527 libIRCDinspsocket.so: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1528         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1529         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDinspsocket.so inspsocket.o
1530
1531 libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1532         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1533         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDtimer.so timer.o
1534
1535 libIRCDserver.so: server.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1536         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c server.cpp
1537         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDserver.so server.o
1538
1539 libIRCDfilelogger.so: filelogger.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1540         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c filelogger.cpp
1541         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDfilelogger.so filelogger.o
1542
1543 EOM
1544 }
1545         foreach my $cmd (@cmdlist) {
1546                 print FH <<ITEM;
1547 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
1548         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1549         \$(CC) -pipe $SHARED -o cmd_$cmd.so cmd_$cmd.o
1550
1551 ITEM
1552         }
1553         close(FH);
1554 }
1555