File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / win32 / build / confutils.js
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:48:06 2012 UTC (12 years, 5 months ago) by misho
Branches: php, MAIN
CVS tags: v5_3_10, HEAD
php

    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.1.1.1 2012/02/21 23:48:06 misho 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>