]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - win/configure.cpp
Add extra stuff to compile threadengine_win32.cpp
[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
30 /* detects if we are running windows xp or higher (5.1) */
31 bool iswinxp()
32 {
33         OSVERSIONINFO vi;
34         vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
35         GetVersionEx(&vi);
36         if(vi.dwMajorVersion >= 5)
37                 return true;
38         
39         return false;
40 }
41
42 int get_int_option(const char * text, int def)
43 {
44         static char buffer[500];
45         int ret;
46         printf_c("%s\n[\033[1;32m%u\033[0m] -> ", text, def);
47         fgets(buffer, 500, stdin);
48         if(sscanf(buffer, "%u", &ret) != 1)
49                 ret = def;
50
51         printf("\n");
52         return ret;
53 }
54
55 bool get_bool_option(const char * text, bool def)
56 {
57         static char buffer[500];
58         char ret[100];
59         printf_c("%s [\033[1;32m%c\033[0m] -> ", text, def ? 'y' : 'n');
60         fgets(buffer, 500, stdin);
61         if(sscanf(buffer, "%s", ret) != 1)
62                 strcpy(ret, def ? "y" : "n");
63
64         printf("\n");
65         return !strncmp(ret, "y", 1);
66 }
67
68 void get_string_option(const char * text, char * def, char * buf)
69 {
70         static char buffer[500];
71         if (*def)
72                 printf_c("%s\n[\033[1;32m%s\033[0m] -> ", text, def);
73         else
74                 printf_c("%s\n[] -> ", text);
75         fgets(buffer, 500, stdin);
76         if(sscanf(buffer, "%s", buf) != 1)
77                 strcpy(buf, def);
78
79         printf("\n");
80 }
81
82 // escapes a string for use in a c++ file
83 bool escape_string(char * str, size_t size)
84 {
85         size_t len = strlen(str);
86         char * d_str = (char*)malloc(len * 2);
87     
88         size_t i = 0;
89         size_t j = 0;
90
91         for(; i < len; ++i)
92         {
93                 if(str[i] == '\\')
94                 {
95                         d_str[j++] = '\\';
96                         d_str[j++] = '\\';
97                 }
98                 else
99                 {
100                         d_str[j++] = str[i];
101                 }
102         }
103
104         d_str[j++] = 0;
105
106     if(j > size)
107         {
108                 free(d_str);
109                 return false;
110         }
111
112         strcpy(str, d_str);
113         free(d_str);
114         return true;
115 }
116
117 /* gets the svn revision */
118 int get_svn_revision(char * buffer, size_t len)
119 {
120         /* again.. I am lazy :p cbf to pipe output of svn info to us, so i'll just read the file */
121         /*
122         8
123
124         dir
125         7033
126         */
127         char buf[1000];
128         FILE * f = fopen("..\\.svn\\entries", "r");
129         if(!f) goto bad_rev;
130     
131         if(!fgets(buf, 1000, f)) goto bad_rev;
132         if(!fgets(buf, 1000, f)) goto bad_rev;
133         if(!fgets(buf, 1000, f)) goto bad_rev;
134         if(!fgets(buf, 1000, f)) goto bad_rev;
135         int rev = atoi(buf);
136         if(rev == 0) goto bad_rev;
137         sprintf(buffer, "%u", rev);
138         fclose(f);
139         return rev;
140         
141 bad_rev:
142         strcpy(buffer, "non-svn");
143         if(f) fclose(f);
144         return 0;
145 }
146
147 int __stdcall WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd )
148 {
149         FILE * j = fopen("inspircd_config.h", "r");
150         if (j)
151         {
152                 if (MessageBox(0, "inspircd_config.h already exists. Remove it and build from clean?", "Configure program", MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2) != IDYES)
153                 {
154                         fclose(j);
155                         exit(0);
156                 }
157         }
158
159         AllocConsole();
160
161         // pipe standard handles to this console
162         freopen("CONIN$", "r", stdin);
163         freopen("CONOUT$", "w", stdout);
164         freopen("CONOUT$", "w", stderr);
165
166         Banner();
167         Run();
168         FreeConsole();
169         return 0;
170 }
171
172 void Banner()
173 {
174         printf_c("\nWelcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)\n"
175                          "\033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m\n\n");
176         printf_c("*** If you are unsure of any of these values, leave it blank for    ***\n"
177                          "*** standard settings that will work, and your server will run      ***\n"
178                          "*** using them. Please consult your IRC network admin if in doubt.  ***\n\n"
179                          "Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter\n"
180                          "a new value. Please note: You will \033[1mHAVE\033[0m to read the docs\n"
181                          "dir, otherwise you won't have a config file!\n\n");
182
183 }
184
185 void Run()
186 {
187         int max_fd = 10200;
188         bool use_iocp = false;
189         bool support_ip6links = false;
190         bool use_openssl = false;
191         char mod_path[MAX_PATH];
192         char config_file[MAX_PATH];
193         char library_dir[MAX_PATH];
194         char base_path[MAX_PATH];
195         char bin_dir[MAX_PATH];
196         char revision_text[MAX_PATH];
197         char openssl_inc_path[MAX_PATH];
198         char openssl_lib_path[MAX_PATH];
199
200         int max_clients = 10200;
201         int nicklen = 31;
202         int chanlen = 64;
203         int modechanges = 20;
204         int identlen = 12;
205         int quitlen = 255;
206         int topiclen = 500;
207         int kicklen = 255;
208         int rllen = 128;
209         int awaylen = 200;
210         int revision = get_svn_revision(revision_text, MAX_PATH);
211         char version[514];
212
213         // grab version
214         FILE * fI = fopen("..\\src\\version.sh", "r");
215         if(fI)
216         {
217                 fgets(version, 514, fI);
218                 fgets(version, 514, fI);
219                 char * p2 = version;
220                 while(*p2 != '\"')
221                         ++p2;
222                 ++p2;
223                 strcpy(version, p2);
224                 p2 = version;
225                 while(*p2 != '\"')
226                         ++p2;
227                 *p2 = 0;
228                 fclose(fI);
229         }
230         else
231                 strcpy(version, "InspIRCD-Unknown");
232 #ifdef WIN64
233         printf_c("Your operating system is: \033[1;32mwindows_x64 \033[0m\n");
234 #else
235         printf_c("Your operating system is: \033[1;32mwindows_x32 \033[0m\n");
236 #endif
237         printf_c("InspIRCd revision ID: \033[1;32m%s \033[0m\n\n", revision ? revision_text : "(Non-SVN build)");
238
239         max_fd = get_int_option("What is the maximum file descriptor count you would like to allow?", 10200);
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         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)", 
252                 true);
253         
254         printf_c("\033[1mAll paths are relative to the binary directory.\033[0m\n");
255         get_string_option("In what directory do you wish to install the InspIRCd base?", "..", base_path);
256         get_string_option("In what directory are the configuration files?", "../conf", config_file);
257         get_string_option("In what directory are the modules to be compiled to?", "../modules", mod_path);
258         get_string_option("In what directory is the IRCd binary to be placed?", ".", bin_dir);
259         get_string_option("In what directory are the IRCd libraries to be placed?", "../lib", library_dir);
260
261         printf_c("The following questions will ask you for various figures relating\n"
262                 "To your IRCd install. Please note that these should usually be left\n"
263                 "as defaults unless you have a real reason to change them. If they\n"
264                 "changed, then the values must be identical on all servers on your\n"
265                 "network, or malfunctions and/or crashes may occur, with the exception\n"
266                 "of the 'maximum number of clients' setting which may be different on\n"
267                 "different servers on the network.\n\n");
268
269     
270         max_clients = get_int_option("Please enter the maximum number of clients at any one time?", 10200);
271         nicklen = get_int_option("Please enter the maximum length of nicknames?", 31);
272         chanlen = get_int_option("Please enter the maximum length of channel names?", 64);
273         modechanges = get_int_option("Please enter the maximum number of mode changes in one line?", 20);
274         identlen = get_int_option("Please enter the maximum length of an ident (username)?", 12);
275         quitlen = get_int_option("Please enter the maximum length of a quit message?", 255);
276         topiclen = get_int_option("Please enter the maximum length of a channel topic?", 307);
277         kicklen = get_int_option("Please enter the maximum length of a kick message?", 255);
278         rllen = get_int_option("Please enter the maximum length of a GECOS (real name)?", 128);
279         awaylen = get_int_option("Please enter the maximum length of an away message?", 200);
280
281         // NOTE: this may seem hackish (generating a batch build script), but it assures the user knows
282         // what they're doing, and we don't have to mess with copying files and changing around modules.mak
283         // for the extra libraries. --fez
284         // in case it exists, remove old m_ssl_openssl.cpp
285         remove("..\\src\\modules\\m_ssl_openssl.cpp");
286         printf_c("You can compile InspIRCd modules that add OpenSSL or GnuTLS support for SSL functionality.\n"
287                 "To do so you will need the appropriate link libraries and header files on your system.\n");
288         use_openssl = get_bool_option("Would you like to compile the IRCd with OpenSSL support?", false);
289         if (use_openssl)
290         {
291                 get_string_option("Please enter the full path to your OpenSSL include directory\n"
292                         "(e.g., C:\\openssl\\include, but NOT the openssl subdirectory under include\\)\n"
293                         "(also, path should not end in '\\')",
294                         "C:\\openssl\\include", openssl_inc_path);
295
296                 // NOTE: if inspircd ever changes so that it compiles with /MT instead of the /MTd switch, then
297                 // the dependency on libeay32mtd.lib and ssleay32mtd.lib will change to just libeay32.lib and
298                 // ssleay32.lib. --fez
299
300                 get_string_option("Please enter the full path to your OpenSSL library directory\n"
301                         "(e.g., C:\\openssl\\lib, which should contain libeay32mtd.lib and ssleay32mtd.lib)",
302                         "C:\\openssl\\lib", openssl_lib_path);
303
304                 // write batch file
305                 FILE *fp = fopen("compile_openssl.bat", "w");
306                 fprintf(fp, "@echo off\n");
307                 fprintf(fp, "echo This batch script compiles m_ssl_openssl for InspIRCd.\n");
308                 fprintf(fp, "echo NOTE: this batch file should be invoked from the Visual Studio Command Prompt (vsvars32.bat)\n");
309                 fprintf(fp, "set OPENSSL_INC_PATH=\"%s\"\n", openssl_inc_path);
310                 fprintf(fp, "set OPENSSL_LIB_PATH=\"%s\"\n", openssl_lib_path);
311                 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");
312                 fprintf(fp, "cd ..\\src\\modules\n");
313                 fprintf(fp, "copy extra\\m_ssl_openssl.cpp .\n");
314                 fprintf(fp, "echo \t%%COMPILE%%\n");
315                 fprintf(fp, "%%COMPILE%%\n");
316                 fprintf(fp, "cd ..\\..\\win\n");
317                 fprintf(fp, "echo done... now check for errors.\n");
318                 fclose(fp);
319
320                 printf_c("\033[1;32m!!!NOTICE!!! The file 'compile_openssl.bat' has been written to your 'win' directory.  Launch it\n"
321                         "!!! from the Visual Studio Command Prompt !!! to compile the m_ssl_openssl module.\n"
322                         "Wait until after compiling inspircd to run it.\n"
323                         "Also, ssleay32.dll and libeay32.dll will be required for the IRCd to run.\033[0m\n");
324         }
325
326         printf_c("\n\033[1;32mPre-build configuration is complete!\n\n");       sc(TNORMAL);
327
328         // dump all the options back out
329         printf_c("\033[0mBase install path:\033[1;32m        %s\n", base_path);
330         printf_c("\033[0mConfig path:\033[1;32m              %s\n", config_file);
331         printf_c("\033[0mModule path:\033[1;32m              %s\n", mod_path);
332         printf_c("\033[0mLibrary path:\033[1;32m             %s\n", library_dir);
333         printf_c("\033[0mSocket Engine:\033[1;32m            %s\n", use_iocp ? "iocp" : "select");
334         printf_c("\033[0mMax file descriptors:\033[1;32m     %u\n", max_fd);
335         printf_c("\033[0mMax connections:\033[1;32m          %u\n", max_clients);
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
366         fprintf(f, "#define CONFIG_FILE \"%s/inspircd.conf\"\n", config_file);
367         fprintf(f, "#define MOD_PATH \"%s\"\n", mod_path);
368         fprintf(f, "#define MAX_DESCRIPTORS %u\n", max_fd);
369         fprintf(f, "#define MAXCLIENTS %u\n", max_clients);
370         fprintf(f, "#define MAXCLIENTS_S \"%u\"\n", max_clients);
371         fprintf(f, "#define SOMAXCONN_S \"128\"\n");
372         fprintf(f, "#define NICKMAX %u\n", nicklen+1);
373         fprintf(f, "#define CHANMAX %u\n", chanlen+1);
374         fprintf(f, "#define MAXMODES %u\n", modechanges);
375         fprintf(f, "#define IDENTMAX %u\n", identlen);
376         fprintf(f, "#define MAXQUIT %u\n", quitlen);
377         fprintf(f, "#define MAXTOPIC %u\n", topiclen);
378         fprintf(f, "#define MAXKICK %u\n", kicklen);
379         fprintf(f, "#define MAXGECOS %u\n", rllen);
380         fprintf(f, "#define MAXAWAY %u\n", awaylen);
381         fprintf(f, "#define LIBRARYDIR \"%s\"\n", library_dir);
382         fprintf(f, "#define VERSION \"%s\"\n", version);
383         fprintf(f, "#define REVISION \"%s\"\n", revision_text);
384         if(support_ip6links)
385                 fprintf(f, "#define SUPPORT_IP6LINKS 1\n");
386
387         OSVERSIONINFO vi;
388         vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
389         GetVersionEx(&vi);
390 #ifdef WIN64
391         fprintf(f, "#define SYSTEM \"Windows_x64 %u.%u.%u %s\"\n", vi.dwMajorVersion, vi.dwMinorVersion, vi.dwBuildNumber, vi.szCSDVersion);
392 #else
393         fprintf(f, "#define SYSTEM \"Windows_x32 %u.%u.%u %s\"\n", vi.dwMajorVersion, vi.dwMinorVersion, vi.dwBuildNumber, vi.szCSDVersion);
394 #endif
395         fprintf(f, "#define MAXBUF 514\n");
396
397         fprintf(f, "\n#include \"inspircd_win32wrapper.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, "#include \"threadengines/threadengine_win32.h\"\n\n");
410         fprintf(f, "#endif\n\n");
411         fclose(f);
412
413         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
414         printf("Writing command and module compilation scripts...");
415         WriteCompileCommands();
416         WriteCompileModules();
417         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
418
419         printf("\nconfigure is done.. exiting!\n");
420 }
421
422 void WriteCompileCommands()
423 {
424         char commands[300][100];
425         int command_count = 0;
426         printf("\n  Finding Command Sources...\n");
427         WIN32_FIND_DATA fd;
428         HANDLE fh = FindFirstFile("..\\src\\commands\\cmd_*.cpp", &fd);
429         if(fh == INVALID_HANDLE_VALUE)
430                 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");
431         else
432         {
433                 sc(TGREEN);
434                 do 
435                 {
436                         strcpy(commands[command_count], fd.cFileName);
437                         commands[command_count][strlen(fd.cFileName) - 4] = 0;
438                         printf("    %s\n", commands[command_count]);
439                         ++command_count;
440                 } while(FindNextFile(fh, &fd));
441                 sc(TNORMAL);
442         }
443     
444         // Write our spiffy new makefile :D
445         // I am such a lazy fucker :P
446         FILE * f = fopen("..\\src\\commands\\commands.mak", "w");
447
448         time_t t = time(NULL);
449         fprintf(f, "# Generated at %s\n", ctime(&t));
450         fprintf(f, "all: makedir ");
451
452         // dump modules.. first time :)
453         for(int i = 0; i < command_count; ++i)
454                 fprintf(f, "%s.so ", commands[i]);
455
456         fprintf(f, "\n.cpp.obj:\n");
457 #ifdef WIN64
458         // /MACHINE:X64
459         #ifdef _DEBUG
460                 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 /MTd /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");
461                 CreateDirectory("..\\src\\debug", NULL);
462                 CreateDirectory("..\\bin\\debug\\bin", NULL);
463                 CreateDirectory("..\\bin\\debug\\lib", NULL);
464                 CreateDirectory("..\\bin\\debug\\modules", NULL);
465         #else
466                 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 /MT /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");
467                 CreateDirectory("..\\src\\release", NULL);
468                 CreateDirectory("..\\bin\\release\\bin", NULL);
469                 CreateDirectory("..\\bin\\release\\lib", NULL);
470                 CreateDirectory("..\\bin\\release\\modules", NULL);
471         #endif
472 #else
473         #ifdef _DEBUG
474                 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 /MTd /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");
475                 CreateDirectory("..\\src\\debug", NULL);
476                 CreateDirectory("..\\bin\\debug\\bin", NULL);
477                 CreateDirectory("..\\bin\\debug\\lib", NULL);
478                 CreateDirectory("..\\bin\\debug\\modules", NULL);
479         #else
480                 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 /MT /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");
481                 CreateDirectory("..\\src\\release", NULL);
482                 CreateDirectory("..\\bin\\release\\bin", NULL);
483                 CreateDirectory("..\\bin\\release\\lib", NULL);
484                 CreateDirectory("..\\bin\\release\\modules", NULL);
485         #endif
486 #endif
487
488         fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist release mkdir release\n\n");
489         
490         // dump modules.. again the second and last time :)
491         for(int i = 0; i < command_count; ++i)
492                 fprintf(f, "%s.so : %s.obj\n", commands[i], commands[i]);
493
494         fprintf(f, "\n");
495         fclose(f);
496 }
497
498 void WriteCompileModules()
499 {
500         char modules[300][100];
501         int module_count = 0;
502
503         printf("Finding Modules...\n");
504         WIN32_FIND_DATA fd;
505         HANDLE fh = FindFirstFile("..\\src\\modules\\m_*.cpp", &fd);
506         if(fh == INVALID_HANDLE_VALUE)
507                 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");
508         else
509         {
510                 sc(TGREEN);
511                 do 
512                 {
513                         strcpy(modules[module_count], fd.cFileName);
514                         modules[module_count][strlen(fd.cFileName) - 4] = 0;
515                         printf("  %s\n", modules[module_count]);
516                         ++module_count;
517                 } while(FindNextFile(fh, &fd));
518                 sc(TNORMAL);
519         }
520
521         // Write our spiffy new makefile :D
522         // I am such a lazy fucker :P
523         FILE * f = fopen("..\\src\\modules\\modules.mak", "w");
524
525         time_t t = time(NULL);
526         fprintf(f, "# Generated at %s\n", ctime(&t));
527         fprintf(f, "all: makedir ");
528
529         // dump modules.. first time :)
530         for(int i = 0; i < module_count; ++i)
531                 fprintf(f, "%s.so ", modules[i]);
532
533         fprintf(f, "\n.cpp.obj:\n");
534 #ifdef WIN64
535         // /MACHINE:X64
536         #ifdef _DEBUG
537                 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 /MTd /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");
538                 CreateDirectory("..\\src\\modules\\debug_x64", NULL);
539         #else
540                 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 /MT /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");
541                 CreateDirectory("..\\src\\modules\\release_x64", NULL);
542         #endif
543 #else
544         #ifdef _DEBUG
545                 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 /MTd /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");
546                 CreateDirectory("..\\src\\modules\\debug", NULL);
547                 CreateDirectory("..\\src\\modules\\debug\\lib", NULL);
548                 CreateDirectory("..\\src\\modules\\debug\\modules", NULL);
549                 CreateDirectory("..\\src\\modules\\debug\\bin", NULL);
550         #else
551                 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 /MT /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");
552                 CreateDirectory("..\\src\\modules\\release", NULL);
553                 CreateDirectory("..\\src\\modules\\release\\lib", NULL);
554                 CreateDirectory("..\\src\\modules\\release\\modules", NULL);
555                 CreateDirectory("..\\src\\modules\\release\\bin", NULL);
556         #endif
557 #endif
558         
559         fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist release mkdir release\n\n");
560
561         // dump modules.. again the second and last time :)
562         for(int i = 0; i < module_count; ++i)
563                 fprintf(f, "%s.so : %s.obj\n", modules[i], modules[i]);
564
565         fprintf(f, "\n");
566         fclose(f);
567 }