]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - win/configure.cpp
Fix wildcard matching in win32, seems that incrementing an iterator dereferences...
[user/henk/code/inspircd.git] / win / configure.cpp
1 /*         +------------------------------------+
2  *         | Inspire Internet Relay Chat Daemon |
3  *         +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
6  * See: http://www.inspircd.org/wiki/index.php/Credits
7  *
8  * This program is free but copyrighted software; see
9  *                      the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 #define _CRT_SECURE_NO_DEPRECATE
15
16 #define WIN32_LEAN_AND_MEAN
17 #include <windows.h>
18 #include <stdio.h>
19 #include <string>
20 #include <time.h>
21 #include "inspircd_win32wrapper.h"
22 #include "colours.h"
23
24 using namespace std;
25 void Run();
26 void Banner();
27 void WriteCompileModules();
28 void WriteCompileCommands();
29 void Rebase();
30
31 /* detects if we are running windows xp or higher (5.1) */
32 bool iswinxp()
33 {
34         OSVERSIONINFO vi;
35         vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
36         GetVersionEx(&vi);
37         if(vi.dwMajorVersion >= 5)
38                 return true;
39         
40         return false;
41 }
42
43 int get_int_option(const char * text, int def)
44 {
45         static char buffer[500];
46         int ret;
47         printf_c("%s\n[\033[1;32m%u\033[0m] -> ", text, def);
48         fgets(buffer, 500, stdin);
49         if(sscanf(buffer, "%u", &ret) != 1)
50                 ret = def;
51
52         printf("\n");
53         return ret;
54 }
55
56 bool get_bool_option(const char * text, bool def)
57 {
58         static char buffer[500];
59         char ret[100];
60         printf_c("%s [\033[1;32m%c\033[0m] -> ", text, def ? 'y' : 'n');
61         fgets(buffer, 500, stdin);
62         if(sscanf(buffer, "%s", ret) != 1)
63                 strcpy(ret, def ? "y" : "n");
64
65         printf("\n");
66         return !strncmp(ret, "y", 1);
67 }
68
69 void get_string_option(const char * text, char * def, char * buf)
70 {
71         static char buffer[500];
72         if (*def)
73                 printf_c("%s\n[\033[1;32m%s\033[0m] -> ", text, def);
74         else
75                 printf_c("%s\n[] -> ", text);
76         fgets(buffer, 500, stdin);
77         if(sscanf(buffer, "%s", buf) != 1)
78                 strcpy(buf, def);
79
80         printf("\n");
81 }
82
83 // escapes a string for use in a c++ file
84 bool escape_string(char * str, size_t size)
85 {
86         size_t len = strlen(str);
87         char * d_str = (char*)malloc(len * 2);
88         
89         size_t i = 0;
90         size_t j = 0;
91
92         for(; i < len; ++i)
93         {
94                 if(str[i] == '\\')
95                 {
96                         d_str[j++] = '\\';
97                         d_str[j++] = '\\';
98                 }
99                 else
100                 {
101                         d_str[j++] = str[i];
102                 }
103         }
104
105         d_str[j++] = 0;
106
107         if(j > size)
108         {
109                 free(d_str);
110                 return false;
111         }
112
113         strcpy(str, d_str);
114         free(d_str);
115         return true;
116 }
117
118 /* gets the svn revision */
119 int get_svn_revision(char * buffer, size_t len)
120 {
121         /* again.. I am lazy :p cbf to pipe output of svn info to us, so i'll just read the file */
122         /*
123         8
124
125         dir
126         7033
127         */
128         char buf[1000];
129         int rev = 0;
130         
131         FILE * f = fopen("..\\.svn\\entries", "r");
132         if (f)
133         {
134                 for (int q = 0; q < 4; ++q)
135                         fgets(buf, 1000, f);
136
137                 rev = atoi(buf);
138                 sprintf(buffer, "%u", rev);
139                 fclose(f);
140         }
141         
142         return rev;
143 }
144
145 int __stdcall WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd )
146 {
147         if (!strcmp(lpCmdLine, "/rebase"))
148         {
149                 Rebase();
150                 return 0;
151         }
152         FILE * j = fopen("inspircd_config.h", "r");
153         if (j)
154         {
155                 if (MessageBox(0, "inspircd_config.h already exists. Remove it and build from clean?", "Configure program", MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2) != IDYES)
156                 {
157                         fclose(j);
158                         exit(0);
159                 }
160         }
161
162         AllocConsole();
163
164         // pipe standard handles to this console
165         freopen("CONIN$", "r", stdin);
166         freopen("CONOUT$", "w", stdout);
167         freopen("CONOUT$", "w", stderr);
168
169         Banner();
170         Run();
171         FreeConsole();
172         return 0;
173 }
174
175 void Banner()
176 {
177         printf_c("\nWelcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)\n"
178                          "\033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m\n\n");
179         printf_c("*** If you are unsure of any of these values, leave it blank for      ***\n"
180                          "*** standard settings that will work, and your server will run          ***\n"
181                          "*** using them. Please consult your IRC network admin if in doubt.  ***\n\n"
182                          "Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter\n"
183                          "a new value. Please note: You will \033[1mHAVE\033[0m to read the docs\n"
184                          "dir, otherwise you won't have a config file!\n\n");
185
186 }
187
188 void Run()
189 {
190         bool use_iocp = false;
191         bool support_ip6links = true;
192         bool use_openssl = false;
193         bool ipv6 = true;
194         char mod_path[MAX_PATH];
195         char config_file[MAX_PATH];
196         char library_dir[MAX_PATH];
197         char base_path[MAX_PATH];
198         char bin_dir[MAX_PATH];
199         char revision_text[MAX_PATH];
200         char openssl_inc_path[MAX_PATH];
201         char openssl_lib_path[MAX_PATH];
202
203         int nicklen = 31;
204         int chanlen = 64;
205         int modechanges = 20;
206         int identlen = 12;
207         int quitlen = 255;
208         int topiclen = 500;
209         int kicklen = 255;
210         int rllen = 128;
211         int awaylen = 200;
212         int revision = get_svn_revision(revision_text, MAX_PATH);
213         char version[514];
214
215         // grab version
216         FILE * fI = fopen("..\\src\\version.sh", "r");
217         if(fI)
218         {
219                 fgets(version, 514, fI);
220                 fgets(version, 514, fI);
221                 char * p2 = version;
222                 while(*p2 != '\"')
223                         ++p2;
224                 ++p2;
225                 strcpy(version, p2);
226                 p2 = version;
227                 while(*p2 != '\"')
228                         ++p2;
229                 *p2 = 0;
230                 fclose(fI);
231         }
232         else
233                 strcpy(version, "InspIRCD-Unknown");
234 #ifdef WIN64
235         printf_c("Your operating system is: \033[1;32mwindows_x64 \033[0m\n");
236 #else
237         printf_c("Your operating system is: \033[1;32mwindows_x32 \033[0m\n");
238 #endif
239         printf_c("InspIRCd revision ID: \033[1;32m%s \033[0m\n\n", revision ? revision_text : "(Non-SVN build)");
240
241         // detect windows
242         if(iswinxp())
243         {
244                 printf_c("You are running Windows 2000 or above, and IOCP support is most likely available.\n"
245                                  "Thisis much more efficent but is currently EXPERIMENTAL and UNSUPPORTED.\n"
246                                  "If you are unsure, answer no.\n\n");
247
248                 use_iocp = get_bool_option("Do you want to use the IOCP implementation?", false);
249         }
250
251         ipv6 = get_bool_option("Do you want to enable IPv6?", false);
252
253         if (!ipv6)
254                 support_ip6links = get_bool_option("\nYou have chosen to build an \033[1;32mIPV4-only\033[0m server.\nWould you like to enable support for linking to IPV6-enabled InspIRCd servers?\nIf you are using a recent operating system 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)", true);
255         else
256                 support_ip6links = true;
257         
258         printf_c("\033[1mAll paths are relative to the binary directory.\033[0m\n");
259         get_string_option("In what directory do you wish to install the InspIRCd base?", "..", base_path);
260         get_string_option("In what directory are the configuration files?", "../conf", config_file);
261         get_string_option("In what directory are the modules to be compiled to?", "../modules", mod_path);
262         get_string_option("In what directory is the IRCd binary to be placed?", ".", bin_dir);
263         get_string_option("In what directory are the IRCd libraries to be placed?", "../lib", library_dir);
264
265         printf_c("The following questions will ask you for various figures relating\n"
266                 "To your IRCd install. Please note that these should usually be left\n"
267                 "as defaults unless you have a real reason to change them. If they\n"
268                 "changed, then the values must be identical on all servers on your\n"
269                 "network, or malfunctions and/or crashes may occur, with the exception\n"
270                 "of the 'maximum number of clients' setting which may be different on\n"
271                 "different servers on the network.\n\n");
272
273         nicklen = get_int_option("Please enter the maximum length of nicknames?", 31);
274         chanlen = get_int_option("Please enter the maximum length of channel names?", 64);
275         modechanges = get_int_option("Please enter the maximum number of mode changes in one line?", 20);
276         identlen = get_int_option("Please enter the maximum length of an ident (username)?", 12);
277         quitlen = get_int_option("Please enter the maximum length of a quit message?", 255);
278         topiclen = get_int_option("Please enter the maximum length of a channel topic?", 307);
279         kicklen = get_int_option("Please enter the maximum length of a kick message?", 255);
280         rllen = get_int_option("Please enter the maximum length of a GECOS (real name)?", 128);
281         awaylen = get_int_option("Please enter the maximum length of an away message?", 200);
282
283         // NOTE: this may seem hackish (generating a batch build script), but it assures the user knows
284         // what they're doing, and we don't have to mess with copying files and changing around modules.mak
285         // for the extra libraries. --fez
286         // in case it exists, remove old m_ssl_openssl.cpp
287         remove("..\\src\\modules\\m_ssl_openssl.cpp");
288         printf_c("You can compile InspIRCd modules that add OpenSSL or GnuTLS support for SSL functionality.\n"
289                 "To do so you will need the appropriate link libraries and header files on your system.\n");
290         use_openssl = get_bool_option("Would you like to compile the IRCd with OpenSSL support?", false);
291         if (use_openssl)
292         {
293                 get_string_option("Please enter the full path to your OpenSSL include directory\n"
294                         "(e.g., C:\\openssl\\include, but NOT the openssl subdirectory under include\\)\n"
295                         "(also, path should not end in '\\')",
296                         "C:\\openssl\\include", openssl_inc_path);
297
298                 // NOTE: if inspircd ever changes so that it compiles with /MT instead of the /MTd switch, then
299                 // the dependency on libeay32mtd.lib and ssleay32mtd.lib will change to just libeay32.lib and
300                 // ssleay32.lib. --fez
301
302                 get_string_option("Please enter the full path to your OpenSSL library directory\n"
303                         "(e.g., C:\\openssl\\lib, which should contain libeay32mtd.lib and ssleay32mtd.lib)",
304                         "C:\\openssl\\lib", openssl_lib_path);
305
306                 // write batch file
307                 FILE *fp = fopen("compile_openssl.bat", "w");
308                 fprintf(fp, "@echo off\n");
309                 fprintf(fp, "echo This batch script compiles m_ssl_openssl for InspIRCd.\n");
310                 fprintf(fp, "echo NOTE: this batch file should be invoked from the Visual Studio Command Prompt (vsvars32.bat)\n");
311                 fprintf(fp, "set OPENSSL_INC_PATH=\"%s\"\n", openssl_inc_path);
312                 fprintf(fp, "set OPENSSL_LIB_PATH=\"%s\"\n", openssl_lib_path);
313                 fprintf(fp, "set COMPILE=cl /nologo -Dssize_t=long /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /MT /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP /I %%OPENSSL_INC_PATH%% m_ssl_openssl.cpp ..\\..\\win\\inspircd_memory_functions.cpp %%OPENSSL_INC_PATH%%\\openssl\\applink.c /link /LIBPATH:%%OPENSSL_LIB_PATH%% ..\\..\\bin\\release\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\release\\modules\\m_ssl_openssl.so\" /PDB:\"..\\..\\bin\\release\\modules\\m_ssl_openssl.pdb\" /IMPLIB:\"..\\..\\bin\\release\\modules\\m_ssl_openssl.lib\"\n");
314                 fprintf(fp, "cd ..\\src\\modules\n");
315                 fprintf(fp, "copy extra\\m_ssl_openssl.cpp .\n");
316                 fprintf(fp, "echo \t%%COMPILE%%\n");
317                 fprintf(fp, "%%COMPILE%%\n");
318                 fprintf(fp, "cd ..\\..\\win\n");
319                 fprintf(fp, "echo done... now check for errors.\n");
320                 fclose(fp);
321
322                 printf_c("\033[1;32m!!!NOTICE!!! The file 'compile_openssl.bat' has been written to your 'win' directory.  Launch it\n"
323                         "!!! from the Visual Studio Command Prompt !!! to compile the m_ssl_openssl module.\n"
324                         "Wait until after compiling inspircd to run it.\n"
325                         "Also, ssleay32.dll and libeay32.dll will be required for the IRCd to run.\033[0m\n");
326         }
327
328         printf_c("\n\033[1;32mPre-build configuration is complete!\n\n");       sc(TNORMAL);
329
330         // dump all the options back out
331         printf_c("\033[0mBase install path:\033[1;32m        %s\n", base_path);
332         printf_c("\033[0mConfig path:\033[1;32m              %s\n", config_file);
333         printf_c("\033[0mModule path:\033[1;32m              %s\n", mod_path);
334         printf_c("\033[0mLibrary path:\033[1;32m             %s\n", library_dir);
335         printf_c("\033[0mSocket Engine:\033[1;32m            %s\n", use_iocp ? "iocp" : "select");
336         printf_c("\033[0mMax nickname length:\033[1;32m      %u\n", nicklen);
337         printf_c("\033[0mMax channel length:\033[1;32m       %u\n", chanlen);
338         printf_c("\033[0mMax mode length:\033[1;32m          %u\n", modechanges);
339         printf_c("\033[0mMax ident length:\033[1;32m         %u\n", identlen);
340         printf_c("\033[0mMax quit length:\033[1;32m          %u\n", quitlen);
341         printf_c("\033[0mMax topic length:\033[1;32m         %u\n", topiclen);
342         printf_c("\033[0mMax kick length:\033[1;32m          %u\n", kicklen);
343         printf_c("\033[0mMax name length:\033[1;32m          %u\n", rllen);
344         printf_c("\033[0mMax away length:\033[1;32m          %u\n", awaylen);
345         printf("\n"); sc(TNORMAL);
346         if(get_bool_option("Are these settings correct?", true) == false)
347         {
348                 Run();
349                 return;
350         }
351         printf("\n");
352
353         // escape the pathes
354         escape_string(config_file, MAX_PATH);
355         escape_string(mod_path, MAX_PATH);
356         escape_string(library_dir, MAX_PATH);
357
358         printf("\nWriting inspircd_config.h...");
359         FILE * f = fopen("inspircd_config.h", "w");
360         fprintf(f, "/* Auto generated by configure, do not modify! */\n");
361         fprintf(f, "#ifndef __CONFIGURATION_AUTO__\n");
362         fprintf(f, "#define __CONFIGURATION_AUTO__\n\n");
363         if(use_iocp)
364                 fprintf(f, "#define CONFIG_USE_IOCP 1\n\n");
365         if (ipv6)
366                 fprintf(f, "#define IPV6 1\n\n");
367
368         fprintf(f, "#define CONFIG_FILE \"%s/inspircd.conf\"\n", config_file);
369         fprintf(f, "#define MOD_PATH \"%s\"\n", mod_path);
370         fprintf(f, "#define SOMAXCONN_S \"128\"\n");
371         fprintf(f, "#define NICKMAX %u\n", nicklen+1);
372         fprintf(f, "#define CHANMAX %u\n", chanlen+1);
373         fprintf(f, "#define MAXMODES %u\n", modechanges);
374         fprintf(f, "#define IDENTMAX %u\n", identlen);
375         fprintf(f, "#define MAXQUIT %u\n", quitlen);
376         fprintf(f, "#define MAXTOPIC %u\n", topiclen);
377         fprintf(f, "#define MAXKICK %u\n", kicklen);
378         fprintf(f, "#define MAXGECOS %u\n", rllen);
379         fprintf(f, "#define MAXAWAY %u\n", awaylen);
380         fprintf(f, "#define LIBRARYDIR \"%s\"\n", library_dir);
381         fprintf(f, "#define VERSION \"%s\"\n", version);
382         fprintf(f, "#define REVISION \"%s\"\n", revision_text);
383         if(support_ip6links)
384                 fprintf(f, "#define SUPPORT_IP6LINKS 1\n");
385
386         OSVERSIONINFO vi;
387         vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
388         GetVersionEx(&vi);
389 #ifdef WIN64
390         fprintf(f, "#define SYSTEM \"Windows_x64 %u.%u.%u %s\"\n", vi.dwMajorVersion, vi.dwMinorVersion, vi.dwBuildNumber, vi.szCSDVersion);
391 #else
392         fprintf(f, "#define SYSTEM \"Windows_x32 %u.%u.%u %s\"\n", vi.dwMajorVersion, vi.dwMinorVersion, vi.dwBuildNumber, vi.szCSDVersion);
393 #endif
394         fprintf(f, "#define MAXBUF 514\n");
395
396         fprintf(f, "\n#include \"inspircd_win32wrapper.h\"\n\n");
397         fprintf(f, "#include \"threadengines/threadengine_win32.h\"\n\n");
398         fprintf(f, "#endif\n\n");
399         fclose(f);
400
401         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
402         printf("Writing inspircd_se_config.h...");
403
404         f = fopen("inspircd_se_config.h", "w");
405         fprintf(f, "/* Auto generated by configure, do not modify or commit to svn! */\n");
406         fprintf(f, "#ifndef __CONFIGURATION_SOCKETENGINE__\n");
407         fprintf(f, "#define __CONFIGURATION_SOCKETENGINE__\n\n");
408         fprintf(f, "#include \"socketengines/socketengine_%s.h\"\n\n", use_iocp ? "iocp" : "select");
409         fprintf(f, "#endif\n\n");
410         fclose(f);
411
412         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
413         printf("Writing command and module compilation scripts...");
414         WriteCompileCommands();
415         WriteCompileModules();
416         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
417
418         printf("\nconfigure is done.. exiting!\n");
419 }
420
421 void Rebase()
422 {
423         char dest[65535];
424         char command[65535];
425
426         *dest = 0;
427
428         WIN32_FIND_DATA fd;
429 #ifdef _DEBUG
430         HANDLE fh = FindFirstFile("..\\bin\\debug\\lib\\*.so", &fd);
431 #else
432         HANDLE fh = FindFirstFile("..\\bin\\release\\lib\\*.so", &fd);
433 #endif
434         if(fh == INVALID_HANDLE_VALUE)
435                 return;
436
437         do
438         {
439 #ifdef _DEBUG
440                 strcat(dest, " ..\\bin\\debug\\lib\\");
441 #else
442                 strcat(dest, " ..\\bin\\release\\lib\\");
443 #endif
444                 strcat(dest, fd.cFileName);
445         }
446         while (FindNextFile(fh, &fd));
447
448         FindClose(fh);
449
450         sprintf(command, "rebase.exe -v -b 10000000 -c baseaddr_commands.txt %s", dest);
451         printf("%s\n", command);
452         system(command);
453
454 #ifdef _DEBUG
455         fh = FindFirstFile("..\\bin\\debug\\modules\\*.so", &fd);
456 #else
457         fh = FindFirstFile("..\\bin\\release\\modules\\*.so", &fd);
458 #endif
459         if(fh == INVALID_HANDLE_VALUE)
460                 return;
461
462         *dest = 0;
463
464         do
465         {
466 #ifdef _DEBUG
467                 strcat(dest, " ..\\bin\\debug\\modules\\");
468 #else
469                 strcat(dest, " ..\\bin\\release\\modules\\");
470 #endif
471                 strcat(dest, fd.cFileName);
472         }
473         while (FindNextFile(fh, &fd));
474
475         sprintf(command, "rebase.exe -v -b 11000000 -c baseaddr_modules.txt %s", dest);
476         printf("%s\n", command);
477         system(command);
478
479         FindClose(fh);
480
481 }
482
483 void WriteCompileCommands()
484 {
485         char commands[300][100];
486         int command_count = 0;
487         printf("\n  Finding Command Sources...\n");
488         WIN32_FIND_DATA fd;
489         HANDLE fh = FindFirstFile("..\\src\\commands\\cmd_*.cpp", &fd);
490         if(fh == INVALID_HANDLE_VALUE)
491                 printf_c("\033[1;32m  No command sources could be found! This \033[1m*could*\033[1;32m be a bad thing.. :P\033[0m");
492         else
493         {
494                 sc(TGREEN);
495                 do 
496                 {
497                         strcpy(commands[command_count], fd.cFileName);
498                         commands[command_count][strlen(fd.cFileName) - 4] = 0;
499                         printf("        %s\n", commands[command_count]);
500                         ++command_count;
501                 } while(FindNextFile(fh, &fd));
502                 sc(TNORMAL);
503         }
504         
505         // Write our spiffy new makefile :D
506         // I am such a lazy fucker :P
507         FILE * f = fopen("..\\src\\commands\\commands.mak", "w");
508
509         time_t t = time(NULL);
510         fprintf(f, "# Generated at %s\n", ctime(&t));
511         fprintf(f, "all: makedir ");
512
513         // dump modules.. first time :)
514         for(int i = 0; i < command_count; ++i)
515                 fprintf(f, "%s.so ", commands[i]);
516
517         fprintf(f, "\n.cpp.obj:\n");
518 #ifdef WIN64
519         // /MACHINE:X64
520         #ifdef _DEBUG
521                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/commands\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MDd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug_x64\\bin\\inspircd.lib /OUT:\"..\\..\\bin\\debug_x64\\lib\\$*.so\" /PDB:\"..\\..\\bin\\debug_x64\\lib\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\debug_x64\\lib\\$*.lib\"\n\n");
522                 CreateDirectory("..\\src\\debug", NULL);
523                 CreateDirectory("..\\bin\\debug\\bin", NULL);
524                 CreateDirectory("..\\bin\\debug\\lib", NULL);
525                 CreateDirectory("..\\bin\\debug\\modules", NULL);
526         #else
527                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/commands\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /GL /MD /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release_x64\\bin\\inspircd.lib /OUT:\"..\\..\\bin\\release_x64\\lib\\$*.so\" /PDB:\"..\\..\\bin\\release_x64\\lib\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\release_x64\\lib\\$*.lib\"\n\n");
528                 CreateDirectory("..\\src\\release", NULL);
529                 CreateDirectory("..\\bin\\release\\bin", NULL);
530                 CreateDirectory("..\\bin\\release\\lib", NULL);
531                 CreateDirectory("..\\bin\\release\\modules", NULL);
532         #endif
533 #else
534         #ifdef _DEBUG
535                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/commands\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MDd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug\\bin\\inspircd.lib /OUT:\"..\\..\\bin\\debug\\lib\\$*.so\" /PDB:\"..\\..\\bin\\debug\\lib\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\debug\\lib\\$*.lib\"\n\n");
536                 CreateDirectory("..\\src\\debug", NULL);
537                 CreateDirectory("..\\bin\\debug\\bin", NULL);
538                 CreateDirectory("..\\bin\\debug\\lib", NULL);
539                 CreateDirectory("..\\bin\\debug\\modules", NULL);
540         #else
541                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/commands\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /GL /MD /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release\\bin\\inspircd.lib /OUT:\"..\\..\\bin\\release\\lib\\$*.so\" /PDB:\"..\\..\\bin\\release\\lib\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\release\\lib\\$*.lib\"\n\n");
542                 CreateDirectory("..\\src\\release", NULL);
543                 CreateDirectory("..\\bin\\release\\bin", NULL);
544                 CreateDirectory("..\\bin\\release\\lib", NULL);
545                 CreateDirectory("..\\bin\\release\\modules", NULL);
546         #endif
547 #endif
548
549 #ifdef _DEBUG
550         fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist ..\\..\\bin\\debug\\lib mkdir ..\\..\\bin\\debug\\lib\n\n");
551 #else
552         fprintf(f, "makedir:\n  if not exist release mkdir release\n  if not exist ..\\..\\bin\\release\\lib mkdir ..\\..\\bin\\release\\lib\n\n");
553 #endif
554         
555         // dump modules.. again the second and last time :)
556         for(int i = 0; i < command_count; ++i)
557                 fprintf(f, "%s.so : %s.obj\n", commands[i], commands[i]);
558
559         fprintf(f, "\n");
560         fclose(f);
561 }
562
563 void WriteCompileModules()
564 {
565         char modules[300][100];
566         int module_count = 0;
567
568         printf("Finding Modules...\n");
569         WIN32_FIND_DATA fd;
570         HANDLE fh = FindFirstFile("..\\src\\modules\\m_*.cpp", &fd);
571         if(fh == INVALID_HANDLE_VALUE)
572                 printf_c("\033[1;32m  No module sources could be found! This \033[1m*could*\033[1;32m be a bad thing.. :P\033[0m");
573         else
574         {
575                 sc(TGREEN);
576                 do 
577                 {
578                         strcpy(modules[module_count], fd.cFileName);
579                         modules[module_count][strlen(fd.cFileName) - 4] = 0;
580                         printf("  %s\n", modules[module_count]);
581                         ++module_count;
582                 } while(FindNextFile(fh, &fd));
583                 sc(TNORMAL);
584         }
585
586         // Write our spiffy new makefile :D
587         // I am such a lazy fucker :P
588         FILE * f = fopen("..\\src\\modules\\modules.mak", "w");
589
590         time_t t = time(NULL);
591         fprintf(f, "# Generated at %s\n", ctime(&t));
592         fprintf(f, "all: makedir ");
593
594         // dump modules.. first time :)
595         for(int i = 0; i < module_count; ++i)
596                 fprintf(f, "%s.so ", modules[i]);
597
598         fprintf(f, "\n.cpp.obj:\n");
599 #ifdef WIN64
600         // /MACHINE:X64
601         #ifdef _DEBUG
602                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MDd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug_x64\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\debug_x64\\modules\\$*.so\" /PDB:\"..\\..\\bin\\debug_x64\\modules\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\debug_x64\\modules\\$*.lib\"\n\n");
603                 CreateDirectory("..\\src\\modules\\debug_x64", NULL);
604         #else
605                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /GL /MD /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release_x64\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\release_x64\\modules\\$*.so\" /PDB:\"..\\..\\bin\\release_x64\\modules\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\release_x64\\modules\\$*.lib\"\n\n");
606                 CreateDirectory("..\\src\\modules\\release_x64", NULL);
607         #endif
608 #else
609         #ifdef _DEBUG
610                 fprintf(f, "  cl /nologo -Dssize_t=long /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /Gm /RTC1 /MDd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\debug\\modules\\$*.so\" /PDB:\"..\\..\\bin\\debug\\modules\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\debug\\modules\\$*.lib\"\n\n");
611                 CreateDirectory("..\\src\\modules\\debug", NULL);
612                 CreateDirectory("..\\src\\modules\\debug\\lib", NULL);
613                 CreateDirectory("..\\src\\modules\\debug\\modules", NULL);
614                 CreateDirectory("..\\src\\modules\\debug\\bin", NULL);
615         #else
616                 fprintf(f, "  cl /nologo -Dssize_t=long /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /EHsc /Gm /GL /MD /Fo\"Release/\" /Fd\"Release/vc70.pdb\" /W2 /Wp64 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\release\\modules\\$*.so\" /PDB:\"..\\..\\bin\\release\\modules\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\release\\modules\\$*.lib\"\n\n");
617                 CreateDirectory("..\\src\\modules\\release", NULL);
618                 CreateDirectory("..\\src\\modules\\release\\lib", NULL);
619                 CreateDirectory("..\\src\\modules\\release\\modules", NULL);
620                 CreateDirectory("..\\src\\modules\\release\\bin", NULL);
621         #endif
622 #endif
623         
624 #ifdef _DEBUG
625         fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist ..\\..\\bin\\debug\\modules mkdir ..\\..\\bin\\debug\\modules\n\n");
626 #else
627         fprintf(f, "makedir:\n  if not exist release mkdir release\n  if not exist ..\\..\\bin\\release\\modules mkdir ..\\..\\bin\\release\\modules\n\n");
628 #endif
629
630         // dump modules.. again the second and last time :)
631         for(int i = 0; i < module_count; ++i)
632                 fprintf(f, "%s.so : %s.obj\n", modules[i], modules[i]);
633
634         fprintf(f, "\n");
635         fclose(f);
636 }