]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - configure
Put FileLogger in it's own class. Useful when logging doing more focused logging
[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                                 }
482                                 elsif ($line =~ /Compiled on a Linux (.*?\..*?)\.* system/)
483                                 {
484                                         $kernelv = $1;
485                                 }
486                         }
487                         close FH;
488                         if ($libcv < 2.3)
489                         {
490                                 $has_epoll = 0;
491                                 printf "libc too old: $libcv... ";
492                         }
493                         if ($kernelv < 2.6)
494                         {
495                                 $has_epoll = 0;
496                                 printf "libc built against older kernel $kernelv... ";
497                         }
498                 }
499         }
500 }
501 print "yes\n" if $has_epoll == 1;
502 print "no\n" if $has_epoll == 0;
503
504 printf "Checking if Solaris I/O completion ports are available... ";
505 $has_ports = 0;
506 my $system = `uname -s`;
507 chomp ($system);
508 $has_ports = 1 if ($system eq "SunOS");
509
510 if ($has_ports) {
511         my $kernel = `uname -r`;
512         chomp($kernel);
513         if (($kernel !~ /^5\.1./)) {
514                 $has_ports = 0;
515         }
516 }
517 print "yes\n" if $has_ports == 1;
518 print "no\n" if $has_ports == 0;
519
520 $config{HAS_EPOLL} = $has_epoll;
521 $config{HAS_KQUEUE} = $has_kqueue; 
522
523 printf "Checking for libgnutls... ";
524 if (($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS} >= 1.2) || ($config{HAS_GNUTLS} eq "y"))) {
525         print "yes\n";
526         $config{HAS_GNUTLS} = "y";
527 } else {
528         print "no\n";
529         $config{HAS_GNUTLS} = "n";
530 }
531
532 printf "Checking for openssl... ";
533 if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPENSSL} eq "y"))) {
534         print "yes\n";
535         $config{HAS_OPENSSL} = "y";
536 } else {
537         print "no\n";
538         $config{HAS_OPENSSL} = "n";
539 }
540
541 ################################################################################
542 #                         BEGIN INTERACTIVE PART                              #
543 ################################################################################
544
545 # Clear the Screen..
546 if ($interactive)
547 {
548         system("clear");
549         $wholeos = $^O;
550
551         my $rev = getrevision();
552         # Display Introduction Message..
553         print "
554 Welcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)
555 \033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m
556
557 *** If you are unsure of any of these values, leave it blank for    ***
558 *** standard settings that will work, and your server will run      ***
559 *** using them. Please consult your IRC network admin if in doubt.  ***
560
561 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
562 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
563 dir, otherwise you won't have a config file!
564
565 Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos)
566 Maximum file descriptors: \033[1;32m$config{MAX_CLIENT_T}\033[0m
567 Your InspIRCd revision ID is \033[1;32mr$rev\033[0m";
568         if ($rev eq "r0") {
569                 print " (Non-SVN build)";
570         }
571         print ".\n\n";
572
573         $config{CHANGE_COMPILER} = "n";
574         print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
575
576         while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
577                 print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
578 should NOT be used. You should probably specify a newer compiler.\n\n";
579                 yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
580                 if ($config{CHANGE_COMPILER} =~ /y/i) {
581                         print "What command do you want to use to invoke your compiler?\n";
582                         print "[\033[1;32m$config{CC}\033[0m] -> ";
583                         chomp($config{CC} = <STDIN>);
584                         if ($config{CC} eq "") {
585                                 $config{CC} = "g++";
586                         }
587                         chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
588                         if ($foo ne "") {
589                                 chomp($config{GCCVER}       = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change compilers
590                                 print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
591                                 if ($config{GCCVER} < 3) {
592                                         print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n";
593                                 }
594                         }
595                         else {
596                                 print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
597                         }
598                 }
599         }
600
601         print "\n";
602
603         # Directory Settings..
604         my $tmpbase = $config{BASE_DIR};
605         dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
606         if ($tmpbase ne $config{BASE_DIR}) {
607                 $config{CONFIG_DIR}      = resolve_directory($config{BASE_DIR}."/conf");           # Configuration Dir
608                 $config{MODULE_DIR}      = resolve_directory($config{BASE_DIR}."/modules");     # Modules Directory
609                 $config{BINARY_DIR}      = resolve_directory($config{BASE_DIR}."/bin");     # Binary Directory
610                 $config{LIBRARY_DIR}    = resolve_directory($config{BASE_DIR}."/lib");      # Library Directory
611         }
612
613         dir_check("are the configuration files", "CONFIG_DIR");
614         dir_check("are the modules to be compiled to", "MODULE_DIR");
615         dir_check("is the IRCd binary to be placed", "BINARY_DIR");
616         dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
617
618         if ($has_kqueue) {
619                 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?");
620                 print "\n";
621         }
622         if ($has_epoll) {
623                 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?");
624                 print "\n";
625         }
626         if ($has_ports) {
627                 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?");
628                 print "\n";
629         }
630         $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y") || ($config{USE_PORTS} eq "y"));
631         if (!$chose_hiperf) {
632                 print "No high-performance socket engines are available, or you chose\n";
633                 print "not to enable one. Defaulting to select() engine.\n\n";
634         }
635
636         yesno(IPV6,"Would you like to build InspIRCd with IPv6 support?");
637         print "\n";
638
639         if ($config{IPV6} eq "y") {
640                 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";
641                 $config{SUPPORT_IP6LINKS} = "y";
642         } else {
643                 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)");
644                 print "\n";
645         }
646
647         if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
648                 print "I have detected both \033[1;32mGnuTLS\033[0m and \033[1;32mOpenSSL\033[0m on your system.\n";
649                 print "I will default to GnuTLS. If you wish to use OpenSSL\n";
650                 print "instead, you should enable the OpenSSL module yourself\n";
651                 print "by copying it from src/modules/extra to src/modules.\n\n";
652                 print "Detected GnuTLS version: \033[1;32m" . $gnutls_ver . "\033[0m\n";
653                 print "Detected OpenSSL version: \033[1;32m" . $openssl_ver . "\033[0m\n\n";
654         }
655
656         if ($config{HAS_GNUTLS} eq "y") {
657                 yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
658                 if ($config{USE_GNUTLS} eq "y") {
659                         print "\nUsing GnuTLS SSL module.\n";
660                 }
661         } elsif ($config{HAS_OPENSSL} eq "y") {
662                         yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
663         if ($config{USE_OPENSSL} eq "y") {
664                         print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
665                 }
666         }
667         else {
668                 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";
669         }
670
671         print "\nThe following questions will ask you for various figures relating\n";
672         print "To your IRCd install. Please note that these should usually be left\n";
673         print "as defaults unless you have a real reason to change them. If they\n";
674         print "changed, then the values must be identical on all servers on your\n";
675         print "network, or malfunctions and/or crashes may occur, with the exception\n";
676         print "of the 'maximum number of clients' setting which may be different on\n";
677         print "different servers on the network.\n\n";
678
679         # File Descriptor Settings..
680         promptnumeric("number of clients at any one time", "MAX_CLIENT_T");
681         $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
682         $config{MAX_DESCRIPTORS} = $config{MAX_CLIENT_T};
683
684         promptnumeric("length of nicknames", "NICK_LENGT");
685         promptnumeric("length of channel names", "CHAN_LENGT");
686         promptnumeric("number of mode changes in one line", "MAXI_MODES");
687         promptnumeric("length of an ident (username)", "MAX_IDENT");
688         promptnumeric("length of a quit message", "MAX_QUIT");
689         promptnumeric("length of a channel topic", "MAX_TOPIC");
690         promptnumeric("length of a kick message", "MAX_KICK");
691         promptnumeric("length of a GECOS (real name)", "MAX_GECOS");
692         promptnumeric("length of an away message", "MAX_AWAY");
693 }
694
695 dumphash();
696
697 if (($config{USE_GNUTLS} eq "y") && ($config{HAS_GNUTLS} ne "y"))
698 {
699         print "Sorry, but i couldn't detect gnutls. Make sure gnutls-config is in your path.\n";
700         exit(0);
701 }
702 if (($config{USE_OPENSSL} eq "y") && ($config{HAS_OPENSSL} ne "y"))
703 {
704         print "Sorry, but i couldn't detect openssl. Make sure openssl is in your path.\n";
705         exit(0);
706 }
707
708 if ($config{USE_GNUTLS} eq "y") {
709         $failed = 0;
710         open(TMP, "<src/modules/m_ssl_gnutls.cpp") or $failed = 1;
711         close(TMP);
712         if ($failed) {
713                 print "Symlinking src/modules/m_ssl_gnutls.cpp from extra/\n";
714                 chdir("src/modules");
715                 system("ln -s extra/m_ssl_gnutls.cpp");
716                 chdir("../..");
717         }
718         getmodules();
719         if ($interactive)
720         {
721                 $failed = 0;
722                 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
723                 close(TMP);
724                 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
725                 close(TMP);
726                 if ($failed) {
727                         print "SSL Certificates Not found, Generating.. \n\n
728 *************************************************************
729 * Generating the Private Key may take some time, go grab a  *
730 * Coffee. Even better, to generate some more entropy if it  *
731 * is taking a while, open another console and type du / a   *
732 * few times and get that HD going :) Then answer the        *
733 * Questions which follow. If you are unsure, just hit enter *
734 *************************************************************\n\n";
735                         $failed = make_gnutls_cert();
736                         if ($failed) {
737                                 print "\n\033[1;32mCertificate generation failed!\033[0m\n\n";
738                         } else {
739                                 print "\nCertificate generation complete, copying to config directory... ";
740                                 system("mv key.pem $config{CONFIG_DIR}/key.pem");
741                                 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
742                                 print "Done.\n\n";
743                         }
744                 }
745                 else {
746                         print "SSL Certificates found, skipping.\n\n";
747                 }
748         }
749         else
750         {
751                 print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
752         }
753 } elsif ($config{USE_OPENSSL} eq "y") {
754         $failed = 0;
755         open(TMP, "<src/modules/m_ssl_openssl.cpp") or $failed = 1;
756         close(TMP);
757         if ($failed) {
758                 print "Symlinking src/modules/m_ssl_openssl.cpp from extra/\n";
759                 chdir("src/modules");
760                 system("ln -s extra/m_ssl_openssl.cpp");
761                 chdir("../..");
762         }
763         getmodules();
764         $failed = 0;
765         if ($interactive)
766         {
767                 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
768                 close(TMP);
769                 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
770                 close(TMP);
771                 if ($failed) {
772                         print "SSL Certificates Not found, Generating.. \n\n
773 *************************************************************
774 * Generating the certificates may take some time, go grab a *
775 * coffee, or something.                                     *
776 *************************************************************\n\n";
777                         make_openssl_cert();
778                         print "\nCertificate generation complete, copying to config directory... ";
779                         system("mv key.pem $config{CONFIG_DIR}/key.pem");
780                         system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
781                         system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
782                         print "Done.\n\n";
783                 } else {
784                         print "SSL Certificates found, skipping.\n\n"
785                 }
786         }
787         else
788         {
789                 print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
790         }
791 }
792 if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
793         print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
794 }
795
796 getosflags();
797 writefiles(1);
798 makecache();
799
800 print "\n\n";
801 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
802 if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
803         print "Please remember that to enable \033[1;32mSSL support\033[0m you must\n";
804         print "load the required modules in your config. This configure process\n";
805         print "has just prepared these modules to be compiled for you, and has not\n";
806         print "configured them to be compiled into the core of the ircd.\n";
807 }
808 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
809 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
810         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";
811 }
812
813 if ($config{GCCVER} < "3") {
814         print <<FOO2;
815 \033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
816 GCC 2.x series compilers only had partial (read as broken) C++ support, and
817 your compile will most likely fail horribly! If you have any problems, do NOT
818 report them to the bugtracker or forums without first upgrading your compiler
819 to a newer 3.x or 4.x (or whatever is available currently) version.
820 FOO2
821 }
822
823 ################################################################################
824 #                             HELPER FUNCTIONS                          #
825 ################################################################################
826 sub getcache {
827         # Retrieves the .config.cache file, and loads values into the main config hash.
828         open(CACHE, ".config.cache") or return 0;
829         while (<CACHE>) {
830                 chomp;
831                 # Ignore Blank lines, and comments..
832                 next if /^\s*$/;
833                 next if /^\s*#/;
834                 my ($key, $value) = split("=", $_, 2);
835                 $value =~ /^\"(.*)\"$/;
836                 # Do something with data here!
837                 $config{$key} = $1;
838         }
839         close(CONFIG);
840         return 1;
841 }
842
843 sub makecache {
844         # Dump the contents of %config
845         print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
846         open(FILEHANDLE, ">.config.cache");
847         foreach $key (keys %config) {
848                 print FILEHANDLE "$key=\"$config{$key}\"\n";
849         }
850         close(FILEHANDLE);
851 }
852
853 sub dir_check {
854         my ($desc, $hash_key) = @_;
855         my $complete = 0;
856         while (!$complete) {
857                 print "In what directory $desc?\n";
858                 print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
859                 chomp($var = <STDIN>);
860                 if ($var eq "") {
861                         $var = $config{$hash_key};
862                 }
863                 if ($var =~ /^\~\/(.+)$/) {
864                         # Convert it to a full path..
865                         $var = resolve_directory($ENV{HOME} . "/" . $1);
866                 }
867                 elsif ((($config{OSNAME} =~ /MINGW32/i) and ($var !~ /^[A-Z]{1}:\\.*/)) and (substr($var,0,1) ne "/"))
868                 {
869                         # Assume relative Path was given.. fill in the rest.
870                         $var = $this . "/$var";
871                 }
872                 
873                 $var = resolve_directory($var); 
874                 if (! -e $var) {
875                         print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
876                         chomp($tmp = <STDIN>);
877                         if (($tmp eq "") || ($tmp =~ /^y/i)) {
878                                 # Attempt to Create the Dir..
879                                 
880                                 system("mkdir -p \"$var\" >> /dev/null 2>&1");
881                                 $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
882                                 if ($chk != 0) {
883                                         print "Unable to create directory. ($var)\n\n";
884                                         # Restart Loop..
885                                         next;
886                                 }
887                         } else {
888                                 # They said they don't want to create, and we can't install there.
889                                 print "\n\n";
890                                 next;
891                         }
892                 } else {
893                         if (!is_dir($var)) {
894                                 # Target exists, but is not a directory.
895                                 print "File $var exists, but is not a directory.\n\n";
896                                 next;
897                         }
898                 }
899                 # Either Dir Exists, or was created fine.
900                 $config{$hash_key} = $var;
901                 $complete = 1;
902                 print "\n";
903         }
904 }
905
906 sub getosflags {
907
908         $config{LDLIBS} = "-lstdc++";
909         $config{FLAGS}  = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual -Wno-deprecated $config{OPTIMISATI}";
910         $config{DEVELOPER} = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual -Wno-deprecated -g";
911         $SHARED = "-Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared";
912         $config{MAKEPROG} = "make";
913
914         if ($config{OSNAME} =~ /darwin/i) {
915                 $config{FLAGS}  = "-DDARWIN -frtti -fPIC -Wall -Woverloaded-virtual -Wno-deprecated $config{OPTIMISATI}";
916                 $SHARED = "-bundle -twolevel_namespace -undefined dynamic_lookup";
917                 $config{LDLIBS} = "-ldl -lstdc++";
918         }
919
920         if ($config{OSNAME} =~ /OpenBSD/i) {
921                 $config{MAKEPROG} = "gmake";
922                 chomp($foo = `eg++ -dumpversion | cut -c 1`);
923                 # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
924                 # if theyre not running this, configure lets the build continue but they probably wont manage to
925                 # compile as this standard version is 2.95.3!
926                 if ($foo ne "") {
927                         $config{CC} = "eg++";
928                         chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change the compiler path
929                 }
930                 return "OpenBSD";
931         }
932
933         if ($config{OSNAME} =~ /Linux/i) {
934                 $config{LDLIBS} = "-ldl -lstdc++";
935                 $config{FLAGS}  = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual -Wno-deprecated $config{OPTIMISATI}";
936                 $config{FLAGS}  .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
937                 $config{LDLIBS} .= " " . $ENV{LDLIBS} if exists($ENV{LDLIBS});
938                 $config{MAKEPROG} = "make";
939         }
940
941         if ($config{OSNAME} =~ /FreeBSD/i) {
942                 $config{FLAGS}  .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
943                 $config{LDLIBS} .= " " . $ENV{LDLIBS} if exists($ENV{LDLIBS});
944         }
945
946         if ($config{OSNAME} =~ /SunOS/i or $config{OSNAME} =~ /solaris/i)
947         {
948                 # solaris/sunos needs these
949                 # socket = bsd sockets api
950                 # nsl = dns stuff
951                 # rt = POSIX realtime extensions
952                 # resolv = inet_aton only (why isnt this in nsl?!)
953                 $config{MAKEPROG} = "gmake";
954                 $config{LDLIBS} .= " -lsocket -lnsl -lrt -lresolv";
955                 return "Solaris";
956         }
957         
958         if($config{OSNAME} =~ /MINGW32/i)
959         {
960                 # All code is position-independent on windows
961                 $config{FLAGS} =~ s/-fPIC //;
962                 return "MinGW";
963         }
964
965         return $config{OSNAME};
966 }
967
968 sub writefiles {
969         my($writeheader) = @_;
970         # First File.. inspircd_config.h
971         chomp(my $incos = `uname -n -s -r`);
972         chomp($version = `sh src/version.sh`);
973         chomp(my $revision2 = getrevision());
974         if ($writeheader == 1)
975         {
976                 print "Writing \033[1;32minspircd_config.h\033[0m\n";
977                 open(FILEHANDLE, ">include/inspircd_config.h");
978                 my $NL = $config{NICK_LENGT}+1;
979                 my $CL = $config{CHAN_LENGT}+1;
980                 print FILEHANDLE <<EOF;
981 /* Auto generated by configure, do not modify! */
982 #ifndef __CONFIGURATION_AUTO__
983 #define __CONFIGURATION_AUTO__
984
985 /* this is for windows support. */
986 #define CoreExport /**/
987 #define DllExport /**/
988
989 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
990 #define MOD_PATH "$config{MODULE_DIR}"
991 #define VERSION "$version"
992 #define REVISION "$revision2"
993 #define MAXCLIENTS $config{MAX_CLIENT}
994 #define MAXCLIENTS_S "$config{MAX_CLIENT}"
995 #define SOMAXCONN_S "$config{_SOMAXCONN}"
996 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
997 #define NICKMAX $NL
998 #define CHANMAX $CL
999 #define MAXMODES $config{MAXI_MODES}
1000 #define IDENTMAX $config{MAX_IDENT}
1001 #define MAXQUIT $config{MAX_QUIT}
1002 #define MAXTOPIC $config{MAX_TOPIC}
1003 #define MAXKICK $config{MAX_KICK}
1004 #define MAXGECOS $config{MAX_GECOS}
1005 #define MAXAWAY $config{MAX_AWAY}
1006 #define OPTIMISATION $config{OPTIMITEMP}
1007 #define LIBRARYDIR "$config{LIBRARY_DIR}"
1008 #define SYSTEM "$incos"
1009 EOF
1010 print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\n";
1011
1012                 if ($config{OSNAME} =~ /SunOS/i) {
1013                         print FILEHANDLE "#define IS_SOLARIS\n";
1014                 }
1015                 if ($config{OSNAME} =~ /MINGW32/i) {
1016                         print FILEHANDLE "#define IS_MINGW\n";
1017                 }
1018                 if ($config{GCCVER} >= 3) {
1019                         print FILEHANDLE "#define GCC3\n";
1020                 }
1021                 if ($config{HAS_STRLCPY} eq "true") {
1022                         print FILEHANDLE "#define HAS_STRLCPY\n";
1023                 }
1024                 if ($config{HAS_STDINT} eq "true") {
1025                         print FILEHANDLE "#define HAS_STDINT\n";
1026                 }
1027                 if ($config{IPV6} =~ /y/i) {
1028                         print FILEHANDLE "#define IPV6\n";
1029                 }
1030                 if ($config{SUPPORT_IP6LINKS} =~ /y/i) {
1031                         print FILEHANDLE "#define SUPPORT_IP6LINKS\n";
1032                 }
1033                 my $use_hiperf = 0;
1034                 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1035                         print FILEHANDLE "#define USE_KQUEUE\n";
1036                         $se = "socketengine_kqueue";
1037                         $use_hiperf = 1;
1038                 }
1039                 if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1040                         print FILEHANDLE "#define USE_EPOLL\n";
1041                         $se = "socketengine_epoll";
1042                         $use_hiperf = 1;
1043                 }
1044                 if (($has_ports) && ($config{USE_PORTS} eq "y")) {
1045                         print FILEHANDLE "#define USE_PORTS\n";
1046                         $se = "socketengine_ports";
1047                         $use_hiperf = 1;
1048                 }
1049                 # user didn't choose either epoll or select for their OS.
1050                 # default them to USE_SELECT (ewwy puke puke)
1051                 if (!$use_hiperf) {
1052                         print FILEHANDLE "#define USE_SELECT\n";
1053                         $se = "socketengine_select";
1054                 }
1055                 print FILEHANDLE "\n#endif\n";
1056                 close(FILEHANDLE);
1057         }
1058
1059         if ($writeheader)
1060         {
1061                 open(FILEHANDLE, ">include/inspircd_se_config.h");
1062                 print FILEHANDLE <<EOF;
1063 /* Auto generated by configure, do not modify or commit to svn! */
1064 #ifndef __CONFIGURATION_SOCKETENGINE__
1065 #define __CONFIGURATION_SOCKETENGINE__
1066
1067 #include "$se.h"
1068
1069 #endif
1070 EOF
1071                 close(FILEHANDLE);
1072         }
1073
1074
1075         # Create a Modules List..
1076         my $modules = "";
1077         foreach $i (@modlist)
1078         {
1079                 $modules .= "m_".$i.".so ";
1080         }
1081         chomp($modules);   # Remove Redundant whitespace..
1082
1083         opendir(DIRHANDLE, "src/modules");
1084         foreach $name (sort readdir(DIRHANDLE)) {
1085                 if ($name =~ /^m_(.+?)$/) {
1086                         if (opendir(MDIRHANDLE, "src/modules/$name") != 0) {
1087                                 closedir(MDIRHANDLE);
1088                                 $modules .= "$name.so ";
1089                         }
1090                 }
1091         }
1092         closedir(DIRHANDLE);
1093
1094
1095         # Write all .in files.
1096         my $tmp = "";
1097         my $file = "";
1098         my $exe = "inspircd";
1099
1100         opendir(DIRHANDLE, $this);
1101
1102         # Do this once here, and cache it in the .*.inc files,
1103         # rather than attempting to read src/version.sh from
1104         # compiled code -- we might not have the source to hand.
1105         # Fix for bug#177 by Brain.
1106
1107         chomp(my $version = `sh ./src/version.sh`);
1108         chomp(my $revision = getrevision());
1109         $version = "$version(r$revision)";
1110
1111         my $LIBEXT = "so";
1112         if ($config{IS_DARWIN} eq "YES")
1113         {
1114                 $LIBEXT = "dylib";
1115         }
1116         # We can actually parse any file starting with . and ending with .inc,
1117         # but right now we only parse .inspircd.inc to form './inspircd'
1118
1119         foreach $name (sort readdir(DIRHANDLE)) {
1120                 if ($name =~ /^\.(.+)\.inc$/) {
1121                         $file = $1;
1122
1123                         # Bug #353, omit this on non-darwin
1124                         next if (($config{OSNAME} !~ /darwin/) && ($file eq "org.inspircd.plist"));
1125
1126                         # All .name.inc files need parsing!
1127                         $tmp = "";
1128                         open(FILEHANDLE, ".$file.inc");
1129                         while (<FILEHANDLE>) {
1130                                 $tmp .= $_;
1131                         }
1132                         close(FILEHANDLE);
1133
1134                         $tmp =~ s/\@CC\@/$config{CC}/;
1135                         $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
1136                         $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
1137                         $tmp =~ s/\@DEVELOPER\@/$config{DEVELOPER}/;
1138                         $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
1139                         $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
1140                         $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
1141                         $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
1142                         $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
1143                         $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
1144                         $tmp =~ s/\@LIBRARY_EXT\@/$LIBEXT/;
1145                         $tmp =~ s/\@MODULES\@/$modules/;
1146                         $tmp =~ s/\@STARTSCRIPT\@/$config{STARTSCRIPT}/;
1147                         $tmp =~ s/\@DESTINATION\@/$config{DESTINATION}/;
1148                         $tmp =~ s/\@EXTRA_DIR\@/$config{EXTRA_DIR}/;
1149                         $tmp =~ s/\@EXECUTABLE\@/$exe/;
1150                         $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
1151                         $tmp =~ s/\@VERSION\@/$version/;
1152
1153                         print "Writing \033[1;32m$file\033[0m\n";
1154                         open(FILEHANDLE, ">$file");
1155                         print FILEHANDLE $tmp;
1156                 }
1157         }
1158         closedir(DIRHANDLE);
1159
1160         # Make inspircd executable!
1161         chmod 0744, 'inspircd';
1162
1163         print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
1164         write_dynamic_makefile();
1165         write_dynamic_modules_makefile();
1166 }
1167
1168 sub write_dynamic_modules_makefile {
1169         # Modules Makefile..
1170         print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1171         open(FILEHANDLE, ">src/modules/Makefile");
1172
1173 ###
1174 # Module Makefile Header
1175 ###
1176         print FILEHANDLE <<EOF;
1177 ###################################################
1178 # Copyright 2002-2007 The InspIRCd Development Team
1179 #  http://www.inspircd.org/wiki/index.php/Credits
1180 #
1181 # Thanks to Andrew Church <achurch\@achurch.org>
1182 #   for assisting with making this work right.
1183 #
1184 # Automatically Generated by ./configure to add a
1185 #  modules please run ./configure -modupdate
1186 ###################################################
1187
1188 all: \$(MODULES)
1189
1190 EOF
1191         ###
1192         # End Module Makefile Header
1193         ###
1194
1195         # Create a Modules List..
1196         my $modules = "";
1197         my $cmflags = "";
1198         my $liflags = "";
1199         my $crud = "";
1200
1201         foreach $i (@modlist) {
1202                 ###
1203                 # Write Entry to the MakeFile
1204                 ###
1205                 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1206                 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1207                 $deps = getdependencies("src/modules/m_".$i.".cpp");
1208         
1209                 #print "file: $i: cmflags=$cmflags; liflags=$liflags; deps=$deps\n";
1210         
1211                 print FILEHANDLE <<EOCHEESE;
1212 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
1213         \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
1214 EOCHEESE
1215
1216 if ($config{OSNAME} =~ /darwin/) {
1217                 print FILEHANDLE <<EOCHEESE;
1218         \$(CC) -pipe -twolevel_namespace -undefined dynamic_lookup \$(FLAGS) -bundle $liflags -o m_$i.so m_$i.o
1219
1220 EOCHEESE
1221 } else {
1222                 print FILEHANDLE <<EOCHEESE;
1223         \$(CC) -pipe \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o
1224
1225 EOCHEESE
1226 }
1227                 $crud = $crud . "       install -m \$(INSTMODE) m_$i.so \$(MODPATH)\n";
1228 ###
1229                 # End Write Entry to the MakeFile
1230                 ###
1231         }
1232
1233         opendir(DIRHANDLE, "src/modules");
1234         foreach $name (sort readdir(DIRHANDLE)) {
1235                 if ($name =~ /^m_(.+?)$/) {
1236                         $crapola = "";
1237                         $crap3 = "";
1238                         $mliflags = "";
1239                         # A module made of multiple files, in a dir, e.g. src/modules/m_spanningtree/
1240                         if (opendir(MDIRHANDLE, "src/modules/$name") != 0) {
1241                                 my $i = 0;
1242                                 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"; 
1243                                 foreach $fname (sort readdir(MDIRHANDLE)) {
1244                                         if ($fname =~ /\.cpp$/) {
1245                                                 $cmflags = getcompilerflags("src/modules/$name/$fname");
1246                                                 $mliflags = $mliflags . " " . getlinkerflags("src/modules/$name/$fname");
1247                                                 $deps = getdependencies("src/modules/$name/$fname");
1248                                                 $oname = $fname;
1249                                                 $oname =~ s/\.cpp$/.o/g;
1250                                                 print FILEHANDLE " $name/$oname";
1251                                                 $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";
1252                                                 $crapola = $crapola .  "        \$(CC) -pipe -I../../include -I. \$(FLAGS) $cmflags -export-dynamic -o $name/$oname -c $name/$fname\n\n";
1253                                                 $crap3 = $crap3 . " $name/$oname";
1254                                                 $i++;
1255                                         }
1256                                 }
1257                                 print "Composing Makefile rules for directory \033[1;32m$name\033[0m... (\033[1;32m$i files found\033[0m)\n";
1258                                 if ($config{IS_DARWIN} eq "YES") {
1259                                         print FILEHANDLE "\n    \$(CC) -pipe -twolevel_namespace -undefined dynamic_lookup \$(FLAGS) -bundle -o $name.so $crap3\n"; 
1260                                 } else {
1261                                         print FILEHANDLE "\n    \$(CC) -pipe \$(FLAGS) -shared $mliflags -o $name.so $crap3\n";
1262                                 }
1263                                 print FILEHANDLE "\n$crapola\n";
1264                                 closedir(MDIRHANDLE);
1265                                 $crud = $crud . "       install -m \$(INSTMODE) $name.so \$(MODPATH)\n";
1266                         }
1267                 }
1268         }
1269         closedir(DIRHANDLE);
1270
1271         print FILEHANDLE "modinst:\n    \@echo \"Installing modules...\"\n" . $crud;
1272 }
1273
1274 sub write_dynamic_makefile {
1275
1276         my $i = 0;
1277         my @cmdlist = ();
1278         opendir(DIRHANDLE, "src");
1279         foreach $name (sort readdir(DIRHANDLE)) {
1280                 if ($name =~ /^cmd_(.+)\.cpp$/) {
1281                         $cmdlist[$i++] = $1;
1282                 }
1283         }
1284         closedir(DIRHANDLE);
1285
1286         my $cmdobjs = "";
1287         my $srcobjs = "";
1288         foreach my $cmd (@cmdlist) {
1289                 $cmdobjs = $cmdobjs . "cmd_$cmd.so ";
1290                 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1291         }
1292
1293         $se = "socketengine_select";
1294         if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1295                 $se = "socketengine_kqueue";
1296         }
1297         elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1298                 $se = "socketengine_epoll";
1299         }
1300         elsif (($has_ports) && ($config{USE_PORTS} eq "y")) {
1301                 $se = "socketengine_ports";
1302         }
1303
1304         open(FH,">src/Makefile") or die("Could not write src/Makefile");
1305         print FH <<EOM;
1306 ###################################################
1307 # Copyright 2002-2007 The InspIRCd Development Team
1308 #  http://www.inspircd.org/wiki/index.php/Credits
1309 #
1310 # Thanks to Andrew Church <achurch\@achurch.org>
1311 #  for assisting with making this work right.
1312 #
1313 # This file is automagically generated by configure 
1314 # Any changes made will be lost on ./configure         
1315 ###################################################
1316
1317 CC = im a cheezeball
1318
1319 CXXFLAGS = -I../include \${FLAGS}
1320 CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
1321 RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
1322
1323 EOM
1324
1325 if ($config{IS_DARWIN} eq "YES") {
1326         print FH <<EOM;
1327 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
1328
1329 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
1330         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd.cpp
1331         \$(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
1332
1333 libIRCDsocketengine.dylib: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1334         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1335         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c $se.cpp
1336         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDsocketengine.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDsocketengine.dylib socketengine.o $se.o
1337
1338 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
1339         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1340         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDsnomasks.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDsnomasks.dylib snomasks.o
1341
1342 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
1343         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1344         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDcommand_parse.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDcommand_parse.dylib command_parse.o
1345
1346 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
1347         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1348         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDcull_list.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDcull_list.dylib cull_list.o
1349
1350 libIRCDuserprocess.dylib: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1351         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1352         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDuserprocess.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDuserprocess.dylib userprocess.o
1353
1354 libIRCDhash.dylib: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1355         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1356         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDhash.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDhash.dylib hashcomp.o
1357
1358 libIRCDhelper.dylib: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1359         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1360         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDhelper.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDhelper.dylib helperfuncs.o
1361
1362 libIRCDchannels.dylib: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1363         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1364         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDchannels.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDchannels.dylib channels.o
1365
1366 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)
1367         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1368         \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
1369         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDmode.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDmode.dylib mode.o modes/modeclasses.a
1370
1371 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
1372         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1373         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDxline.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDxline.dylib xline.o
1374
1375 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
1376         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1377         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDstring.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDstring.dylib inspstring.o
1378
1379 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
1380         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1381         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDasyncdns.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDasyncdns.dylib dns.o
1382
1383 libIRCDbase.dylib: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1384         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1385         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDbase.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDbase.dylib base.o
1386
1387 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
1388         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
1389         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDconfigreader.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDconfigreader.dylib configreader.o
1390
1391 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
1392         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1393         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDcommands.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDcommands.dylib commands.o
1394
1395 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
1396         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1397         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDdynamic.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDdynamic.dylib dynamic.o
1398
1399 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
1400         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1401         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDusers.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDusers.dylib users.o
1402
1403 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
1404         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1405         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDmodules.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDmodules.dylib modules.o
1406
1407 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
1408         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1409         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDwildcard.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDwildcard.dylib wildcard.o
1410
1411 libIRCDsocket.dylib: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1412         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1413         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDsocket.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDsocket.dylib socket.o
1414
1415 libIRCDinspsocket.dylib: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1416         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1417         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDinspsocket.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDinspsocket.dylib inspsocket.o
1418
1419 libIRCDtimer.dylib: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1420         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1421         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDtimer.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDtimer.dylib timer.o
1422
1423 libIRCDserver.dylib: server.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1424         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c server.cpp
1425         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDserver.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDserver.dylib server.o
1426
1427 libIRCDfilelogger.dylib: filelogger.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1428         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c filelogger.cpp
1429         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDfilelogger.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDfilelogger.dylib filelogger.o
1430
1431 EOM
1432
1433 } else {
1434
1435         print FH <<EOM;
1436 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
1437
1438 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
1439         \$(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
1440
1441 libIRCDsocketengine.so: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1442         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
1443         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o $se.o
1444
1445 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
1446         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1447         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsnomasks.so snomasks.o
1448
1449 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
1450         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1451         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
1452
1453 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
1454         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1455         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
1456
1457 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1458         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1459         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
1460
1461 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1462         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1463         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
1464
1465 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1466         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1467         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
1468
1469 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1470         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1471         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
1472
1473 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)
1474         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1475         \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
1476         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o modes/modeclasses.a
1477
1478 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
1479         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1480         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
1481
1482 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
1483         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1484         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
1485
1486 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
1487         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1488         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
1489
1490 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1491         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1492         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
1493
1494 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
1495         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
1496         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDconfigreader.so configreader.o
1497
1498 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
1499         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1500         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o
1501
1502 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
1503         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1504         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
1505
1506 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
1507         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1508         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
1509
1510 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
1511         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1512         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
1513
1514 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
1515         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1516         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
1517
1518 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1519         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1520         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
1521
1522 libIRCDinspsocket.so: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1523         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1524         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDinspsocket.so inspsocket.o
1525
1526 libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1527         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1528         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDtimer.so timer.o
1529
1530 libIRCDserver.so: server.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1531         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c server.cpp
1532         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDserver.so server.o
1533
1534 libIRCDfilelogger.so: filelogger.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1535         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c filelogger.cpp
1536         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDfilelogger.so filelogger.o
1537
1538 EOM
1539 }
1540         foreach my $cmd (@cmdlist) {
1541                 print FH <<ITEM;
1542 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
1543         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1544         \$(CC) -pipe $SHARED -o cmd_$cmd.so cmd_$cmd.o
1545
1546 ITEM
1547         }
1548         close(FH);
1549 }
1550