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