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