Annotation of embedaddon/php/win32/build/confutils.js, revision 1.1.1.1
1.1 misho 1: // Utils for configure script
2: /*
3: +----------------------------------------------------------------------+
4: | PHP Version 5 |
5: +----------------------------------------------------------------------+
6: | Copyright (c) 1997-2008 The PHP Group |
7: +----------------------------------------------------------------------+
8: | This source file is subject to version 3.01 of the PHP license, |
9: | that is bundled with this package in the file LICENSE, and is |
10: | available through the world-wide-web at the following url: |
11: | http://www.php.net/license/3_01.txt |
12: | If you did not receive a copy of the PHP license and are unable to |
13: | obtain it through the world-wide-web, please send a note to |
14: | license@php.net so we can mail you a copy immediately. |
15: +----------------------------------------------------------------------+
16: | Author: Wez Furlong <wez@thebrainroom.com> |
17: +----------------------------------------------------------------------+
18: */
19:
20: // $Id: confutils.js,v 1.60.2.1.2.8.2.33 2009-05-29 07:43:07 kalle Exp $
21:
22: var STDOUT = WScript.StdOut;
23: var STDERR = WScript.StdErr;
24: var WshShell = WScript.CreateObject("WScript.Shell");
25: var FSO = WScript.CreateObject("Scripting.FileSystemObject");
26: var MFO = null;
27: var SYSTEM_DRIVE = WshShell.Environment("Process").Item("SystemDrive");
28: var PROGRAM_FILES = WshShell.Environment("Process").Item("ProgramFiles");
29: var DSP_FLAGS = new Array();
30: var PHP_SRC_DIR=FSO.GetParentFolderName(WScript.ScriptFullName);
31:
32: /* Store the enabled extensions (summary + QA check) */
33: var extensions_enabled = new Array();
34:
35: /* Store the SAPI enabled (summary + QA check) */
36: var sapi_enabled = new Array();
37:
38: /* Store the headers to install */
39: var headers_install = new Array();
40:
41: /* Mapping CL version > human readable name */
42: var VC_VERSIONS = new Array();
43: VC_VERSIONS[1200] = 'MSVC6 (Visual C++ 6.0)';
44: VC_VERSIONS[1300] = 'MSVC7 (Visual C++ 2002)';
45: VC_VERSIONS[1310] = 'MSVC7.1 (Visual C++ 2003)';
46: VC_VERSIONS[1400] = 'MSVC8 (Visual C++ 2005)';
47: VC_VERSIONS[1500] = 'MSVC9 (Visual C++ 2008)';
48: VC_VERSIONS[1600] = 'MSVC10 (Visual C++ 2010)';
49:
50: var VC_VERSIONS_SHORT = new Array();
51: VC_VERSIONS_SHORT[1200] = 'VC6';
52: VC_VERSIONS_SHORT[1300] = 'VC7';
53: VC_VERSIONS_SHORT[1310] = 'VC7.1';
54: VC_VERSIONS_SHORT[1400] = 'VC8';
55: VC_VERSIONS_SHORT[1500] = 'VC9';
56: VC_VERSIONS_SHORT[1600] = 'VC10';
57:
58: if (PROGRAM_FILES == null) {
59: PROGRAM_FILES = "C:\\Program Files";
60: }
61:
62: if (MODE_PHPIZE) {
63: if (!FSO.FileExists("config.w32")) {
64: STDERR.WriteLine("Must be run from the root of the extension source");
65: WScript.Quit(10);
66: }
67: } else {
68: if (!FSO.FileExists("README.SVN-RULES")) {
69: STDERR.WriteLine("Must be run from the root of the php source");
70: WScript.Quit(10);
71: }
72: }
73:
74: var CWD = WshShell.CurrentDirectory;
75:
76: if (typeof(CWD) == "undefined") {
77: CWD = FSO.GetParentFolderName(FSO.GetAbsolutePathName("README.SVN-RULES"));
78: }
79:
80: /* defaults; we pick up the precise versions from configure.in */
81: var PHP_VERSION = 5;
82: var PHP_MINOR_VERSION = 0;
83: var PHP_RELEASE_VERSION = 0;
84: var PHP_EXTRA_VERSION = "";
85: var PHP_VERSION_STRING = "5.0.0";
86:
87: function get_version_numbers()
88: {
89: var cin = file_get_contents("configure.in");
90:
91: if (cin.match(new RegExp("PHP_MAJOR_VERSION=(\\d+)"))) {
92: PHP_VERSION = RegExp.$1;
93: }
94: if (cin.match(new RegExp("PHP_MINOR_VERSION=(\\d+)"))) {
95: PHP_MINOR_VERSION = RegExp.$1;
96: }
97: if (cin.match(new RegExp("PHP_RELEASE_VERSION=(\\d+)"))) {
98: PHP_RELEASE_VERSION = RegExp.$1;
99: }
100: PHP_VERSION_STRING = PHP_VERSION + "." + PHP_MINOR_VERSION + "." + PHP_RELEASE_VERSION;
101:
102: if (cin.match(new RegExp("PHP_EXTRA_VERSION=\"([^\"]+)\""))) {
103: PHP_EXTRA_VERSION = RegExp.$1;
104: if (PHP_EXTRA_VERSION.length) {
105: PHP_VERSION_STRING += PHP_EXTRA_VERSION;
106: }
107: }
108: DEFINE('PHP_VERSION_STRING', PHP_VERSION_STRING);
109: }
110:
111: configure_args = new Array();
112: configure_subst = WScript.CreateObject("Scripting.Dictionary");
113:
114: configure_hdr = WScript.CreateObject("Scripting.Dictionary");
115: build_dirs = new Array();
116:
117: extension_include_code = "";
118: extension_module_ptrs = "";
119:
120: if (!MODE_PHPIZE) {
121: get_version_numbers();
122: }
123:
124: /* execute a command and return the output as a string */
125: function execute(command_line)
126: {
127: var e = WshShell.Exec(command_line);
128: var ret = "";
129:
130: ret = e.StdOut.ReadAll();
131:
132: //STDOUT.WriteLine("command " + command_line);
133: //STDOUT.WriteLine(ret);
134:
135: return ret;
136: }
137:
138: function probe_binary(EXE, what)
139: {
140: // tricky escapes to get stderr redirection to work
141: var command = 'cmd /c ""' + EXE;
142: if (what == "version") {
143: command = command + '" -v"';
144: }
145: var version = execute(command + '" 2>&1"');
146:
147: if (what == "64") {
148: if (version.match(/x64/)) {
149: return 1;
150: }
151: } else {
152: if (version.match(/(\d+\.\d+(\.\d+)?(\.\d+)?)/)) {
153: return RegExp.$1;
154: }
155: }
156: return 0;
157: }
158:
159: function condense_path(path)
160: {
161: path = FSO.GetAbsolutePathName(path);
162:
163: if (path.substr(0, CWD.length).toLowerCase()
164: == CWD.toLowerCase() &&
165: (path.charCodeAt(CWD.length) == 92 || path.charCodeAt(CWD.length) == 47)) {
166: return path.substr(CWD.length + 1);
167: }
168:
169: var a = CWD.split("\\");
170: var b = path.split("\\");
171: var i, j;
172:
173: for (i = 0; i < b.length; i++) {
174: if (a[i].toLowerCase() == b[i].toLowerCase())
175: continue;
176: if (i > 0) {
177: /* first difference found */
178: path = "";
179: for (j = 0; j < a.length - i; j++) {
180: path += "..\\";
181: }
182: for (j = i; j < b.length; j++) {
183: path += b[j];
184: if (j < b.length - 1)
185: path += "\\";
186: }
187: return path;
188: }
189: /* on a different drive */
190: break;
191: }
192:
193: return path;
194: }
195:
196: function ConfigureArg(type, optname, helptext, defval)
197: {
198: var opptype = type == "enable" ? "disable" : "without";
199:
200: if (defval == "yes" || defval == "yes,shared") {
201: this.arg = "--" + opptype + "-" + optname;
202: this.imparg = "--" + type + "-" + optname;
203: } else {
204: this.arg = "--" + type + "-" + optname;
205: this.imparg = "--" + opptype + "-" + optname;
206: }
207:
208: this.optname = optname;
209: this.helptext = helptext;
210: this.defval = defval;
211: this.symval = optname.toUpperCase().replace(new RegExp("-", "g"), "_");
212: this.seen = false;
213: this.argval = defval;
214: }
215:
216: function ARG_WITH(optname, helptext, defval)
217: {
218: configure_args[configure_args.length] = new ConfigureArg("with", optname, helptext, defval);
219: }
220:
221: function ARG_ENABLE(optname, helptext, defval)
222: {
223: configure_args[configure_args.length] = new ConfigureArg("enable", optname, helptext, defval);
224: }
225:
226: function analyze_arg(argval)
227: {
228: var ret = new Array();
229: var shared = false;
230:
231: if (argval == "shared") {
232: shared = true;
233: argval = "yes";
234: } else if (argval == null) {
235: /* nothing */
236: } else if (arg_match = argval.match(new RegExp("^shared,(.*)"))) {
237: shared = true;
238: argval = arg_match[1];
239: } else if (arg_match = argval.match(new RegExp("^(.*),shared$"))) {
240: shared = true;
241: argval = arg_match[1];
242: }
243:
244: ret[0] = shared;
245: ret[1] = argval;
246: return ret;
247: }
248:
249: function word_wrap_and_indent(indent, text, line_suffix, indent_char)
250: {
251: if (text == null) {
252: return "";
253: }
254:
255: var words = text.split(new RegExp("\\s+", "g"));
256: var i = 0;
257: var ret_text = "";
258: var this_line = "";
259: var t;
260: var space = "";
261: var lines = 0;
262:
263: if (line_suffix == null) {
264: line_suffix = "";
265: }
266:
267: if (indent_char == null) {
268: indent_char = " ";
269: }
270:
271: for (i = 0; i < indent; i++) {
272: space += indent_char;
273: }
274:
275: for (i = 0; i < words.length; i++) {
276: if (this_line.length) {
277: t = this_line + " " + words[i];
278: } else {
279: t = words[i];
280: }
281:
282: if (t.length + indent > 78) {
283: if (lines++) {
284: ret_text += space;
285: }
286: ret_text += this_line + line_suffix + "\r\n";
287: this_line = "";
288: }
289:
290: if (this_line.length) {
291: this_line += " " + words[i];
292: } else {
293: this_line = words[i];
294: }
295: }
296:
297: if (this_line.length) {
298: if (lines)
299: ret_text += space;
300: ret_text += this_line;
301: }
302:
303: return ret_text;
304: }
305:
306: function conf_process_args()
307: {
308: var i, j;
309: var configure_help_mode = false;
310: var analyzed = false;
311: var nice = "cscript /nologo configure.js ";
312: var disable_all = false;
313:
314: args = WScript.Arguments;
315: for (i = 0; i < args.length; i++) {
316: arg = args(i);
317: nice += ' "' + arg + '"';
318: if (arg == "--help") {
319: configure_help_mode = true;
320: break;
321: }
322: if (arg == "--disable-all") {
323: disable_all = true;
324: continue;
325: }
326:
327: // If it is --foo=bar, split on the equals sign
328: arg = arg.split("=", 2);
329: argname = arg[0];
330: if (arg.length > 1) {
331: argval = arg[1];
332: } else {
333: argval = null;
334: }
335:
336: // Find the arg
337: found = false;
338: for (j = 0; j < configure_args.length; j++) {
339: if (argname == configure_args[j].imparg || argname == configure_args[j].arg) {
340: found = true;
341:
342: arg = configure_args[j];
343: arg.seen = true;
344:
345: analyzed = analyze_arg(argval);
346:
347: /* Force shared when called after phpize */
348: if (MODE_PHPIZE) {
349: shared = "shared";
350: } else {
351: shared = analyzed[0];
352: }
353: argval = analyzed[1];
354:
355: if (argname == arg.imparg) {
356: /* we matched the implicit, or default arg */
357: if (argval == null) {
358: argval = arg.defval;
359: }
360: } else {
361: /* we matched the non-default arg */
362: if (argval == null) {
363: argval = arg.defval == "no" ? "yes" : "no";
364: }
365: }
366:
367: arg.argval = argval;
368: eval("PHP_" + arg.symval + " = argval;");
369: eval("PHP_" + arg.symval + "_SHARED = shared;");
370: break;
371: }
372: }
373: if (!found) {
374: STDERR.WriteLine("Unknown option " + argname + "; please try configure.js --help for a list of valid options");
375: WScript.Quit(2);
376: }
377: }
378:
379: if (configure_help_mode) {
380: STDOUT.WriteLine(word_wrap_and_indent(0,
381: "Options that enable extensions and SAPI will accept \
382: 'yes' or 'no' as a parameter. They also accept 'shared' \
383: as a synonym for 'yes' and request a shared build of that \
384: module. Not all modules can be built as shared modules; \
385: configure will display [shared] after the module name if \
386: can be built that way. \
387: "
388: ));
389: STDOUT.WriteBlankLines(1);
390:
391: // Measure width to pretty-print the output
392: max_width = 0;
393: for (i = 0; i < configure_args.length; i++) {
394: arg = configure_args[i];
395: if (arg.arg.length > max_width)
396: max_width = arg.arg.length;
397: }
398:
399: for (i = 0; i < configure_args.length; i++) {
400: arg = configure_args[i];
401:
402: n = max_width - arg.arg.length;
403: pad = " ";
404: for (j = 0; j < n; j++) {
405: pad += " ";
406: }
407: STDOUT.WriteLine(" " + arg.arg + pad + word_wrap_and_indent(max_width + 5, arg.helptext));
408: }
409: WScript.Quit(1);
410: }
411:
412: var snapshot_build_exclusions = new Array(
413: 'debug', 'crt-debug', 'lzf-better-compression',
414: 'php-build', 'snapshot-template', 'ereg',
415: 'pcre-regex', 'fastcgi', 'force-cgi-redirect',
416: 'path-info-check', 'zts', 'ipv6', 'memory-limit',
417: 'zend-multibyte', 'fd-setsize', 'memory-manager', 't1lib'
418: );
419: var force;
420:
421: // Now set any defaults we might have missed out earlier
422: for (i = 0; i < configure_args.length; i++) {
423: arg = configure_args[i];
424: if (arg.seen)
425: continue;
426: analyzed = analyze_arg(arg.defval);
427: shared = analyzed[0];
428: argval = analyzed[1];
429:
430: // Don't trust a default "yes" answer for a non-core module
431: // in a snapshot build
432: if (PHP_SNAPSHOT_BUILD != "no" && argval == "yes" && !shared) {
433:
434: force = true;
435: for (j = 0; j < snapshot_build_exclusions.length; j++) {
436: if (snapshot_build_exclusions[j] == arg.optname) {
437: force = false;
438: break;
439: }
440: }
441:
442: if (force) {
443: /* now check if it is a core module */
444: force = false;
445: for (j = 0; j < core_module_list.length; j++) {
446: if (core_module_list[j] == arg.optname) {
447: force = true;
448: break;
449: }
450: }
451:
452: if (!force) {
453: STDOUT.WriteLine("snapshot: forcing " + arg.arg + " shared");
454: shared = true;
455: }
456: }
457: }
458:
459: if (PHP_SNAPSHOT_BUILD != "no" && argval == "no") {
460: force = true;
461: for (j = 0; j < snapshot_build_exclusions.length; j++) {
462: if (snapshot_build_exclusions[j] == arg.optname) {
463: force = false;
464: break;
465: }
466: }
467: if (force) {
468: STDOUT.WriteLine("snapshot: forcing " + arg.optname + " on");
469: argval = "yes";
470: shared = true;
471: }
472: }
473:
474: if (disable_all) {
475: force = true;
476: for (j = 0; j < snapshot_build_exclusions.length; j++) {
477: if (snapshot_build_exclusions[j] == arg.optname) {
478: force = false;
479: break;
480: }
481: }
482: if (force) {
483: if (arg.defval == '') {
484: argval = '';
485: } else {
486: argval = "no";
487: }
488: shared = false;
489: }
490: }
491:
492: eval("PHP_" + arg.symval + " = argval;");
493: eval("PHP_" + arg.symval + "_SHARED = shared;");
494: }
495:
496: MFO = FSO.CreateTextFile("Makefile.objects", true);
497:
498: STDOUT.WriteLine("Saving configure options to config.nice.bat");
499: var nicefile = FSO.CreateTextFile("config.nice.bat", true);
500: nicefile.WriteLine(nice + " %*");
501: nicefile.Close();
502:
503: AC_DEFINE('CONFIGURE_COMMAND', nice, "Configure line");
504: }
505:
506: function DEFINE(name, value)
507: {
508: if (configure_subst.Exists(name)) {
509: configure_subst.Remove(name);
510: }
511: configure_subst.Add(name, value);
512: }
513:
514: // Searches a set of paths for a file;
515: // returns the dir in which the file was found,
516: // true if it was found in the default env path,
517: // or false if it was not found at all.
518: // env_name is the optional name of an env var
519: // specifying the default path to search
520: function search_paths(thing_to_find, explicit_path, env_name)
521: {
522: var i, found = false, place = false, file, env;
523:
524: STDOUT.Write("Checking for " + thing_to_find + " ... ");
525:
526: thing_to_find = thing_to_find.replace(new RegExp("/", "g"), "\\");
527:
528: if (explicit_path != null) {
529: if (typeof(explicit_path) == "string") {
530: explicit_path = explicit_path.split(";");
531: }
532:
533: for (i = 0; i < explicit_path.length; i++) {
534: file = glob(explicit_path[i] + "\\" + thing_to_find);
535: if (file) {
536: found = true;
537: place = file[0];
538: place = place.substr(0, place.length - thing_to_find.length - 1);
539: break;
540: }
541: }
542: }
543:
544: if (!found && env_name != null) {
545: env = WshShell.Environment("Process").Item(env_name);
546: env = env.split(";");
547: for (i = 0; i < env.length; i++) {
548: file = glob(env[i] + "\\" + thing_to_find);
549: if (file) {
550: found = true;
551: place = true;
552: break;
553: }
554: }
555: }
556:
557: if (found && place == true) {
558: STDOUT.WriteLine(" <in default path>");
559: } else if (found) {
560: STDOUT.WriteLine(" " + place);
561: } else {
562: STDOUT.WriteLine(" <not found>");
563: }
564: return place;
565: }
566:
567: function PATH_PROG(progname, additional_paths, symbol)
568: {
569: var exe;
570: var place;
571: var cyg_path = PHP_CYGWIN + "\\bin;" + PHP_CYGWIN + "\\usr\\local\\bin";
572: var php_build_bin_path = PHP_PHP_BUILD + "\\bin"
573:
574: exe = progname + ".exe";
575:
576: if (additional_paths == null) {
577: additional_paths = cyg_path;
578: } else {
579: additional_paths += ";" + cyg_path;
580: }
581:
582: additional_paths = additional_paths + ";" + php_build_bin_path;
583:
584: place = search_paths(exe, additional_paths, "PATH");
585:
586: if (place == true) {
587: place = exe;
588: } else if (place != false) {
589: place = place + "\\" + exe;
590: }
591:
592: if (place) {
593: if (symbol == null) {
594: symbol = progname.toUpperCase();
595: }
596: DEFINE(symbol, place);
597: }
598: return place;
599: }
600:
601: function find_pattern_in_path(pattern, path)
602: {
603: if (path == null) {
604: return false;
605: }
606:
607: var dirs = path.split(';');
608: var i;
609: var items;
610:
611: for (i = 0; i < dirs.length; i++) {
612: items = glob(dirs[i] + "\\" + pattern);
613: if (items) {
614: return condense_path(items[0]);
615: }
616: }
617: return false;
618: }
619:
620: function CHECK_LIB(libnames, target, path_to_check, common_name)
621: {
622: STDOUT.Write("Checking for library " + libnames + " ... ");
623:
624: if (common_name == null && target != null) {
625: common_name = target;
626: }
627:
628: if (path_to_check == null) {
629: path_to_check = "";
630: }
631:
632: // if they specified a common name for the package that contains
633: // the library, tag some useful defaults on to the end of the
634: // path to be searched
635: if (common_name != null) {
636: path_to_check += ";" + PHP_PHP_BUILD + "\\" + common_name + "*";
637: path_to_check += ";" + PHP_PHP_BUILD + "\\lib\\" + common_name + "*";
638: path_to_check += ";..\\" + common_name + "*";
639: }
640:
641: // Determine target for build flags
642: if (target == null) {
643: target = "";
644: } else {
645: target = "_" + target.toUpperCase();
646: }
647:
648: // Expand path to include general dirs
649: path_to_check += ";" + php_usual_lib_suspects;
650:
651: // It is common practice to put libs under one of these dir names
652: var subdirs = new Array(PHP_DEBUG == "yes" ? "Debug" : (PHP_DEBUG_PACK == "yes"?"Release_Dbg":"Release"), "lib", "libs", "libexec");
653:
654: // libnames can be ; separated list of accepted library names
655: libnames = libnames.split(';');
656:
657: // for debug builds, lib may have _debug appended, we want that first
658: if (PHP_DEBUG == "yes") {
659: var length = libnames.length;
660: for (var i = 0; i < length; i++) {
661: var name = new String(libnames[i]);
662: rExp = /.lib$/i;
663: name = name.replace(rExp,"_debug.lib");
664: libnames.unshift(name);
665: }
666: }
667:
668: var i, j, k, libname;
669: var location = false;
670: var path = path_to_check.split(';');
671:
672: for (i = 0; i < libnames.length; i++) {
673: libname = libnames[i];
674:
675: for (k = 0; k < path.length; k++) {
676: location = glob(path[k] + "\\" + libname);
677: if (location) {
678: location = location[0];
679: break;
680: }
681: for (j = 0; j < subdirs.length; j++) {
682: location = glob(path[k] + "\\" + subdirs[j] + "\\" + libname);
683: if (location) {
684: location = location[0];
685: break;
686: }
687: }
688: if (location)
689: break;
690: }
691:
692: if (location) {
693: location = condense_path(location);
694: var libdir = FSO.GetParentFolderName(location);
695: libname = FSO.GetFileName(location);
696: ADD_FLAG("LDFLAGS" + target, '/libpath:"' + libdir + '" ');
697: ADD_FLAG("LIBS" + target, libname);
698:
699: STDOUT.WriteLine(location);
700:
701: return location;
702: }
703:
704: // Check in their standard lib path
705: location = find_pattern_in_path(libname, WshShell.Environment("Process").Item("LIB"));
706:
707: if (location) {
708: location = condense_path(location);
709: libname = FSO.GetFileName(location);
710: ADD_FLAG("LIBS" + target, libname);
711:
712: STDOUT.WriteLine("<in LIB path> " + libname);
713: return location;
714: }
715:
716: // Check in their general extra libs path
717: location = find_pattern_in_path(libname, PHP_EXTRA_LIBS);
718: if (location) {
719: location = condense_path(location);
720: libname = FSO.GetFileName(location);
721: ADD_FLAG("LIBS" + target, libname);
722: STDOUT.WriteLine("<in extra libs path>");
723: return location;
724: }
725: }
726:
727: STDOUT.WriteLine("<not found>");
728:
729: return false;
730: }
731:
732: function OLD_CHECK_LIB(libnames, target, path_to_check)
733: {
734: if (target == null) {
735: target = "";
736: } else {
737: target = "_" + target.toUpperCase();
738: }
739:
740: if (path_to_check == null) {
741: path_to_check = php_usual_lib_suspects;
742: } else {
743: path_to_check += ";" + php_usual_lib_suspects;
744: }
745: var have = 0;
746: var p;
747: var i;
748: var libname;
749:
750: var subdir = PHP_DEBUG == "yes" ? "Debug" : (PHP_DEBUG_PACK == "yes"?"Release_Dbg":"Release");
751:
752: libnames = libnames.split(';');
753: for (i = 0; i < libnames.length; i++) {
754: libname = libnames[i];
755: p = search_paths(libname, path_to_check, "LIB");
756:
757: if (!p) {
758: p = search_paths(subdir + "\\" + libname, path_to_check, "LIB");
759: if (p) {
760: p += "\\" + subdir;
761: }
762: }
763:
764: if (typeof(p) == "string") {
765: ADD_FLAG("LDFLAGS" + target, '/libpath:"' + p + '" ');
766: ADD_FLAG("LIBS" + target, libname);
767: have = 1;
768: } else if (p == true) {
769: ADD_FLAG("LIBS" + target, libname);
770: have = 1;
771: } else {
772: /* not found in the defaults or the explicit paths,
773: * so check the general extra libs; if we find
774: * it here, no need to add another /libpath: for it as we
775: * already have it covered, but we need to add the lib
776: * to LIBS_XXX */
777: if (false != search_paths(libname, PHP_EXTRA_LIBS, null)) {
778: ADD_FLAG("LIBS" + target, libname);
779: have = 1;
780: }
781: }
782:
783: if (have) {
784: break;
785: }
786: }
787:
788: // AC_DEFINE("HAVE_" + header_name.toUpperCase().replace(new RegExp("/\\\\-\.", "g"), "_"), have);
789:
790: return have;
791:
792: }
793:
794: function CHECK_FUNC_IN_HEADER(header_name, func_name, path_to_check, add_to_flag)
795: {
796: var c = false;
797: var sym;
798:
799: STDOUT.Write("Checking for " + func_name + " in " + header_name + " ... ");
800:
801: c = GREP_HEADER(header_name, func_name, path_to_check);
802:
803: sym = func_name.toUpperCase();
804: sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");
805:
806: if (typeof(add_to_flag) == "undefined") {
807: AC_DEFINE("HAVE_" + sym, c ? 1 : 0);
808: } else {
809: ADD_FLAG(add_to_flag, "/DHAVE_" + sym + "=" + (c ? "1" : "0"));
810: }
811:
812: if (c) {
813: STDOUT.WriteLine("OK");
814: return c;
815: }
816: STDOUT.WriteLine("No");
817: return false;
818: }
819:
820: function GREP_HEADER(header_name, regex, path_to_check)
821: {
822: var c = false;
823:
824: if (FSO.FileExists(path_to_check + "\\" + header_name)) {
825: c = file_get_contents(path_to_check + "\\" + header_name);
826: }
827:
828: if (!c) {
829: /* look in the include path */
830:
831: var p = search_paths(header_name, path_to_check, "INCLUDE");
832: if (typeof(p) == "string") {
833: c = file_get_contents(p);
834: } else if (p == false) {
835: p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);
836: if (typeof(p) == "string") {
837: c = file_get_contents(p);
838: }
839: }
840: if (!c) {
841: return false;
842: }
843: }
844:
845: if (typeof(regex) == "string") {
846: regex = new RegExp(regex);
847: }
848:
849: if (c.match(regex)) {
850: /* caller can now use RegExp.$1 etc. to get at patterns */
851: return true;
852: }
853: return false;
854: }
855:
856: function CHECK_HEADER_ADD_INCLUDE(header_name, flag_name, path_to_check, use_env, add_dir_part, add_to_flag_only)
857: {
858: var dir_part_to_add = "";
859:
860: if (use_env == null) {
861: use_env = true;
862: }
863:
864: // if true, add the dir part of the header_name to the include path
865: if (add_dir_part == null) {
866: add_dir_part = false;
867: } else if (add_dir_part) {
868: var basename = FSO.GetFileName(header_name);
869: dir_part_to_add = "\\" + header_name.substr(0, header_name.length - basename.length - 1);
870: }
871:
872: if (path_to_check == null) {
873: path_to_check = php_usual_include_suspects;
874: } else {
875: path_to_check += ";" + php_usual_include_suspects;
876: }
877:
878: var p = search_paths(header_name, path_to_check, use_env ? "INCLUDE" : null);
879: var have = 0;
880: var sym;
881:
882: if (typeof(p) == "string") {
883: ADD_FLAG(flag_name, '/I "' + p + dir_part_to_add + '" ');
884: } else if (p == false) {
885: /* not found in the defaults or the explicit paths,
886: * so check the general extra includes; if we find
887: * it here, no need to add another /I for it as we
888: * already have it covered, unless we are adding
889: * the dir part.... */
890: p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);
891: if (typeof(p) == "string" && add_dir_part) {
892: ADD_FLAG(flag_name, '/I "' + p + dir_part_to_add + '" ');
893: }
894: }
895: have = p ? 1 : 0
896:
897: sym = header_name.toUpperCase();
898: sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");
899:
900: if (typeof(add_to_flag_only) == "undefined" &&
901: flag_name.match(new RegExp("^CFLAGS_(.*)$"))) {
902: add_to_flag_only = true;
903: }
904:
905: if (typeof(add_to_flag_only) != "undefined") {
906: ADD_FLAG(flag_name, "/DHAVE_" + sym + "=" + have);
907: } else {
908: AC_DEFINE("HAVE_" + sym, have, "have the " + header_name + " header file");
909: }
910:
911: return p;
912: }
913:
914: /* emits rule to generate version info for a SAPI
915: * or extension. Returns the name of the .res file
916: * that will be generated */
917: function generate_version_info_resource(makefiletarget, basename, creditspath, sapi)
918: {
919: var resname = makefiletarget + ".res";
920: var res_desc = makefiletarget;
921: var res_prod_name = "PHP " + makefiletarget;
922: var credits;
923: var thanks = "";
924: var logo = "";
925: var debug = "";
926: var project_url = "http://www.php.net";
927: var project_header = creditspath + "/php_" + basename + ".h";
928: var versioning = "";
929:
930: if (sapi) {
931: var internal_name = basename.toUpperCase() + " SAPI";
932: } else {
933: var internal_name = basename.toUpperCase() + " extension";
934: }
935:
936: if (FSO.FileExists(creditspath + '/CREDITS')) {
937: credits = FSO.OpenTextFile(creditspath + '/CREDITS', 1);
938: res_desc = credits.ReadLine();
939: try {
940: thanks = credits.ReadLine();
941: } catch (e) {
942: thanks = null;
943: }
944: if (thanks == null) {
945: thanks = "";
946: } else {
947: thanks = "Thanks to " + thanks;
948: }
949: credits.Close();
950: }
951:
952: if (creditspath.match(new RegExp("pecl"))) {
953: /* PECL project url - this will eventually work correctly for all */
954: project_url = "http://pecl.php.net/" + basename;
955:
956: /* keep independent versioning PECL-specific for now */
957: if (FSO.FileExists(project_header)) {
958: if (header = FSO.OpenTextFile(project_header, 1)) {
959: contents = header.ReadAll();
960: /* allowed: x.x.x[a|b|-alpha|-beta][RCx][-dev] */
961: if (contents.match(new RegExp('PHP_' + basename.toUpperCase() + '_VERSION(\\s+)"((\\d+\.\\d+(\.\\d+)?)((a|b)(\\d)?|\-[a-z]{3,5})?(RC\\d+)?(\-dev)?)'))) {
962: project_version = RegExp.$2;
963: file_version = RegExp.$3.split('.');
964: if (!file_version[2]) {
965: file_version[2] = 0;
966: }
967: versioning = '\\"" /d EXT_FILE_VERSION=' + file_version[0] + ',' + file_version[1] + ',' + file_version[2] + ' /d EXT_VERSION="\\"' + project_version;
968: }
969: header.Close();
970: }
971: }
972: }
973:
974: if (makefiletarget.match(new RegExp("\\.exe$"))) {
975: logo = " /d WANT_LOGO ";
976: }
977:
978: if (PHP_DEBUG != "no") {
979: debug = " /d _DEBUG";
980: }
981:
982: /**
983: * Use user supplied template.rc if it exists
984: */
985: if (FSO.FileExists(creditspath + '\\template.rc')) {
986: MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": " + creditspath + "\\template.rc");
987: MFO.WriteLine("\t$(RC) /fo $(BUILD_DIR)\\" + resname + logo + debug +
988: ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"' +
989: makefiletarget + '\\"" /d PRODUCT_NAME="\\"' + res_prod_name +
990: versioning + '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" ' +
991: creditspath + '\\template.rc');
992: return resname;
993: }
994: if (MODE_PHPIZE) {
995: MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": $(PHP_DIR)\\build\\template.rc");
996: MFO.WriteLine("\t$(RC) /I $(PHP_DIR)/include /n /fo $(BUILD_DIR)\\" + resname + logo + debug +
997: ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'
998: + makefiletarget + '\\"" /d URL="\\"' + project_url +
999: '\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning +
1000: '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" $(PHP_DIR)\\build\\template.rc');
1001: } else {
1002: MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": win32\\build\\template.rc");
1003: MFO.WriteLine("\t$(RC) /n /fo $(BUILD_DIR)\\" + resname + logo + debug +
1004: ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'
1005: + makefiletarget + '\\"" /d URL="\\"' + project_url +
1006: '\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning +
1007: '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" win32\\build\\template.rc');
1008: }
1009: MFO.WriteBlankLines(1);
1010: return resname;
1011: }
1012:
1013: function SAPI(sapiname, file_list, makefiletarget, cflags, obj_dir)
1014: {
1015: var SAPI = sapiname.toUpperCase();
1016: var ldflags;
1017: var resname;
1018: var ld;
1019: var manifest;
1020:
1021: if (typeof(obj_dir) == "undefined") {
1022: sapiname_for_printing = configure_module_dirname;
1023: } else {
1024: sapiname_for_printing = configure_module_dirname + " (via " + obj_dir + ")";
1025: }
1026:
1027: STDOUT.WriteLine("Enabling SAPI " + sapiname_for_printing);
1028:
1029: MFO.WriteBlankLines(1);
1030: MFO.WriteLine("# objects for SAPI " + sapiname);
1031: MFO.WriteBlankLines(1);
1032:
1033: if (cflags) {
1034: ADD_FLAG('CFLAGS_' + SAPI, cflags);
1035: }
1036:
1037: ADD_SOURCES(configure_module_dirname, file_list, sapiname, obj_dir);
1038: MFO.WriteBlankLines(1);
1039: MFO.WriteLine("# SAPI " + sapiname);
1040: MFO.WriteBlankLines(1);
1041:
1042: /* generate a .res file containing version information */
1043: resname = generate_version_info_resource(makefiletarget, sapiname, configure_module_dirname, true);
1044:
1045: MFO.WriteLine(makefiletarget + ": $(BUILD_DIR)\\" + makefiletarget);
1046: MFO.WriteLine("\t@echo SAPI " + sapiname_for_printing + " build complete");
1047: if (MODE_PHPIZE) {
1048: MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(BUILD_DIR)\\" + resname);
1049: } else {
1050: MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
1051: }
1052:
1053: if (makefiletarget.match(new RegExp("\\.dll$"))) {
1054: ldflags = "/dll $(LDFLAGS)";
1055: manifest = "-@$(_VC_MANIFEST_EMBED_DLL)";
1056: } else if (makefiletarget.match(new RegExp("\\.lib$"))) {
1057: ldflags = "$(LDFLAGS)";
1058: ld = "$(MAKE_LIB)";
1059: } else {
1060: ldflags = "$(LDFLAGS)";
1061: manifest = "-@$(_VC_MANIFEST_EMBED_EXE)";
1062: }
1063:
1064: if (MODE_PHPIZE) {
1065: if (ld) {
1066: MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);
1067: } else {
1068: ld = "@$(CC)";
1069: MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");
1070: }
1071: } else {
1072: if (ld) {
1073: MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);
1074: } else {
1075: ld = "@$(CC)";
1076: MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");
1077: }
1078: }
1079:
1080: if (manifest) {
1081: MFO.WriteLine("\t" + manifest);
1082: }
1083:
1084: DEFINE('CFLAGS_' + SAPI + '_OBJ', '$(CFLAGS_' + SAPI + ')');
1085:
1086: if (configure_module_dirname.match("pecl")) {
1087: ADD_FLAG("PECL_TARGETS", makefiletarget);
1088: } else {
1089: ADD_FLAG("SAPI_TARGETS", makefiletarget);
1090: }
1091:
1092: if (PHP_DSP != "no") {
1093: generate_dsp_file(sapiname, configure_module_dirname, file_list, false);
1094: }
1095:
1096: MFO.WriteBlankLines(1);
1097: sapi_enabled[sapi_enabled.length] = [sapiname];
1098: }
1099:
1100: function ADD_DIST_FILE(filename)
1101: {
1102: if (configure_module_dirname.match("pecl")) {
1103: ADD_FLAG("PECL_EXTRA_DIST_FILES", filename);
1104: } else {
1105: ADD_FLAG("PHP_EXTRA_DIST_FILES", filename);
1106: }
1107: }
1108:
1109: function file_get_contents(filename)
1110: {
1111: var f, c;
1112: try {
1113: f = FSO.OpenTextFile(filename, 1);
1114: c = f.ReadAll();
1115: f.Close();
1116: return c;
1117: } catch (e) {
1118: STDOUT.WriteLine("Problem reading " + filename);
1119: return false;
1120: }
1121: }
1122:
1123: // Add a dependency on another extension, so that
1124: // the dependencies are built before extname
1125: function ADD_EXTENSION_DEP(extname, dependson, optional)
1126: {
1127: var EXT = extname.toUpperCase();
1128: var DEP = dependson.toUpperCase();
1129: var dep_present = false;
1130: var dep_shared = false;
1131:
1132: if (MODE_PHPIZE) {
1133: ext_deps_js = file_get_contents(PHP_DIR + "\\script\\ext_deps.js");
1134: eval(ext_deps_js);
1135: }
1136:
1137: try {
1138: dep_present = eval("PHP_" + DEP);
1139:
1140: if (dep_present != "no") {
1141: try {
1142: dep_shared = eval("PHP_" + DEP + "_SHARED");
1143: } catch (e) {
1144: dep_shared = false;
1145: }
1146: }
1147:
1148: } catch (e) {
1149: dep_present = "no";
1150: }
1151:
1152: if (optional) {
1153: if (dep_present == "no") {
1154: MESSAGE("\t" + dependson + " not found: " + dependson + " support in " + extname + " disabled");
1155: return false;
1156: }
1157: }
1158:
1159: var ext_shared = eval("PHP_" + EXT + "_SHARED");
1160:
1161: if (dep_shared) {
1162: if (!ext_shared) {
1163: if (optional) {
1164: MESSAGE("\tstatic " + extname + " cannot depend on shared " + dependson + ": " + dependson + "support disabled");
1165: return false;
1166: }
1167: ERROR("static " + extname + " cannot depend on shared " + dependson);
1168: }
1169:
1170: ADD_FLAG("LDFLAGS_" + EXT, "/libpath:$(BUILD_DIR)");
1171: ADD_FLAG("LIBS_" + EXT, "php_" + dependson + ".lib");
1172: ADD_FLAG("DEPS_" + EXT, "$(BUILD_DIR)\\php_" + dependson + ".lib");
1173:
1174: } else {
1175:
1176: if (dep_present == "no") {
1177: if (ext_shared) {
1178: WARNING(extname + " cannot be built: missing dependency, " + dependson + " not found");
1179:
1180: var dllname = ' php_' + extname + '.dll';
1181:
1182: if (!REMOVE_TARGET(dllname, 'EXT_TARGETS')) {
1183: REMOVE_TARGET(dllname, 'PECL_TARGETS');
1184: }
1185:
1186: return false;
1187:
1188: }
1189:
1190: ERROR("Cannot build " + extname + "; " + dependson + " not enabled");
1191: return false;
1192: }
1193: } // dependency is statically built-in to PHP
1194: return true;
1195: }
1196:
1197: function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir)
1198: {
1199: var objs = null;
1200: var EXT = extname.toUpperCase();
1201: var extname_for_printing;
1202:
1203: if (shared == null) {
1204: eval("shared = PHP_" + EXT + "_SHARED;");
1205: } else {
1206: eval("PHP_" + EXT + "_SHARED = shared;");
1207: }
1208:
1209: if (cflags == null) {
1210: cflags = "";
1211: }
1212:
1213: if (typeof(obj_dir) == "undefined") {
1214: extname_for_printing = configure_module_dirname;
1215: } else {
1216: extname_for_printing = configure_module_dirname + " (via " + obj_dir + ")";
1217: }
1218:
1219: if (shared) {
1220: STDOUT.WriteLine("Enabling extension " + extname_for_printing + " [shared]");
1221: cflags = "/D COMPILE_DL_" + EXT + " /D " + EXT + "_EXPORTS=1 " + cflags;
1222: ADD_FLAG("CFLAGS_PHP", "/D COMPILE_DL_" + EXT);
1223: } else {
1224: STDOUT.WriteLine("Enabling extension " + extname_for_printing);
1225: }
1226:
1227: MFO.WriteBlankLines(1);
1228: MFO.WriteLine("# objects for EXT " + extname);
1229: MFO.WriteBlankLines(1);
1230:
1231:
1232: ADD_SOURCES(configure_module_dirname, file_list, extname, obj_dir);
1233:
1234: MFO.WriteBlankLines(1);
1235:
1236: if (shared) {
1237: if (dllname == null) {
1238: dllname = "php_" + extname + ".dll";
1239: }
1240: var libname = dllname.substring(0, dllname.length-4) + ".lib";
1241:
1242: var resname = generate_version_info_resource(dllname, extname, configure_module_dirname, false);
1243: var ld = "@$(CC)";
1244:
1245: MFO.WriteLine("$(BUILD_DIR)\\" + libname + ": $(BUILD_DIR)\\" + dllname);
1246: MFO.WriteBlankLines(1);
1247: if (MODE_PHPIZE) {
1248: MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(PHPLIB) $(BUILD_DIR)\\" + resname);
1249: MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");
1250: } else {
1251: MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
1252: MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");
1253: }
1254: MFO.WriteLine("\t-@$(_VC_MANIFEST_EMBED_DLL)");
1255: MFO.WriteBlankLines(1);
1256:
1257: if (configure_module_dirname.match("pecl")) {
1258: ADD_FLAG("PECL_TARGETS", dllname);
1259: } else {
1260: ADD_FLAG("EXT_TARGETS", dllname);
1261: }
1262: MFO.WriteLine(dllname + ": $(BUILD_DIR)\\" + dllname);
1263: MFO.WriteLine("\t@echo EXT " + extname + " build complete");
1264: MFO.WriteBlankLines(1);
1265:
1266: DEFINE('CFLAGS_' + EXT + '_OBJ', '$(CFLAGS_' + EXT + ')');
1267: } else {
1268: ADD_FLAG("STATIC_EXT_OBJS", "$(" + EXT + "_GLOBAL_OBJS)");
1269: ADD_FLAG("STATIC_EXT_LIBS", "$(LIBS_" + EXT + ")");
1270: ADD_FLAG("STATIC_EXT_LDFLAGS", "$(LDFLAGS_" + EXT + ")");
1271: ADD_FLAG("STATIC_EXT_CFLAGS", "$(CFLAGS_" + EXT + ")");
1272:
1273: /* find the header that declares the module pointer,
1274: * so we can include it in internal_functions.c */
1275: var ext_dir = FSO.GetFolder(configure_module_dirname);
1276: var fc = new Enumerator(ext_dir.Files);
1277: var re = /\.h$/;
1278: var s, c;
1279: for (; !fc.atEnd(); fc.moveNext()) {
1280: s = fc.item() + "";
1281: if (s.match(re)) {
1282: c = file_get_contents(s);
1283: if (c.match("phpext_")) {
1284: extension_include_code += '#include "' + configure_module_dirname + '/' + FSO.GetFileName(s) + '"\r\n';
1285: }
1286: }
1287: }
1288:
1289: extension_module_ptrs += '\tphpext_' + extname + '_ptr,\r\n';
1290:
1291: DEFINE('CFLAGS_' + EXT + '_OBJ', '$(CFLAGS_PHP) $(CFLAGS_' + EXT + ')');
1292: }
1293: ADD_FLAG("CFLAGS_" + EXT, cflags);
1294:
1295: if (PHP_DSP != "no") {
1296: generate_dsp_file(extname, configure_module_dirname, file_list, shared);
1297: }
1298:
1299: extensions_enabled[extensions_enabled.length] = [extname, shared ? 'shared' : 'static'];
1300: }
1301:
1302: function ADD_SOURCES(dir, file_list, target, obj_dir)
1303: {
1304: var i;
1305: var tv;
1306: var src, obj, sym, flags;
1307:
1308: if (target == null) {
1309: target = "php";
1310: }
1311:
1312: sym = target.toUpperCase() + "_GLOBAL_OBJS";
1313: flags = "CFLAGS_" + target.toUpperCase() + '_OBJ';
1314:
1315: if (configure_subst.Exists(sym)) {
1316: tv = configure_subst.Item(sym);
1317: } else {
1318: tv = "";
1319: }
1320:
1321: file_list = file_list.split(new RegExp("\\s+"));
1322: file_list.sort();
1323:
1324: var re = new RegExp("\.[a-z0-9A-Z]+$");
1325:
1326: dir = dir.replace(new RegExp("/", "g"), "\\");
1327: var objs_line = "";
1328: var srcs_line = "";
1329:
1330: var sub_build = "$(BUILD_DIR)\\";
1331:
1332: /* if module dir is not a child of the main source dir,
1333: * we need to tweak it; we should have detected such a
1334: * case in condense_path and rewritten the path to
1335: * be relative.
1336: * This probably breaks for non-sibling dirs, but that
1337: * is not a problem as buildconf only checks for pecl
1338: * as either a child or a sibling */
1339: if (obj_dir == null) {
1340: var build_dir = dir.replace(new RegExp("^..\\\\"), "");
1341: var mangle_dir = build_dir.replace(new RegExp("[\\\\/.-]", "g"), "_");
1342: var bd_flags_name = "CFLAGS_BD_" + mangle_dir.toUpperCase();
1343: }
1344: else {
1345: var build_dir = obj_dir.replace(new RegExp("^..\\\\"), "");
1346: var mangle_dir = build_dir.replace(new RegExp("[\\\\/.-]", "g"), "_");
1347: var bd_flags_name = "CFLAGS_BD_" + mangle_dir.toUpperCase();
1348: }
1349:
1350: var dirs = build_dir.split("\\");
1351: var i, d = "";
1352: for (i = 0; i < dirs.length; i++) {
1353: d += dirs[i];
1354: build_dirs[build_dirs.length] = d;
1355: d += "\\";
1356: }
1357: sub_build += d;
1358:
1359:
1360: DEFINE(bd_flags_name, " /Fd" + sub_build + " /Fp" + sub_build + " /FR" + sub_build + " ");
1361:
1362: for (i in file_list) {
1363: src = file_list[i];
1364: obj = src.replace(re, ".obj");
1365: tv += " " + sub_build + obj;
1366:
1367: if (!MODE_PHPIZE && PHP_ONE_SHOT == "yes") {
1368: if (i > 0) {
1369: objs_line += " " + sub_build + obj;
1370: srcs_line += " " + dir + "\\" + src;
1371: } else {
1372: objs_line = sub_build + obj;
1373: srcs_line = dir + "\\" + src;
1374: }
1375: } else {
1376: MFO.WriteLine(sub_build + obj + ": " + dir + "\\" + src);
1377: MFO.WriteLine("\t@$(CC) $(" + flags + ") $(CFLAGS) $(" + bd_flags_name + ") /c " + dir + "\\" + src + " /Fo" + sub_build + obj);
1378: }
1379: }
1380:
1381: if (!MODE_PHPIZE && PHP_ONE_SHOT == "yes") {
1382: MFO.WriteLine(objs_line + ": " + srcs_line);
1383: MFO.WriteLine("\t$(CC) $(" + flags + ") $(CFLAGS) /Fo" + sub_build + " $(" + bd_flags_name + ") /c " + srcs_line);
1384: }
1385:
1386: DEFINE(sym, tv);
1387: }
1388:
1389: function REMOVE_TARGET(dllname, flag)
1390: {
1391: var dllname = dllname.replace(/\s/g, "");
1392: var EXT = dllname.replace(/php_(\S+)\.dll/, "$1").toUpperCase();
1393: var php_flags = configure_subst.Item("CFLAGS_PHP");
1394:
1395: if (configure_subst.Exists(flag)) {
1396: var targets = configure_subst.Item(flag);
1397:
1398: if (targets.match(dllname)) {
1399: configure_subst.Remove(flag);
1400: targets = targets.replace(dllname, "");
1401: targets = targets.replace(/\s+/, " ");
1402: targets = targets.replace(/\s$/, "");
1403: configure_subst.Add(flag, targets);
1404: configure_hdr.Add("HAVE_" + EXT, new Array(0, ""));
1405: configure_subst.Item("CFLAGS_PHP") = php_flags.replace(" /D COMPILE_DL_" + EXT, "");
1406: extensions_enabled.pop();
1407: return true;
1408: }
1409: }
1410: return false;
1411: }
1412:
1413: function generate_internal_functions()
1414: {
1415: var infile, outfile;
1416: var indata;
1417:
1418: STDOUT.WriteLine("Generating main/internal_functions.c");
1419:
1420: infile = FSO.OpenTextFile("main/internal_functions.c.in", 1);
1421: indata = infile.ReadAll();
1422: infile.Close();
1423:
1424: indata = indata.replace("@EXT_INCLUDE_CODE@", extension_include_code);
1425: indata = indata.replace("@EXT_MODULE_PTRS@", extension_module_ptrs);
1426:
1427: if (FSO.FileExists("main/internal_functions.c")) {
1428: var origdata = file_get_contents("main/internal_functions.c");
1429:
1430: if (origdata == indata) {
1431: STDOUT.WriteLine("\t[content unchanged; skipping]");
1432: return;
1433: }
1434: }
1435:
1436: outfile = FSO.CreateTextFile("main/internal_functions.c", true);
1437: outfile.Write(indata);
1438: outfile.Close();
1439: }
1440:
1441: function output_as_table(header, ar_out)
1442: {
1443: var l = header.length;
1444: var cols = 80;
1445: var fixedlenght = "";
1446: var t = 0;
1447: var i,j,k,m;
1448: var out = "| ";
1449: var min = new Array(l);
1450: var max = new Array(l);
1451:
1452: if (l != ar_out[0].length) {
1453: STDOUT.WriteLine("Invalid header argument, can't output the table " + l + " " + ar_out[0].length );
1454: return;
1455: }
1456:
1457: for (j=0; j < l; j++) {
1458: var tmax, tmin;
1459:
1460: /*Figure out the max length per column */
1461: tmin = 0;
1462: tmax = 0;
1463: for (k = 0; k < ar_out.length; k++) {
1464: var t = ar_out[k][j].length;
1465: if (t > tmax) tmax = t;
1466: else if (t < tmin) tmin = t;
1467: }
1468: if (tmax > header[j].length) {
1469: max[j] = tmax;
1470: } else {
1471: max[j] = header[j].length;
1472: }
1473: if (tmin < header[j].length) {
1474: min[j] = header[j].length;
1475: }
1476: }
1477:
1478: sep = "";
1479: k = 0;
1480: for (i = 0; i < l; i++) {
1481: k += max[i] + 3;
1482: }
1483: k++;
1484:
1485: for (j=0; j < k; j++) {
1486: sep += "-";
1487: }
1488:
1489: STDOUT.WriteLine(sep);
1490: out = "|";
1491: for (j=0; j < l; j++) {
1492: out += " " + header[j];
1493: for (var i = 0; i < (max[j] - header[j].length); i++){
1494: out += " ";
1495: }
1496: out += " |";
1497: }
1498: STDOUT.WriteLine(out);
1499:
1500: STDOUT.WriteLine(sep);
1501:
1502: out = "|";
1503: for (i=0; i < ar_out.length; i++) {
1504: line = ar_out[i];
1505: for (j=0; j < l; j++) {
1506: out += " " + line[j];
1507: for (var k = 0; k < (max[j] - line[j].length); k++){
1508: out += " ";
1509: }
1510: out += " |";
1511: }
1512: STDOUT.WriteLine(out);
1513: out = "|";
1514: }
1515:
1516: STDOUT.WriteLine(sep);
1517: }
1518:
1519: function write_summary()
1520: {
1521: var ar = new Array();
1522:
1523: STDOUT.WriteBlankLines(2);
1524:
1525: STDOUT.WriteLine("Enabled extensions:");
1526: output_as_table(["Extension", "Mode"], extensions_enabled.sort());
1527: STDOUT.WriteBlankLines(2);
1528: if (!MODE_PHPIZE) {
1529: STDOUT.WriteLine("Enabled SAPI:");
1530: output_as_table(["Sapi Name"], sapi_enabled);
1531: STDOUT.WriteBlankLines(2);
1532: }
1533: ar[0] = ['Build type', PHP_DEBUG == "yes" ? "Debug" : "Release"];
1534: ar[1] = ['Thread Safety', PHP_ZTS == "yes" ? "Yes" : "No"];
1535: ar[2] = ['Compiler', VC_VERSIONS[VCVERS]];
1536: ar[3] = ['Architecture', X64 ? 'x64' : 'x86'];
1537:
1538: output_as_table(["",""], ar);
1539: STDOUT.WriteBlankLines(2);
1540: }
1541:
1542: function generate_files()
1543: {
1544: var i, dir, bd, last;
1545:
1546: STDOUT.WriteBlankLines(1);
1547: STDOUT.WriteLine("Creating build dirs...");
1548: dir = get_define("BUILD_DIR");
1549: build_dirs.sort();
1550: last = null;
1551:
1552: if (!FSO.FolderExists(dir)) {
1553: FSO.CreateFolder(dir);
1554: }
1555:
1556: for (i = 0; i < build_dirs.length; i++) {
1557: bd = FSO.BuildPath(dir, build_dirs[i]);
1558: if (bd == last) {
1559: continue;
1560: }
1561: last = bd;
1562:
1563: build_dir = get_define('BUILD_DIR');
1564: build_dir = build_dir.replace(new RegExp("\\\\", "g"), "\\\\");
1565: if (build_dir.substr(build_dir.Length - 2, 2) != '\\\\') {
1566: build_dir += '\\\\';
1567: }
1568: ADD_FLAG("BUILD_DIRS_SUB", bd.replace(new RegExp(build_dir), ''));
1569:
1570: if (!FSO.FolderExists(bd)) {
1571: FSO.CreateFolder(bd);
1572: }
1573: }
1574:
1575: if (PHP_DSP != "no") {
1576: generate_dsp_file("TSRM", "TSRM", null, false);
1577: generate_dsp_file("Zend", "Zend", null, false);
1578: generate_dsp_file("win32", "win32", null, false);
1579: generate_dsp_file("main", "main", null, false);
1580: generate_dsp_file("streams", "main\\streams", null, false);
1581: copy_dsp_files();
1582: }
1583:
1584: STDOUT.WriteLine("Generating files...");
1585: generate_makefile();
1586: if (!MODE_PHPIZE) {
1587: generate_internal_functions();
1588: generate_config_h();
1589: generate_phpize();
1590: }
1591: STDOUT.WriteLine("Done.");
1592: STDOUT.WriteBlankLines(1);
1593: write_summary();
1594:
1595: if (PHP_SNAPSHOT_BUILD != "no") {
1596: STDOUT.WriteLine("Type 'nmake snap' to build a PHP snapshot");
1597: } else {
1598: STDOUT.WriteLine("Type 'nmake' to build PHP");
1599: }
1600: }
1601:
1602: function generate_config_h()
1603: {
1604: var infile, outfile;
1605: var indata;
1606: var prefix;
1607:
1608: prefix = PHP_PREFIX.replace(new RegExp("\\\\", "g"), "\\\\");
1609:
1610: STDOUT.WriteLine("Generating main/config.w32.h");
1611:
1612: infile = FSO.OpenTextFile("win32/build/config.w32.h.in", 1);
1613: indata = infile.ReadAll();
1614: infile.Close();
1615:
1616: outfile = FSO.CreateTextFile("main/config.w32.h", true);
1617:
1618: indata = indata.replace(new RegExp("@PREFIX@", "g"), prefix);
1619: outfile.Write(indata);
1620:
1621: var keys = (new VBArray(configure_hdr.Keys())).toArray();
1622: var i, j;
1623: var item;
1624: var pieces, stuff_to_crack, chunk;
1625:
1626: outfile.WriteBlankLines(1);
1627: outfile.WriteLine("/* values determined by configure.js */");
1628:
1629: for (i in keys) {
1630: item = configure_hdr.Item(keys[i]);
1631: outfile.WriteBlankLines(1);
1632: pieces = item[0];
1633:
1634: if (item[1] != undefined) {
1635: outfile.WriteLine("/* " + item[1] + " */");
1636: }
1637:
1638: if (typeof(pieces) == "string" && pieces.charCodeAt(0) == 34) {
1639: /* quoted string have a maximal length of 2k under vc.
1640: * solution is to crack them and let the compiler concat
1641: * them implicitly */
1642: stuff_to_crack = pieces;
1643: pieces = "";
1644:
1645: while (stuff_to_crack.length) {
1646: j = 65;
1647: while (stuff_to_crack.charCodeAt(j) != 32 && j < stuff_to_crack.length)
1648: j++;
1649:
1650: chunk = stuff_to_crack.substr(0, j);
1651: pieces += chunk;
1652: stuff_to_crack = stuff_to_crack.substr(chunk.length);
1653: if (stuff_to_crack.length)
1654: pieces += '" "';
1655: }
1656: }
1657:
1658: outfile.WriteLine("#define " + keys[i] + " " + pieces);
1659: }
1660:
1661: outfile.Close();
1662: }
1663:
1664: function generate_phpize()
1665: {
1666: STDOUT.WriteLine("Generating phpize");
1667: dest = get_define("BUILD_DIR") + '/devel';
1668:
1669: if (!FSO.FolderExists(dest)) {
1670: FSO.CreateFolder(dest);
1671: }
1672:
1673: var MF = FSO.CreateTextFile(dest + "/phpize.js", true);
1674: var DEPS = FSO.CreateTextFile(dest + "/ext_deps.js", true);
1675: prefix = get_define("PHP_PREFIX");
1676: prefix = prefix.replace(new RegExp("/", "g"), "\\");
1677: prefix = prefix.replace(new RegExp("\\\\", "g"), "\\\\");
1678: MF.WriteLine("var PHP_PREFIX=" + '"' + prefix + '"');
1679: MF.WriteLine("var PHP_ZTS=" + '"' + (PHP_ZTS.toLowerCase() == "yes" ? "Yes" : "No") + '"');
1680: MF.WriteLine("var VC_VERSION=" + VCVERS);
1681: MF.WriteLine("var PHP_VERSION=" + PHP_VERSION);
1682: MF.WriteLine("var PHP_MINOR_VERSION=" + PHP_MINOR_VERSION);
1683: MF.WriteLine("var PHP_RELEASE_VERSION=" + PHP_RELEASE_VERSION);
1684: MF.WriteBlankLines(1);
1685: MF.WriteLine("/* Genereted extensions list with mode (static/shared) */");
1686:
1687: var count = extensions_enabled.length;
1688: for (i in extensions_enabled) {
1689: out = "PHP_" + extensions_enabled[i][0].toUpperCase() + "_SHARED=" + (extensions_enabled[i][1] == 'shared' ? 'true' : 'false') + ";";
1690: DEPS.WriteLine("PHP_" + extensions_enabled[i][0].toUpperCase() + "=true;");
1691: DEPS.WriteLine(out);
1692: MF.WriteLine(out);
1693: }
1694:
1695: MF.WriteBlankLines(2);
1696: MF.WriteLine("/* Genereted win32/build/phpize.js.in */");
1697: MF.WriteBlankLines(1);
1698: MF.Write(file_get_contents("win32/build/phpize.js.in"));
1699: MF.Close();
1700: DEPS.Close();
1701:
1702: /* Generate flags file */
1703: /* spit out variable definitions */
1704: CJ = FSO.CreateTextFile(dest + "/config.phpize.js");
1705:
1706: CJ.WriteLine("var PHP_ZTS =" + '"' + PHP_ZTS + '"');
1707: CJ.WriteLine("var PHP_DLL_LIB =" + '"' + get_define('PHPLIB') + '"');
1708: CJ.WriteLine("var PHP_DLL =" + '"' + get_define('PHPDLL') + '"');
1709: CJ.WriteBlankLines(1);
1710: CJ.Close();
1711: }
1712:
1713: function generate_makefile()
1714: {
1715: STDOUT.WriteLine("Generating Makefile");
1716: var MF = FSO.CreateTextFile("Makefile", true);
1717:
1718: MF.WriteLine("# Generated by configure.js");
1719: /* spit out variable definitions */
1720: var keys = (new VBArray(configure_subst.Keys())).toArray();
1721: var i;
1722: MF.WriteLine("PHP_SRC_DIR =" + PHP_SRC_DIR);
1723: for (i in keys) {
1724: // The trailing space is needed to prevent the trailing backslash
1725: // that is part of the build dir flags (CFLAGS_BD_XXX) from being
1726: // seen as a line continuation character
1727: MF.WriteLine(keys[i] + "=" +
1728: //word_wrap_and_indent(1, configure_subst.Item(keys[i]), ' \\', '\t') + " "
1729: configure_subst.Item(keys[i]) + " "
1730: );
1731: MF.WriteBlankLines(1);
1732: }
1733:
1734: MF.WriteBlankLines(1);
1735: if (MODE_PHPIZE) {
1736: var TF = FSO.OpenTextFile(PHP_DIR + "/script/Makefile.phpize", 1);
1737: } else {
1738: var TF = FSO.OpenTextFile("win32/build/Makefile", 1);
1739: }
1740:
1741: MF.Write(TF.ReadAll());
1742:
1743: MF.WriteLine("build-headers:");
1744: MF.WriteLine(" @if not exist $(BUILD_DIR_DEV)\\include mkdir $(BUILD_DIR_DEV)\\include >nul");
1745: MF.WriteLine(" @for %D in ($(INSTALL_HEADERS_DIR)) do @if not exist $(BUILD_DIR_DEV)\\include\\%D mkdir $(BUILD_DIR_DEV)\\include\\%D >nul");
1746: for (i in headers_install) {
1747: if (headers_install[i][2] != "") {
1748: MF.WriteLine(" @if not exist $(BUILD_DIR_DEV)\\include\\" + headers_install[i][2] + " mkdir $(BUILD_DIR_DEV)\\include\\" +
1749: headers_install[i][2] + ">nul");
1750: MF.WriteLine(" @copy " + headers_install[i][0] + " " + "$(BUILD_DIR_DEV)\\include\\" + headers_install[i][2] + " /y >nul");
1751: }
1752: }
1753: MF.WriteLine(" @for %D in ($(INSTALL_HEADERS_DIR)) do @copy %D*.h $(BUILD_DIR_DEV)\\include\\%D /y >nul");
1754: TF.Close();
1755:
1756: MF.WriteBlankLines(2);
1757:
1758: MFO.Close();
1759: TF = FSO.OpenTextFile("Makefile.objects", 1);
1760: MF.Write(TF.ReadAll());
1761: TF.Close();
1762:
1763: MF.Close();
1764: }
1765:
1766: function ADD_FLAG(name, flags, target)
1767: {
1768: if (target != null) {
1769: name = target.toUpperCase() + "_" + name;
1770: }
1771: if (configure_subst.Exists(name)) {
1772: var curr_flags = configure_subst.Item(name);
1773:
1774: if (curr_flags.indexOf(flags) >= 0) {
1775: return;
1776: }
1777:
1778: flags = curr_flags + " " + flags;
1779: configure_subst.Remove(name);
1780: }
1781: configure_subst.Add(name, flags);
1782:
1783: if (PHP_DSP != "no") {
1784: if (flags && (name.substr(name.length-3) != "PHP") && (name.substr(0, 7) == "CFLAGS_")) {
1785: DSP_FLAGS[DSP_FLAGS.length] = new Array(name, flags);
1786: }
1787: }
1788: }
1789:
1790: function get_define(name)
1791: {
1792: if (configure_subst.Exists(name)) {
1793: return configure_subst.Item(name);
1794: }
1795: return "";
1796: }
1797:
1798: // Add a .def to the core to export symbols
1799: function ADD_DEF_FILE(name)
1800: {
1801: if (!configure_subst.Exists("PHPDEF")) {
1802: DEFINE("PHPDEF", "$(BUILD_DIR)\\$(PHPDLL).def");
1803: ADD_FLAG("PHP_LDFLAGS", "/def:$(PHPDEF)");
1804: }
1805: ADD_FLAG("PHP_DLL_DEF_SOURCES", name);
1806: }
1807:
1808: function AC_DEFINE(name, value, comment, quote)
1809: {
1810: if (quote == null) {
1811: quote = true;
1812: }
1813: if (quote && typeof(value) == "string") {
1814: value = '"' + value.replace(new RegExp('(["\\\\])', "g"), '\\$1') + '"';
1815: } else if (value.length == 0) {
1816: value = '""';
1817: }
1818: var item = new Array(value, comment);
1819: if (configure_hdr.Exists(name)) {
1820: var orig_item = configure_hdr.Item(name);
1821: STDOUT.WriteLine("AC_DEFINE[" + name + "]=" + value + ": is already defined to " + orig_item[0]);
1822: } else {
1823: configure_hdr.Add(name, item);
1824: }
1825: }
1826:
1827: function MESSAGE(msg)
1828: {
1829: STDOUT.WriteLine("" + msg);
1830: }
1831:
1832: function ERROR(msg)
1833: {
1834: STDERR.WriteLine("ERROR: " + msg);
1835: WScript.Quit(3);
1836: }
1837:
1838: function WARNING(msg)
1839: {
1840: STDERR.WriteLine("WARNING: " + msg);
1841: STDERR.WriteBlankLines(1);
1842: }
1843:
1844: function copy_and_subst(srcname, destname, subst_array)
1845: {
1846: if (!FSO.FileExists(srcname)) {
1847: srcname = configure_module_dirname + "\\" + srcname;
1848: destname = configure_module_dirname + "\\" + destname;
1849: }
1850:
1851: var content = file_get_contents(srcname);
1852: var i;
1853:
1854: for (i = 0; i < subst_array.length; i+=2) {
1855: var re = subst_array[i];
1856: var rep = subst_array[i+1];
1857:
1858: content = content.replace(re, rep);
1859: }
1860:
1861: var f = FSO.CreateTextFile(destname, true);
1862: f.Write(content);
1863: f.Close();
1864: }
1865:
1866: // glob using simple filename wildcards
1867: // returns an array of matches that are found
1868: // in the filesystem
1869: function glob(path_pattern)
1870: {
1871: var path_parts = path_pattern.replace(new RegExp("/", "g"), "\\").split("\\");
1872: var p;
1873: var base = "";
1874: var is_pat_re = /\*/;
1875:
1876: //STDOUT.WriteLine("glob: " + path_pattern);
1877:
1878: if (FSO.FileExists(path_pattern)) {
1879: return new Array(path_pattern);
1880: }
1881:
1882: // first, build as much as possible that doesn't have a pattern
1883: for (p = 0; p < path_parts.length; p++) {
1884: if (path_parts[p].match(is_pat_re))
1885: break;
1886: if (p)
1887: base += "\\";
1888: base += path_parts[p];
1889: }
1890:
1891: return _inner_glob(base, p, path_parts);
1892: }
1893:
1894: function _inner_glob(base, p, parts)
1895: {
1896: var pat = parts[p];
1897: var full_name = base + "\\" + pat;
1898: var re = null;
1899: var items = null;
1900:
1901: if (p == parts.length) {
1902: return false;
1903: }
1904:
1905: //STDOUT.WriteLine("inner: base=" + base + " p=" + p + " pat=" + pat);
1906:
1907: if (FSO.FileExists(full_name)) {
1908: if (p < parts.length - 1) {
1909: // we didn't reach the full extent of the pattern
1910: return false;
1911: }
1912: return new Array(full_name);
1913: }
1914:
1915: if (FSO.FolderExists(full_name) && p == parts.length - 1) {
1916: // we have reached the end of the pattern; no need to recurse
1917: return new Array(full_name);
1918: }
1919:
1920: // Convert the pattern into a regexp
1921: re = new RegExp("^" + pat.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\?/g, '.') + "$", "i");
1922:
1923: items = new Array();
1924:
1925: if (!FSO.FolderExists(base)) {
1926: return false;
1927: }
1928:
1929: var folder = FSO.GetFolder(base);
1930: var fc = null;
1931: var subitems = null;
1932: var item_name = null;
1933: var j;
1934:
1935: fc = new Enumerator(folder.SubFolders);
1936: for (; !fc.atEnd(); fc.moveNext()) {
1937: item_name = FSO.GetFileName(fc.item());
1938:
1939: if (item_name.match(re)) {
1940: // got a match; if we are at the end of the pattern, just add these
1941: // things to the items array
1942: if (p == parts.length - 1) {
1943: items[items.length] = fc.item();
1944: } else {
1945: // we should recurse and do more matches
1946: subitems = _inner_glob(base + "\\" + item_name, p + 1, parts);
1947: if (subitems) {
1948: for (j = 0; j < subitems.length; j++) {
1949: items[items.length] = subitems[j];
1950: }
1951: }
1952: }
1953: }
1954: }
1955:
1956: // if we are at the end of the pattern, we should match
1957: // files too
1958: if (p == parts.length - 1) {
1959: fc = new Enumerator(folder.Files);
1960: for (; !fc.atEnd(); fc.moveNext()) {
1961: item_name = FSO.GetFileName(fc.item());
1962: if (item_name.match(re)) {
1963: items[items.length] = fc.item();
1964: }
1965: }
1966: }
1967:
1968: if (items.length == 0)
1969: return false;
1970:
1971: return items;
1972: }
1973:
1974: function PHP_INSTALL_HEADERS(dir, headers_list)
1975: {
1976: headers_list = headers_list.split(new RegExp("\\s+"));
1977: headers_list.sort();
1978: if (dir.length > 0 && dir.substr(dir.length - 1) != '/' && dir.substr(dir.length - 1) != '\\') {
1979: dir += '/';
1980: }
1981: dir = dir.replace(new RegExp("/", "g"), "\\");
1982:
1983: for (i in headers_list) {
1984: found = false;
1985: src = headers_list[i];
1986: src = src.replace(new RegExp("/", "g"), "\\");
1987: isdir = FSO.FolderExists(dir + src);
1988: isfile = FSO.FileExists(dir + src);
1989: if (isdir) {
1990: if (src.length > 0 && src.substr(src.length - 1) != '/' && src.substr(src.length - 1) != '\\') {
1991: src += '\\';
1992: }
1993: headers_install[headers_install.length] = [dir + src, 'dir',''];
1994: ADD_FLAG("INSTALL_HEADERS_DIR", dir + src);
1995: found = true;
1996: } else if (isfile) {
1997: dirname = FSO.GetParentFolderName(dir + src);
1998: headers_install[headers_install.length] = [dir + src, 'file', dirname];
1999: ADD_FLAG("INSTALL_HEADERS", dir + src);
2000: found = true;
2001: } else {
2002: path = configure_module_dirname + "\\"+ src;
2003: isdir = FSO.FolderExists(path);
2004: isfile = FSO.FileExists(path);
2005: if (isdir) {
2006: if (src.length > 0 && src.substr(src.length - 1) != '/' && src.substr(src.length - 1) != '\\') {
2007: src += '\\';
2008: }
2009: headers_install[headers_install.length] = [path, 'dir',''];
2010: ADD_FLAG("INSTALL_HEADERS_DIR", path);
2011: } else if (isfile) {
2012: dirname = FSO.GetParentFolderName(path);
2013: headers_install[headers_install.length] = [path, 'file', dir];
2014: ADD_FLAG("INSTALL_HEADERS", dir + src);
2015: found = true;
2016: }
2017: }
2018:
2019: if (found == false) {
2020: STDOUT.WriteLine(headers_list);
2021: ERROR("Cannot find header " + dir + src);
2022: }
2023: }
2024: }
2025:
2026: // for snapshot builders, this option will attempt to enable everything
2027: // and you can then build everything, ignoring fatal errors within a module
2028: // by running "nmake snap"
2029: PHP_SNAPSHOT_BUILD = "no";
2030: if (!MODE_PHPIZE) {
2031: ARG_ENABLE('snapshot-build', 'Build a snapshot; turns on everything it can and ignores build errors', 'no');
2032:
2033: // one-shot build optimizes build by asking compiler to build
2034: // several objects at once, reducing overhead of starting new
2035: // compiler processes.
2036: ARG_ENABLE('one-shot', 'Optimize for fast build - best for release and snapshot builders, not so hot for edit-and-rebuild hacking', 'no');
2037: }
2038:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>