]> granicus.if.org Git - php/commitdiff
build system to support clang
authorAnatol Belski <ab@php.net>
Thu, 6 Nov 2014 19:44:57 +0000 (20:44 +0100)
committerAnatol Belski <ab@php.net>
Fri, 7 Nov 2014 09:18:00 +0000 (10:18 +0100)
win32/build/config.w32
win32/build/confutils.js

index 358ff4e0cefdb1a6d2a5fd1321381d0cac0bf532..c06ae509b7ab1aad2ee5c4ff4f12be3a39e179e1 100644 (file)
@@ -3,33 +3,66 @@
 // "Master" config file; think of it as a configure.in
 // equivalent.
 
+ARG_WITH("toolset", "Toolset to use for the compilation, supported: vs, clang", "vs");
+if ("clang" == PHP_TOOLSET) {
+       VS_TOOLSET = false;
+       CLANG_TOOLSET = true;
+       INTEL_TOOLSET = false;
+} else {
+       /* Visual Studio is the default toolset. */
+       PHP_TOOLSET = "no" == PHP_TOOLSET ? "vs" : PHP_TOOLSET;
+       if (!!PHP_TOOLSET && "vs" != PHP_TOOLSET) {
+               ERROR("Unsupported toolset name '" + PHP_TOOLSET + "'");
+       }
+       VS_TOOLSET = true;
+       CLANG_TOOLSET = false;
+       INTEL_TOOLSET = false;
+}
+
+
 ARG_WITH('cygwin', 'Path to cygwin utilities on your system', '\\cygwin');
-PHP_CL = PATH_PROG('cl', null, 'PHP_CL');
+
+PHP_CL = toolset_get_compiler();
 if (!PHP_CL) {
        ERROR("MS C++ compiler is required");
 }
 
-/* For the record here: */
-// 1200 is VC6
-// 1300 is vs.net 2002
-// 1310 is vs.net 2003
-// 1400 is vs.net 2005
-// 1500 is vs.net 2008
-// 1600 is vs.net 2010
-// Which version of the compiler do we have?
-VCVERS = probe_binary(PHP_CL).substr(0, 5).replace('.', '');
-STDOUT.WriteLine("  Detected compiler " + VC_VERSIONS[VCVERS]);
+COMPILER_NUMERIC_VERSION = toolset_get_compiler_version();
+COMPILER_NAME = toolset_get_compiler_name();
+
+if (VS_TOOLSET) {
+       /* For the record here: */
+       // 1200 is VC6
+       // 1300 is vs.net 2002
+       // 1310 is vs.net 2003
+       // 1400 is vs.net 2005
+       // 1500 is vs.net 2008
+       // 1600 is vs.net 2010
+       // Which version of the compiler do we have?
+       VCVERS = COMPILER_NUMERIC_VERSION;
+
+       if (VCVERS < 1500) {
+               ERROR("Unsupported MS C++ Compiler, VC9 (2008) minimum is required");
+       }
+
+       AC_DEFINE('COMPILER', COMPILER_NAME, "Detected compiler version");
+       DEFINE("PHP_COMPILER_SHORT", VC_VERSIONS_SHORT[VCVERS]);
+       AC_DEFINE('PHP_COMPILER_ID', VC_VERSIONS_SHORT[VCVERS], "Compiler compatibility ID");
+} else if (CLANG_TOOLSET) {
+       CLANGVERS = COMPILER_NUMERIC_VERSION;
 
-if (VCVERS < 1500) {
-       ERROR("Unsupported MS C++ Compiler, VC9 (2008) minimum is required");
-}
+       AC_DEFINE('COMPILER', COMPILER_NAME, "Detected compiler version");
+       DEFINE("PHP_COMPILER_SHORT", "clang");
+       AC_DEFINE('PHP_COMPILER_ID', "clang"); /* XXX something better were to write here */
 
-AC_DEFINE('COMPILER', VC_VERSIONS[VCVERS], "Detected compiler version");
-DEFINE("PHP_COMPILER_SHORT", VC_VERSIONS_SHORT[VCVERS]);
-AC_DEFINE('PHP_COMPILER_ID', VC_VERSIONS_SHORT[VCVERS], "Compiler compatibility ID");
+} else if (INTEL_TOOLSET) {
+       //INTELVERS = compiler_ver;
+       // ....
+}
+STDOUT.WriteLine("  Detected compiler " + COMPILER_NAME);
 
 // do we use x64 or 80x86 version of compiler?
-X64 = probe_binary(PHP_CL, 64, null, 'PHP_CL');
+X64 = toolset_is_64();
 if (X64) {
        STDOUT.WriteLine("  Detected 64-bit compiler");
 } else {
@@ -40,7 +73,8 @@ DEFINE("PHP_ARCHITECTURE", X64 ? 'x64' : 'x86');
 
 // cygwin now ships with link.exe.  Avoid searching the cygwin path
 // for this, as we want the MS linker, not the fileutil
-PATH_PROG('link', WshShell.Environment("Process").Item("PATH"));
+toolset_get_linker();
+
 PATH_PROG('nmake');
 
 // we don't want to define LIB, as that will override the default library path
@@ -81,7 +115,7 @@ PATH_PROG('lemon');
 PATH_PROG('mc', WshShell.Environment("Process").Item("PATH"));
 
 // Try locating manifest tool
-if (VCVERS > 1200) {
+if (VS_TOOLSET && VCVERS > 1200) {
        PATH_PROG('mt', WshShell.Environment("Process").Item("PATH"));
 }
 
@@ -137,10 +171,17 @@ DEFINE("CFLAGS_PHP", "/D _USRDLL /D PHP7DLLTS_EXPORTS /D PHP_EXPORTS \
 DEFINE('CFLAGS_PHP_OBJ', '$(CFLAGS_PHP) $(STATIC_EXT_CFLAGS)');
 
 // General CFLAGS for building objects
-DEFINE("CFLAGS", "/nologo /FD $(BASE_INCLUDES) /D _WINDOWS \
+DEFINE("CFLAGS", "/nologo $(BASE_INCLUDES) /D _WINDOWS \
 /D ZEND_WIN32=1 /D PHP_WIN32=1 /D WIN32 /D _MBCS /W3 ");
+if (CLANG_TOOLSET) {
+       if (X64) {
+               ADD_FLAG('CFLAGS', ' -m64 ');
+       } else {
+               ADD_FLAG('CFLAGS', ' -m32 ');
+       }
+}
 
-if (VCVERS < 1400) {
+if (VS_TOOLSET && VCVERS < 1400) {
        // Enable automatic precompiled headers
        ADD_FLAG('CFLAGS', ' /YX ');
 
@@ -150,7 +191,7 @@ if (VCVERS < 1400) {
        }
 }
 
-if (VCVERS >= 1400) {
+if (VS_TOOLSET && VCVERS >= 1400) {
        // fun stuff: MS deprecated ANSI stdio and similar functions
        // disable annoying warnings.  In addition, time_t defaults
        // to 64-bit.  Ask for 32-bit.
@@ -168,7 +209,7 @@ if (VCVERS >= 1400) {
 
 ARG_WITH('mp', 'Tell Visual Studio use up to [n,auto,disable] processes for compilation', 'auto');
 var PHP_MP_DISABLED = true;
-if (VCVERS >= 1500 && PHP_MP != 'disable') {
+if (VS_TOOLSET && VCVERS >= 1500 && PHP_MP != 'disable') {
                // no from disable-all 
                if(PHP_MP == 'auto' || PHP_MP == 'no') {
                         ADD_FLAG('CFLAGS', ' /MP ');
@@ -185,11 +226,13 @@ if (VCVERS >= 1500 && PHP_MP != 'disable') {
 
 // General link flags
 
-if (VCVERS >= 1700) {
-       DEFINE("LDFLAGS", "/nologo ");
-} else {
-       DEFINE("LDFLAGS", "/nologo /version:" +
-                       PHP_VERSION + "." + PHP_MINOR_VERSION + "." + PHP_RELEASE_VERSION);
+if (VS_TOOLSET || CLANG_TOOLSET) {
+       if (VCVERS >= 1700) {
+               DEFINE("LDFLAGS", "/nologo ");
+       } else {
+               DEFINE("LDFLAGS", "/nologo /version:" +
+                               PHP_VERSION + "." + PHP_MINOR_VERSION + "." + PHP_RELEASE_VERSION);
+       }
 }
 
 // General DLL link flags
@@ -334,10 +377,12 @@ function add_extra_dirs()
                for (i = 0; i < path.length; i++) {
                        f = FSO.GetAbsolutePathName(path[i]);
                        if (FSO.FolderExists(f)) {
-                               if (VCVERS <= 1200 && f.indexOf(" ") >= 0) {
-                                       ADD_FLAG("LDFLAGS", '/libpath:"\\"' + f + '\\"" ');
-                               } else {
-                                       ADD_FLAG("LDFLAGS", '/libpath:"' + f + '" ');
+                               if (VS_TOOLSET) {
+                                       if (VCVERS <= 1200 && f.indexOf(" ") >= 0) {
+                                               ADD_FLAG("LDFLAGS", '/libpath:"\\"' + f + '\\"" ');
+                                       } else {
+                                               ADD_FLAG("LDFLAGS", '/libpath:"' + f + '" ');
+                                       }
                                }
                        }
                }
@@ -368,7 +413,7 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \
        zend_float.c zend_string.c zend_generators.c zend_virtual_cwd.c zend_ast.c \
        zend_inheritance.c");
 
-if (VCVERS == 1200) {
+if (VS_TOOLSET && VCVERS == 1200) {
        AC_DEFINE('ZEND_DVAL_TO_LVAL_CAST_OK', 1);
 }
 
@@ -379,10 +424,10 @@ ADD_SOURCES("main", "main.c snprintf.c spprintf.c getopt.c fopen_wrappers.c \
 ADD_SOURCES("win32", "inet.c fnmatch.c sockets.c");
 
 // Newer versions have it
-if (VCVERS <= 1300) {
+if (VS_TOOLSET && VCVERS <= 1300) {
        ADD_SOURCES("win32", "strtoi64.c");
 }
-if (VCVERS >= 1400) {
+if (VS_TOOLSET && VCVERS >= 1400) {
        AC_DEFINE('HAVE_STRNLEN', 1);
 }
 
index e40a8e2a1051fa7d8f2a1093b67e67b0108714b7..33fcf7ce7386df978922c7b4e0463b93951afbfc 100644 (file)
-// Utils for configure script\r
-/*\r
-  +----------------------------------------------------------------------+\r
-  | PHP Version 7                                                        |\r
-  +----------------------------------------------------------------------+\r
-  | Copyright (c) 1997-2008 The PHP Group                                |\r
-  +----------------------------------------------------------------------+\r
-  | This source file is subject to version 3.01 of the PHP license,      |\r
-  | that is bundled with this package in the file LICENSE, and is        |\r
-  | available through the world-wide-web at the following url:           |\r
-  | http://www.php.net/license/3_01.txt                                  |\r
-  | If you did not receive a copy of the PHP license and are unable to   |\r
-  | obtain it through the world-wide-web, please send a note to          |\r
-  | license@php.net so we can mail you a copy immediately.               |\r
-  +----------------------------------------------------------------------+\r
-  | Author: Wez Furlong <wez@thebrainroom.com>                           |\r
-  +----------------------------------------------------------------------+\r
-*/\r
-\r
-// $Id: confutils.js,v 1.60.2.1.2.8.2.33 2009-05-29 07:43:07 kalle Exp $\r
-\r
-var STDOUT = WScript.StdOut;\r
-var STDERR = WScript.StdErr;\r
-var WshShell = WScript.CreateObject("WScript.Shell");\r
-var FSO = WScript.CreateObject("Scripting.FileSystemObject");\r
-var MFO = null;\r
-var SYSTEM_DRIVE = WshShell.Environment("Process").Item("SystemDrive");\r
-var PROGRAM_FILES = WshShell.Environment("Process").Item("ProgramFiles");\r
-var PROGRAM_FILESx86 = WshShell.Environment("Process").Item("ProgramFiles(x86)");\r
-var VCINSTALLDIR = WshShell.Environment("Process").Item("VCINSTALLDIR");\r
-var PHP_SRC_DIR=FSO.GetParentFolderName(WScript.ScriptFullName);\r
-\r
-/* Store the enabled extensions (summary + QA check) */\r
-var extensions_enabled = new Array();\r
-\r
-/* Store the SAPI enabled (summary + QA check) */\r
-var sapi_enabled = new Array();\r
-\r
-/* Store the headers to install */\r
-var headers_install = new Array();\r
-\r
-/* Mapping CL version > human readable name */\r
-var VC_VERSIONS = new Array();\r
-VC_VERSIONS[1200] = 'MSVC6 (Visual C++ 6.0)';\r
-VC_VERSIONS[1300] = 'MSVC7 (Visual C++ 2002)';\r
-VC_VERSIONS[1310] = 'MSVC7.1 (Visual C++ 2003)';\r
-VC_VERSIONS[1400] = 'MSVC8 (Visual C++ 2005)';\r
-VC_VERSIONS[1500] = 'MSVC9 (Visual C++ 2008)';\r
-VC_VERSIONS[1600] = 'MSVC10 (Visual C++ 2010)';\r
-VC_VERSIONS[1700] = 'MSVC11 (Visual C++ 2012)';\r
-VC_VERSIONS[1800] = 'MSVC12 (Visual C++ 2013)';\r
-/* XXX update after the final rename */\r
-VC_VERSIONS[1900] = 'MSVC14 (Visual C++ CTP14)';\r
-\r
-var VC_VERSIONS_SHORT = new Array();\r
-VC_VERSIONS_SHORT[1200] = 'VC6';\r
-VC_VERSIONS_SHORT[1300] = 'VC7';\r
-VC_VERSIONS_SHORT[1310] = 'VC7.1';\r
-VC_VERSIONS_SHORT[1400] = 'VC8';\r
-VC_VERSIONS_SHORT[1500] = 'VC9';\r
-VC_VERSIONS_SHORT[1600] = 'VC10';\r
-VC_VERSIONS_SHORT[1700] = 'VC11';\r
-VC_VERSIONS_SHORT[1800] = 'VC12';\r
-VC_VERSIONS_SHORT[1900] = 'VC14';\r
-\r
-if (PROGRAM_FILES == null) {\r
-       PROGRAM_FILES = "C:\\Program Files";\r
-}\r
-\r
-if (MODE_PHPIZE) {\r
-       if (!FSO.FileExists("config.w32")) {\r
-               STDERR.WriteLine("Must be run from the root of the extension source");\r
-               WScript.Quit(10);\r
-       }\r
-} else {\r
-       if (!FSO.FileExists("README.GIT-RULES")) {\r
-               STDERR.WriteLine("Must be run from the root of the php source");\r
-               WScript.Quit(10);\r
-       }\r
-}\r
-\r
-var CWD = WshShell.CurrentDirectory;\r
-\r
-if (typeof(CWD) == "undefined") {\r
-       CWD = FSO.GetParentFolderName(FSO.GetAbsolutePathName("README.GIT-RULES"));\r
-}\r
-\r
-/* defaults; we pick up the precise versions from configure.in */\r
-var PHP_VERSION = 5;\r
-var PHP_MINOR_VERSION = 0;\r
-var PHP_RELEASE_VERSION = 0;\r
-var PHP_EXTRA_VERSION = "";\r
-var PHP_VERSION_STRING = "5.0.0";\r
-\r
-function get_version_numbers()\r
-{\r
-       var cin = file_get_contents("configure.in");\r
-       \r
-       if (cin.match(new RegExp("PHP_MAJOR_VERSION=(\\d+)"))) {\r
-               PHP_VERSION = RegExp.$1;\r
-       }\r
-       if (cin.match(new RegExp("PHP_MINOR_VERSION=(\\d+)"))) {\r
-               PHP_MINOR_VERSION = RegExp.$1;\r
-       }\r
-       if (cin.match(new RegExp("PHP_RELEASE_VERSION=(\\d+)"))) {\r
-               PHP_RELEASE_VERSION = RegExp.$1;\r
-       }\r
-       PHP_VERSION_STRING = PHP_VERSION + "." + PHP_MINOR_VERSION + "." + PHP_RELEASE_VERSION;\r
-\r
-       if (cin.match(new RegExp("PHP_EXTRA_VERSION=\"([^\"]+)\""))) {\r
-               PHP_EXTRA_VERSION = RegExp.$1;\r
-               if (PHP_EXTRA_VERSION.length) {\r
-                       PHP_VERSION_STRING += PHP_EXTRA_VERSION;\r
-               }\r
-       }\r
-       DEFINE('PHP_VERSION_STRING', PHP_VERSION_STRING);\r
-}\r
-\r
-configure_args = new Array();\r
-configure_subst = WScript.CreateObject("Scripting.Dictionary");\r
-\r
-configure_hdr = WScript.CreateObject("Scripting.Dictionary");\r
-build_dirs = new Array();\r
-\r
-extension_include_code = "";\r
-extension_module_ptrs = "";\r
-\r
-if (!MODE_PHPIZE) {\r
-       get_version_numbers();\r
-}\r
-\r
-/* execute a command and return the output as a string */\r
-function execute(command_line)\r
-{\r
-       var e = WshShell.Exec(command_line);\r
-       var ret = "";\r
-\r
-       ret = e.StdOut.ReadAll();\r
-\r
-//STDOUT.WriteLine("command " + command_line);\r
-//STDOUT.WriteLine(ret);\r
-\r
-       return ret;\r
-}\r
-\r
-function probe_binary(EXE, what)\r
-{\r
-       // tricky escapes to get stderr redirection to work\r
-       var command = 'cmd /c ""' + EXE;\r
-       if (what == "version") {\r
-               command = command + '" -v"';\r
-       }\r
-       var version = execute(command + '" 2>&1"');\r
-\r
-       if (what == "64") {\r
-               if (version.match(/x64/)) {\r
-                       return 1;\r
-               }\r
-       } else {\r
-               if (version.match(/(\d+\.\d+(\.\d+)?(\.\d+)?)/)) {\r
-                       return RegExp.$1;\r
-               }\r
-       }\r
-       return 0;\r
-}\r
-\r
-function condense_path(path)\r
-{\r
-       path = FSO.GetAbsolutePathName(path);\r
-\r
-       if (path.substr(0, CWD.length).toLowerCase()\r
-                       == CWD.toLowerCase() &&\r
-                       (path.charCodeAt(CWD.length) == 92 || path.charCodeAt(CWD.length) == 47)) {\r
-               return path.substr(CWD.length + 1);\r
-       }\r
-\r
-       var a = CWD.split("\\");\r
-       var b = path.split("\\");\r
-       var i, j;\r
-\r
-       for (i = 0; i < b.length; i++) {\r
-               if (a[i].toLowerCase() == b[i].toLowerCase())\r
-                       continue;\r
-               if (i > 0) {\r
-                       /* first difference found */\r
-                       path = "";\r
-                       for (j = 0; j < a.length - i; j++) {\r
-                               path += "..\\";\r
-                       }\r
-                       for (j = i; j < b.length; j++) {\r
-                               path += b[j];\r
-                               if (j < b.length - 1)\r
-                                       path += "\\";\r
-                       }\r
-                       return path;\r
-               }\r
-               /* on a different drive */\r
-               break;\r
-       }\r
-       \r
-       return path;\r
-}\r
-\r
-function ConfigureArg(type, optname, helptext, defval)\r
-{\r
-       var opptype = type == "enable" ? "disable" : "without";\r
-\r
-       if (defval == "yes" || defval == "yes,shared") {\r
-               this.arg = "--" + opptype + "-" + optname;\r
-               this.imparg = "--" + type + "-" + optname;\r
-       } else {\r
-               this.arg = "--" + type + "-" + optname;\r
-               this.imparg = "--" + opptype + "-" + optname;\r
-       }\r
-       \r
-       this.optname = optname;\r
-       this.helptext = helptext;\r
-       this.defval = defval;\r
-       this.symval = optname.toUpperCase().replace(new RegExp("-", "g"), "_");\r
-       this.seen = false;\r
-       this.argval = defval;\r
-}\r
-\r
-function ARG_WITH(optname, helptext, defval)\r
-{\r
-       configure_args[configure_args.length] = new ConfigureArg("with", optname, helptext, defval);\r
-}\r
-\r
-function ARG_ENABLE(optname, helptext, defval)\r
-{\r
-       configure_args[configure_args.length] = new ConfigureArg("enable", optname, helptext, defval);\r
-}\r
-\r
-function analyze_arg(argval)\r
-{\r
-       var ret = new Array();\r
-       var shared = false;\r
-\r
-       if (argval == "shared") {\r
-               shared = true;\r
-               argval = "yes";\r
-       } else if (argval == null) {\r
-               /* nothing */\r
-       } else if (arg_match = argval.match(new RegExp("^shared,(.*)"))) {\r
-               shared = true;\r
-               argval = arg_match[1];\r
-       } else if (arg_match = argval.match(new RegExp("^(.*),shared$"))) {\r
-               shared = true;\r
-               argval = arg_match[1];\r
-       }\r
-\r
-       ret[0] = shared;\r
-       ret[1] = argval;\r
-       return ret;\r
-}\r
-\r
-function word_wrap_and_indent(indent, text, line_suffix, indent_char)\r
-{\r
-       if (text == null) {\r
-               return "";\r
-       }\r
-       \r
-       var words = text.split(new RegExp("\\s+", "g"));\r
-       var i = 0;\r
-       var ret_text = "";\r
-       var this_line = "";\r
-       var t;\r
-       var space = "";\r
-       var lines = 0;\r
-\r
-       if (line_suffix == null) {\r
-               line_suffix = "";\r
-       }\r
-\r
-       if (indent_char == null) {\r
-               indent_char = " ";\r
-       }\r
-\r
-       for (i = 0; i < indent; i++) {\r
-               space += indent_char;\r
-       }\r
-       \r
-       for (i = 0; i < words.length; i++) {\r
-               if (this_line.length) {\r
-                       t = this_line + " " + words[i];\r
-               } else {\r
-                       t = words[i];\r
-               }\r
-\r
-               if (t.length + indent > 78) {\r
-                       if (lines++) {\r
-                               ret_text += space;\r
-                       }\r
-                       ret_text += this_line + line_suffix + "\r\n";\r
-                       this_line = "";\r
-               }\r
-\r
-               if (this_line.length) {\r
-                       this_line += " " + words[i];\r
-               } else {\r
-                       this_line = words[i];\r
-               }\r
-       }\r
-\r
-       if (this_line.length) {\r
-               if (lines)\r
-                       ret_text += space;\r
-               ret_text += this_line;\r
-       }\r
-\r
-       return ret_text;\r
-}\r
-\r
-function conf_process_args()\r
-{\r
-       var i, j;\r
-       var configure_help_mode = false;\r
-       var analyzed = false;\r
-       var nice = "cscript /nologo configure.js ";\r
-       var disable_all = false;\r
-       \r
-       args = WScript.Arguments;\r
-       for (i = 0; i < args.length; i++) {\r
-               arg = args(i);\r
-               nice += ' "' + arg + '"';\r
-               if (arg == "--help") {\r
-                       configure_help_mode = true;\r
-                       break;\r
-               }\r
-               if (arg == "--disable-all") {\r
-                       disable_all = true;\r
-                       continue;\r
-               }\r
-\r
-               // If it is --foo=bar, split on the equals sign\r
-               arg = arg.split("=", 2);\r
-               argname = arg[0];\r
-               if (arg.length > 1) {\r
-                       argval = arg[1];\r
-               } else {\r
-                       argval = null;\r
-               }\r
-\r
-               // Find the arg\r
-               found = false;\r
-               for (j = 0; j < configure_args.length; j++) {\r
-                       if (argname == configure_args[j].imparg || argname == configure_args[j].arg) {\r
-                               found = true;\r
-\r
-                               arg = configure_args[j];\r
-                               arg.seen = true;\r
-\r
-                               analyzed = analyze_arg(argval);\r
-\r
-                               /* Force shared when called after phpize */\r
-                               if (MODE_PHPIZE) {\r
-                                       shared = "shared";\r
-                               } else {\r
-                                       shared = analyzed[0];\r
-                               }\r
-                               argval = analyzed[1];\r
-\r
-                               if (argname == arg.imparg) {\r
-                                       /* we matched the implicit, or default arg */\r
-                                       if (argval == null) {\r
-                                               argval = arg.defval;\r
-                                       }\r
-                               } else {\r
-                                       /* we matched the non-default arg */\r
-                                       if (argval == null) {\r
-                                               argval = arg.defval == "no" ? "yes" : "no";\r
-                                       }\r
-                               }\r
-                               \r
-                               arg.argval = argval;\r
-                               eval("PHP_" + arg.symval + " = argval;");\r
-                               eval("PHP_" + arg.symval + "_SHARED = shared;");\r
-                               break;\r
-                       }\r
-               }\r
-               if (!found) {\r
-                       STDERR.WriteLine("Unknown option " + argname + "; please try configure.js --help for a list of valid options");\r
-                       WScript.Quit(2);\r
-               }\r
-       }\r
-\r
-       if (configure_help_mode) {\r
-               STDOUT.WriteLine(word_wrap_and_indent(0,\r
-"Options that enable extensions and SAPI will accept \\r
-'yes' or 'no' as a parameter.  They also accept 'shared' \\r
-as a synonym for 'yes' and request a shared build of that \\r
-module.  Not all modules can be built as shared modules; \\r
-configure will display [shared] after the module name if \\r
-can be built that way. \\r
-"\r
-                       ));\r
-               STDOUT.WriteBlankLines(1);\r
-\r
-               // Measure width to pretty-print the output\r
-               max_width = 0;\r
-               for (i = 0; i < configure_args.length; i++) {\r
-                       arg = configure_args[i];\r
-                       if (arg.arg.length > max_width)\r
-                               max_width = arg.arg.length;\r
-               }\r
-\r
-               for (i = 0; i < configure_args.length; i++) {\r
-                       arg = configure_args[i];\r
-\r
-                       n = max_width - arg.arg.length;\r
-                       pad = "   ";\r
-                       for (j = 0; j < n; j++) {\r
-                               pad += " ";\r
-                       }\r
-                       STDOUT.WriteLine("  " + arg.arg + pad + word_wrap_and_indent(max_width + 5, arg.helptext));\r
-               }\r
-               WScript.Quit(1);\r
-       }\r
-\r
-       var snapshot_build_exclusions = new Array(\r
-               'debug', 'crt-debug', 'lzf-better-compression',\r
-                'php-build', 'snapshot-template', 'ereg',\r
-                'pcre-regex', 'fastcgi', 'force-cgi-redirect',\r
-                'path-info-check', 'zts', 'ipv6', 'memory-limit',\r
-                'zend-multibyte', 'fd-setsize', 'memory-manager',\r
-                't1lib', 'pgi', 'pgo'\r
-               );\r
-       var force;\r
-\r
-       // Now set any defaults we might have missed out earlier\r
-       for (i = 0; i < configure_args.length; i++) {\r
-               arg = configure_args[i];\r
-               if (arg.seen)\r
-                       continue;\r
-               analyzed = analyze_arg(arg.defval);\r
-               shared = analyzed[0];\r
-               argval = analyzed[1];\r
-               \r
-               // Don't trust a default "yes" answer for a non-core module\r
-               // in a snapshot build\r
-               if (PHP_SNAPSHOT_BUILD != "no" && argval == "yes" && !shared) {\r
-\r
-                       force = true;\r
-                       for (j = 0; j < snapshot_build_exclusions.length; j++) {\r
-                               if (snapshot_build_exclusions[j] == arg.optname) {\r
-                                       force = false;\r
-                                       break;\r
-                               }\r
-                       }\r
-\r
-                       if (force) {\r
-                               /* now check if it is a core module */\r
-                               force = false;\r
-                               for (j = 0; j < core_module_list.length; j++) {\r
-                                       if (core_module_list[j] == arg.optname) {\r
-                                               force = true;\r
-                                               break;\r
-                                       }\r
-                               }\r
-\r
-                               if (!force) {\r
-                                       STDOUT.WriteLine("snapshot: forcing " + arg.arg + " shared");\r
-                                       shared = true;\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               if (PHP_SNAPSHOT_BUILD != "no" && argval == "no") {\r
-                       force = true;\r
-                       for (j = 0; j < snapshot_build_exclusions.length; j++) {\r
-                               if (snapshot_build_exclusions[j] == arg.optname) {\r
-                                       force = false;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if (force) {\r
-                               STDOUT.WriteLine("snapshot: forcing " + arg.optname + " on");\r
-                               argval = "yes";\r
-                               shared = true;\r
-                       }\r
-               }\r
-\r
-               if (disable_all) {\r
-                       force = true;\r
-                       for (j = 0; j < snapshot_build_exclusions.length; j++) {\r
-                               if (snapshot_build_exclusions[j] == arg.optname) {\r
-                                       force = false;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if (force) {\r
-                               if (arg.defval == '') {\r
-                                       argval = '';\r
-                               } else {\r
-                                       argval = "no";\r
-                               }\r
-                               shared = false;\r
-                       }\r
-               }\r
-\r
-               eval("PHP_" + arg.symval + " = argval;");\r
-               eval("PHP_" + arg.symval + "_SHARED = shared;");\r
-       }\r
-\r
-       MFO = FSO.CreateTextFile("Makefile.objects", true);\r
-\r
-       STDOUT.WriteLine("Saving configure options to config.nice.bat");\r
-       var nicefile = FSO.CreateTextFile("config.nice.bat", true);\r
-       nicefile.WriteLine(nice +  " %*");\r
-       nicefile.Close();\r
-\r
-       AC_DEFINE('CONFIGURE_COMMAND', nice, "Configure line");\r
-}\r
-\r
-function DEFINE(name, value)\r
-{\r
-       if (configure_subst.Exists(name)) {\r
-               configure_subst.Remove(name);\r
-       }\r
-       configure_subst.Add(name, value);\r
-}\r
-\r
-// Searches a set of paths for a file;\r
-// returns the dir in which the file was found,\r
-// true if it was found in the default env path,\r
-// or false if it was not found at all.\r
-// env_name is the optional name of an env var\r
-// specifying the default path to search\r
-function search_paths(thing_to_find, explicit_path, env_name)\r
-{\r
-       var i, found = false, place = false, file, env;\r
-\r
-       STDOUT.Write("Checking for " + thing_to_find + " ... ");\r
-\r
-       thing_to_find = thing_to_find.replace(new RegExp("/", "g"), "\\");\r
-\r
-       if (explicit_path != null) {\r
-               if (typeof(explicit_path) == "string") {\r
-                       explicit_path = explicit_path.split(";");\r
-               }\r
-\r
-               for (i = 0; i < explicit_path.length; i++) {\r
-                       file = glob(explicit_path[i] + "\\" + thing_to_find);\r
-                       if (file) {\r
-                               found = true;\r
-                               place = file[0];\r
-                               place = place.substr(0, place.length - thing_to_find.length - 1);\r
-                               break;\r
-                       }\r
-               }\r
-       }\r
-\r
-       if (!found && env_name != null) {\r
-               env = WshShell.Environment("Process").Item(env_name);\r
-               env = env.split(";");\r
-               for (i = 0; i < env.length; i++) {\r
-                       file = glob(env[i] + "\\" + thing_to_find);\r
-                       if (file) {\r
-                               found = true;\r
-                               place = true;\r
-                               break;\r
-                       }\r
-               }\r
-       }\r
-\r
-       if (found && place == true) {\r
-               STDOUT.WriteLine(" <in default path>");\r
-       } else if (found) {\r
-               STDOUT.WriteLine(" " + place);\r
-       } else {\r
-               STDOUT.WriteLine(" <not found>");\r
-       }\r
-       return place;\r
-}\r
-\r
-function PATH_PROG(progname, additional_paths, symbol)\r
-{\r
-       var exe;\r
-       var place;\r
-       var cyg_path = PHP_CYGWIN + "\\bin;" + PHP_CYGWIN + "\\usr\\local\\bin";\r
-       var php_build_bin_path = PHP_PHP_BUILD + "\\bin"\r
-\r
-       exe = progname + ".exe";\r
-\r
-       if (additional_paths == null) {\r
-               additional_paths = cyg_path;\r
-       } else {\r
-               additional_paths += ";" + cyg_path;\r
-       }\r
-\r
-       additional_paths = additional_paths + ";" + php_build_bin_path;\r
-\r
-       place = search_paths(exe, additional_paths, "PATH");\r
-\r
-       if (place == true) {\r
-               place = exe;\r
-       } else if (place != false) {\r
-               place = place + "\\" + exe;\r
-       }\r
-\r
-       if (place) {\r
-               if (symbol == null) {\r
-                       symbol = progname.toUpperCase();\r
-               }\r
-               DEFINE(symbol, place);\r
-       }\r
-       return place;\r
-}\r
-\r
-function find_pattern_in_path(pattern, path)\r
-{\r
-       if (path == null) {\r
-               return false;\r
-       }\r
-\r
-       var dirs = path.split(';');\r
-       var i;\r
-       var items;\r
-\r
-       for (i = 0; i < dirs.length; i++) {\r
-               items = glob(dirs[i] + "\\" + pattern);\r
-               if (items) {\r
-                       return condense_path(items[0]);\r
-               }\r
-       }\r
-       return false;\r
-}\r
-\r
-function CHECK_LIB(libnames, target, path_to_check, common_name)\r
-{\r
-       STDOUT.Write("Checking for library " + libnames + " ... ");\r
-\r
-       if (common_name == null && target != null) {\r
-               common_name = target;\r
-       }\r
-\r
-       if (path_to_check == null) {\r
-               path_to_check = "";\r
-       }\r
-\r
-       // if they specified a common name for the package that contains\r
-       // the library, tag some useful defaults on to the end of the\r
-       // path to be searched\r
-       if (common_name != null) {\r
-               path_to_check += ";" + PHP_PHP_BUILD + "\\" + common_name + "*";\r
-               path_to_check += ";" + PHP_PHP_BUILD + "\\lib\\" + common_name + "*";\r
-               path_to_check += ";..\\" + common_name + "*";\r
-       }\r
-\r
-       // Determine target for build flags\r
-       if (target == null) {\r
-               target = "";\r
-       } else {\r
-               target = "_" + target.toUpperCase();\r
-       }\r
-\r
-       // Expand path to include general dirs\r
-       path_to_check += ";" + php_usual_lib_suspects;\r
-\r
-       // It is common practice to put libs under one of these dir names\r
-       var subdirs = new Array(PHP_DEBUG == "yes" ? "Debug" : (PHP_DEBUG_PACK == "yes"?"Release_Dbg":"Release"), "lib", "libs", "libexec");\r
-\r
-       // libnames can be ; separated list of accepted library names\r
-       libnames = libnames.split(';');\r
-\r
-       // for debug builds, lib may have _debug appended, we want that first\r
-       if (PHP_DEBUG == "yes") {\r
-               var length = libnames.length;\r
-               for (var i = 0; i < length; i++) {\r
-                       var name = new String(libnames[i]);\r
-                       rExp = /.lib$/i;\r
-                       name = name.replace(rExp,"_debug.lib");\r
-                       libnames.unshift(name);\r
-               }\r
-       }\r
-\r
-       var i, j, k, libname;\r
-       var location = false;\r
-       var path = path_to_check.split(';');\r
-       \r
-       for (i = 0; i < libnames.length; i++) {\r
-               libname = libnames[i];\r
-\r
-               for (k = 0; k < path.length; k++) {\r
-                       location = glob(path[k] + "\\" + libname);\r
-                       if (location) {\r
-                               location = location[0];\r
-                               break;\r
-                       }\r
-                       for (j = 0; j < subdirs.length; j++) {\r
-                               location = glob(path[k] + "\\" + subdirs[j] + "\\" + libname);\r
-                               if (location) {\r
-                                       location = location[0];\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if (location)\r
-                               break;\r
-               }\r
-\r
-               if (location) {\r
-                       location = condense_path(location);\r
-                       var libdir = FSO.GetParentFolderName(location);\r
-                       libname = FSO.GetFileName(location);\r
-                       ADD_FLAG("LDFLAGS" + target, '/libpath:"' + libdir + '" ');\r
-                       ADD_FLAG("LIBS" + target, libname);\r
-\r
-                       STDOUT.WriteLine(location);\r
-\r
-                       return location;\r
-               }\r
-\r
-               // Check in their standard lib path\r
-               location = find_pattern_in_path(libname, WshShell.Environment("Process").Item("LIB"));\r
-\r
-               if (location) {\r
-                       location = condense_path(location);\r
-                       libname = FSO.GetFileName(location);\r
-                       ADD_FLAG("LIBS" + target, libname);\r
-\r
-                       STDOUT.WriteLine("<in LIB path> " + libname);\r
-                       return location;\r
-               }\r
-\r
-               // Check in their general extra libs path\r
-               location = find_pattern_in_path(libname, PHP_EXTRA_LIBS);\r
-               if (location) {\r
-                       location = condense_path(location);\r
-                       libname = FSO.GetFileName(location);\r
-                       ADD_FLAG("LIBS" + target, libname);\r
-                       STDOUT.WriteLine("<in extra libs path>");\r
-                       return location;\r
-               }\r
-       }\r
-\r
-       STDOUT.WriteLine("<not found>");\r
-\r
-       return false;\r
-}\r
-\r
-function OLD_CHECK_LIB(libnames, target, path_to_check)\r
-{\r
-       if (target == null) {\r
-               target = "";\r
-       } else {\r
-               target = "_" + target.toUpperCase();\r
-       }\r
-       \r
-       if (path_to_check == null) {\r
-               path_to_check = php_usual_lib_suspects;\r
-       } else {\r
-               path_to_check += ";" + php_usual_lib_suspects;\r
-       }\r
-       var have = 0;\r
-       var p;\r
-       var i;\r
-       var libname;\r
-\r
-       var subdir = PHP_DEBUG == "yes" ? "Debug" : (PHP_DEBUG_PACK == "yes"?"Release_Dbg":"Release");\r
-\r
-       libnames = libnames.split(';');\r
-       for (i = 0; i < libnames.length; i++) {\r
-               libname = libnames[i];\r
-               p = search_paths(libname, path_to_check, "LIB");\r
-\r
-               if (!p) {\r
-                       p = search_paths(subdir + "\\" + libname, path_to_check, "LIB");\r
-                       if (p) {\r
-                               p += "\\" + subdir;\r
-                       }\r
-               }\r
-\r
-               if (typeof(p) == "string") {\r
-                       ADD_FLAG("LDFLAGS" + target, '/libpath:"' + p + '" ');\r
-                       ADD_FLAG("LIBS" + target, libname);\r
-                       have = 1;\r
-               } else if (p == true) {\r
-                       ADD_FLAG("LIBS" + target, libname);\r
-                       have = 1;\r
-               } else {\r
-                       /* not found in the defaults or the explicit paths,\r
-                        * so check the general extra libs; if we find\r
-                        * it here, no need to add another /libpath: for it as we\r
-                        * already have it covered, but we need to add the lib\r
-                        * to LIBS_XXX */\r
-                       if (false != search_paths(libname, PHP_EXTRA_LIBS, null)) {\r
-                               ADD_FLAG("LIBS" + target, libname);\r
-                               have = 1;\r
-                       }\r
-               }\r
-\r
-               if (have) {\r
-                       break;\r
-               }\r
-       }\r
-\r
-//     AC_DEFINE("HAVE_" + header_name.toUpperCase().replace(new RegExp("/\\\\-\.", "g"), "_"), have);\r
-\r
-       return have;\r
-\r
-}\r
-\r
-function CHECK_FUNC_IN_HEADER(header_name, func_name, path_to_check, add_to_flag)\r
-{\r
-       var c = false;\r
-       var sym;\r
-\r
-       STDOUT.Write("Checking for " + func_name + " in " + header_name + " ... ");\r
-\r
-       c = GREP_HEADER(header_name, func_name, path_to_check);\r
-\r
-       sym = func_name.toUpperCase();\r
-       sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");\r
-\r
-       if (typeof(add_to_flag) == "undefined") {\r
-               AC_DEFINE("HAVE_" + sym, c ? 1 : 0);\r
-       } else {\r
-               ADD_FLAG(add_to_flag, "/DHAVE_" + sym + "=" + (c ? "1" : "0"));\r
-       }\r
-\r
-       if (c) {\r
-               STDOUT.WriteLine("OK");\r
-               return c;\r
-       }\r
-       STDOUT.WriteLine("No");\r
-       return false;   \r
-}\r
-\r
-function GREP_HEADER(header_name, regex, path_to_check)\r
-{\r
-       var c = false;\r
-\r
-       if (FSO.FileExists(path_to_check + "\\" + header_name)) {\r
-               c = file_get_contents(path_to_check + "\\" + header_name);\r
-       }\r
-\r
-       if (!c) {\r
-               /* look in the include path */\r
-\r
-               var p = search_paths(header_name, path_to_check, "INCLUDE");\r
-               if (typeof(p) == "string") {\r
-                       c = file_get_contents(p);\r
-               } else if (p == false) {\r
-                       p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);\r
-                       if (typeof(p) == "string") {\r
-                               c = file_get_contents(p);\r
-                       }\r
-               } \r
-               if (!c) {\r
-                       return false;\r
-               }\r
-       }\r
-\r
-       if (typeof(regex) == "string") {\r
-               regex = new RegExp(regex);\r
-       }\r
-\r
-       if (c.match(regex)) {\r
-               /* caller can now use RegExp.$1 etc. to get at patterns */\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
-\r
-function CHECK_HEADER_ADD_INCLUDE(header_name, flag_name, path_to_check, use_env, add_dir_part, add_to_flag_only)\r
-{\r
-       var dir_part_to_add = "";\r
-       \r
-       if (use_env == null) {\r
-               use_env = true;\r
-       }\r
-\r
-       // if true, add the dir part of the header_name to the include path\r
-       if (add_dir_part == null) {\r
-               add_dir_part = false;\r
-       } else if (add_dir_part) {\r
-               var basename = FSO.GetFileName(header_name);\r
-               dir_part_to_add = "\\" + header_name.substr(0, header_name.length - basename.length - 1);\r
-       }\r
-\r
-       if (path_to_check == null) {\r
-               path_to_check = php_usual_include_suspects;\r
-       } else {\r
-               path_to_check += ";" + php_usual_include_suspects;\r
-       }\r
-       \r
-       var p = search_paths(header_name, path_to_check, use_env ? "INCLUDE" : null);\r
-       var have = 0;\r
-       var sym;\r
-\r
-       if (typeof(p) == "string") {\r
-               ADD_FLAG(flag_name, '/I "' + p + dir_part_to_add + '" ');\r
-       } else if (p == false) {\r
-               /* not found in the defaults or the explicit paths,\r
-                * so check the general extra includes; if we find\r
-                * it here, no need to add another /I for it as we\r
-                * already have it covered, unless we are adding\r
-                * the dir part.... */\r
-               p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);\r
-               if (typeof(p) == "string" && add_dir_part) {\r
-                       ADD_FLAG(flag_name, '/I "' + p + dir_part_to_add + '" ');\r
-               }\r
-       } \r
-       have = p ? 1 : 0\r
-\r
-       sym = header_name.toUpperCase();\r
-       sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");\r
-\r
-       if (typeof(add_to_flag_only) == "undefined" &&\r
-                       flag_name.match(new RegExp("^CFLAGS_(.*)$"))) {\r
-               add_to_flag_only = true;\r
-       }\r
-\r
-       if (typeof(add_to_flag_only) != "undefined") {\r
-               ADD_FLAG(flag_name, "/DHAVE_" + sym + "=" + have);\r
-       } else {\r
-               AC_DEFINE("HAVE_" + sym, have, "have the " + header_name + " header file");\r
-       }\r
-\r
-       return p;\r
-}\r
-\r
-/* emits rule to generate version info for a SAPI\r
- * or extension.  Returns the name of the .res file\r
- * that will be generated */\r
-function generate_version_info_resource(makefiletarget, basename, creditspath, sapi)\r
-{\r
-       var resname = makefiletarget + ".res";\r
-       var res_desc = makefiletarget;\r
-       var res_prod_name = "PHP " + makefiletarget;\r
-       var credits;\r
-       var thanks = "";\r
-       var logo = "";\r
-       var debug = "";\r
-       var project_url = "http://www.php.net";\r
-       var project_header = creditspath + "/php_" + basename + ".h";\r
-       var versioning = "";\r
-\r
-       if (sapi) {\r
-               var internal_name = basename.toUpperCase() + " SAPI";\r
-       } else {\r
-               var internal_name = basename.toUpperCase() + " extension";\r
-       }\r
-\r
-       if (FSO.FileExists(creditspath + '/CREDITS')) {\r
-               credits = FSO.OpenTextFile(creditspath + '/CREDITS', 1);\r
-               res_desc = credits.ReadLine();\r
-               try {\r
-                       thanks = credits.ReadLine();\r
-               } catch (e) {\r
-                       thanks = null;\r
-               }\r
-               if (thanks == null) {\r
-                       thanks = "";\r
-               } else {\r
-                       thanks = "Thanks to " + thanks;\r
-               }\r
-               credits.Close();\r
-       }\r
-\r
-       if (creditspath.match(new RegExp("pecl"))) {\r
-               /* PECL project url - this will eventually work correctly for all */\r
-               project_url = "http://pecl.php.net/" + basename;\r
-\r
-               /* keep independent versioning PECL-specific for now */\r
-               if (FSO.FileExists(project_header)) {\r
-                       if (header = FSO.OpenTextFile(project_header, 1)) {\r
-                               contents = header.ReadAll();\r
-                               /* allowed: x.x.x[a|b|-alpha|-beta][RCx][-dev] */\r
-                               if (contents.match(new RegExp('PHP_' + basename.toUpperCase() + '_VERSION(\\s+)"((\\d+\.\\d+(\.\\d+)?)((a|b)(\\d)?|\-[a-z]{3,5})?(RC\\d+)?(\-dev)?)'))) {\r
-                                       project_version = RegExp.$2;\r
-                                       file_version = RegExp.$3.split('.');\r
-                                       if (!file_version[2]) {\r
-                                               file_version[2] = 0;\r
-                                       }\r
-                                       versioning = '\\"" /d EXT_FILE_VERSION=' + file_version[0] + ',' + file_version[1] + ',' + file_version[2] + ' /d EXT_VERSION="\\"' + project_version;\r
-                               }\r
-                               header.Close();\r
-                       }\r
-               }\r
-       }\r
-\r
-       if (makefiletarget.match(new RegExp("\\.exe$"))) {\r
-               logo = " /d WANT_LOGO ";\r
-       }\r
-\r
-       if (PHP_DEBUG != "no") {\r
-               debug = " /d _DEBUG";\r
-       }\r
-\r
-       /**\r
-        * Use user supplied template.rc if it exists\r
-        */\r
-       if (FSO.FileExists(creditspath + '\\template.rc')) {\r
-               MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": " + creditspath + "\\template.rc");\r
-               MFO.WriteLine("\t$(RC) /fo $(BUILD_DIR)\\" + resname + logo + debug +\r
-                       ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"' +\r
-                       makefiletarget + '\\"" /d PRODUCT_NAME="\\"' + res_prod_name +\r
-                       versioning + '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" ' +\r
-                       creditspath + '\\template.rc');\r
-               return resname;\r
-       }\r
-       if (MODE_PHPIZE) {\r
-               MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": $(PHP_DIR)\\build\\template.rc");\r
-               MFO.WriteLine("\t$(RC)  /I $(PHP_DIR)/include /n /fo $(BUILD_DIR)\\" + resname + logo + debug +\r
-                       ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'\r
-                       + makefiletarget + '\\"" /d URL="\\"' + project_url + \r
-                       '\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning + \r
-                       '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" $(PHP_DIR)\\build\\template.rc');\r
-       } else {\r
-               MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": win32\\build\\template.rc");\r
-               MFO.WriteLine("\t$(RC) /n /fo $(BUILD_DIR)\\" + resname + logo + debug +\r
-                       ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'\r
-                       + makefiletarget + '\\"" /d URL="\\"' + project_url + \r
-                       '\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning + \r
-                       '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" win32\\build\\template.rc');\r
-       }\r
-       MFO.WriteBlankLines(1);\r
-       return resname;\r
-}\r
-\r
-/* Check if PGO is enabled for given module. To disable PGO for a particular module,\r
-define a global variable by the following name scheme before SAPI() or EXTENSION() call\r
-       var PHP_MYMODULE_PGO = false; */\r
-function is_pgo_desired(mod)\r
-{\r
-       var varname = "PHP_" + mod.toUpperCase() + "_PGO";\r
-\r
-       /* XXX enable PGO in phpize mode */\r
-       if (MODE_PHPIZE) {\r
-               return false;\r
-       }\r
-\r
-       /* don't disable if there's no mention of the varname */\r
-       if (eval("typeof " + varname + " == 'undefined'")) {\r
-               return true;\r
-       }\r
-\r
-       return eval("!!" + varname);\r
-}\r
-\r
-function SAPI(sapiname, file_list, makefiletarget, cflags, obj_dir)\r
-{\r
-       var SAPI = sapiname.toUpperCase();\r
-       var ldflags;\r
-       var resname;\r
-       var ld;\r
-       var manifest;\r
-\r
-       if (typeof(obj_dir) == "undefined") {\r
-               sapiname_for_printing = configure_module_dirname;\r
-       } else {\r
-               sapiname_for_printing = configure_module_dirname + " (via " + obj_dir + ")";\r
-       }\r
-\r
-       STDOUT.WriteLine("Enabling SAPI " + sapiname_for_printing);\r
-\r
-       MFO.WriteBlankLines(1);\r
-       MFO.WriteLine("# objects for SAPI " + sapiname);\r
-       MFO.WriteBlankLines(1);\r
-\r
-       if (cflags) {\r
-               ADD_FLAG('CFLAGS_' + SAPI, cflags);\r
-       }\r
-\r
-       ADD_SOURCES(configure_module_dirname, file_list, sapiname, obj_dir);\r
-       MFO.WriteBlankLines(1);\r
-       MFO.WriteLine("# SAPI " + sapiname);\r
-       MFO.WriteBlankLines(1);\r
-\r
-       /* generate a .res file containing version information */\r
-       resname = generate_version_info_resource(makefiletarget, sapiname, configure_module_dirname, true);\r
-       \r
-       MFO.WriteLine(makefiletarget + ": $(BUILD_DIR)\\" + makefiletarget);\r
-       MFO.WriteLine("\t@echo SAPI " + sapiname_for_printing + " build complete");\r
-       if (MODE_PHPIZE) {\r
-               MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(BUILD_DIR)\\" + resname);\r
-       } else {\r
-               MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);\r
-       }\r
-\r
-       if (makefiletarget.match(new RegExp("\\.dll$"))) {\r
-               ldflags = "/dll $(LDFLAGS)";\r
-               manifest = "-@$(_VC_MANIFEST_EMBED_DLL)";\r
-       } else if (makefiletarget.match(new RegExp("\\.lib$"))) {\r
-               ldflags = "$(LDFLAGS)";\r
-               ld = "$(MAKE_LIB)";\r
-       } else {\r
-               ldflags = "$(LDFLAGS)";\r
-               manifest = "-@$(_VC_MANIFEST_EMBED_EXE)";\r
-       }\r
-       \r
-       if(is_pgo_desired(sapiname) && (PHP_PGI == "yes" || PHP_PGO != "no")) {\r
-               // Add compiler and link flags if PGO options are selected\r
-               if (PHP_DEBUG != "yes" && PHP_PGI == "yes") {\r
-                       ADD_FLAG('CFLAGS_' + SAPI, "/GL /O2");\r
-                       ADD_FLAG('LDFLAGS_' + SAPI, "/LTCG:PGINSTRUMENT");\r
-               }\r
-               else if (PHP_DEBUG != "yes" && PHP_PGO != "no") {\r
-                       ADD_FLAG('CFLAGS_' + SAPI, "/GL /O2");\r
-                       ADD_FLAG('LDFLAGS_' + SAPI, "/LTCG:PGUPDATE");\r
-               }\r
-\r
-               ldflags += " /PGD:$(PGOPGD_DIR)\\" + makefiletarget.substring(0, makefiletarget.indexOf(".")) + ".pgd";\r
-       }\r
-\r
-       if (MODE_PHPIZE) {\r
-               if (ld) {\r
-                       MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);\r
-               } else {\r
-                       ld = "@$(CC)";\r
-                       MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");\r
-               }\r
-       } else {\r
-               if (ld) {\r
-                       MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);\r
-               } else {\r
-                       ld = "@$(CC)";\r
-                       MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");\r
-               }\r
-       }\r
-\r
-       if (manifest) {\r
-               MFO.WriteLine("\t" + manifest);\r
-       }\r
-               \r
-       DEFINE('CFLAGS_' + SAPI + '_OBJ', '$(CFLAGS_' + SAPI + ')');\r
-\r
-       if (configure_module_dirname.match("pecl")) {\r
-               ADD_FLAG("PECL_TARGETS", makefiletarget);\r
-       } else {\r
-               ADD_FLAG("SAPI_TARGETS", makefiletarget);\r
-       }\r
-\r
-       MFO.WriteBlankLines(1);\r
-       sapi_enabled[sapi_enabled.length] = [sapiname];\r
-}\r
-\r
-function ADD_DIST_FILE(filename)\r
-{\r
-       if (configure_module_dirname.match("pecl")) {\r
-               ADD_FLAG("PECL_EXTRA_DIST_FILES", filename);\r
-       } else {\r
-               ADD_FLAG("PHP_EXTRA_DIST_FILES", filename);\r
-       }\r
-}      \r
-\r
-function file_get_contents(filename)\r
-{\r
-       var f, c;\r
-       try {\r
-               f = FSO.OpenTextFile(filename, 1);\r
-               c = f.ReadAll();\r
-               f.Close();\r
-               return c;\r
-       } catch (e) {\r
-               STDOUT.WriteLine("Problem reading " + filename);\r
-               return false;\r
-       }\r
-}\r
-\r
-// Add a dependency on another extension, so that\r
-// the dependencies are built before extname\r
-function ADD_EXTENSION_DEP(extname, dependson, optional)\r
-{\r
-       var EXT = extname.toUpperCase();\r
-       var DEP = dependson.toUpperCase();\r
-       var dep_present = false;\r
-       var dep_shared = false;\r
-\r
-       try {\r
-               dep_present = eval("PHP_" + DEP);\r
-\r
-               if (dep_present != "no") {\r
-                       try {\r
-                               dep_shared = eval("PHP_" + DEP + "_SHARED");\r
-                       } catch (e) {\r
-                               dep_shared = false;\r
-                       }\r
-               }\r
-\r
-       } catch (e) {\r
-               dep_present = "no";\r
-       }\r
-\r
-       if (optional) {\r
-               if (dep_present == "no") {\r
-                       MESSAGE("\t" + dependson + " not found: " + dependson + " support in " + extname + " disabled");\r
-                       return false;\r
-               }\r
-       }\r
-\r
-       var ext_shared = eval("PHP_" + EXT + "_SHARED");\r
-\r
-       if (dep_shared) {\r
-               if (!ext_shared) {\r
-                       if (optional) {\r
-                               MESSAGE("\tstatic " + extname + " cannot depend on shared " + dependson + ": " + dependson + "support disabled");\r
-                               return false;\r
-                       }\r
-                       ERROR("static " + extname + " cannot depend on shared " + dependson);\r
-               }\r
-\r
-               ADD_FLAG("LIBS_" + EXT, "php_" + dependson + ".lib");\r
-               if (MODE_PHPIZE) {\r
-                       ADD_FLAG("LDFLAGS_" + EXT, "/libpath:$(BUILD_DIR_DEV)\\lib");\r
-                       ADD_FLAG("DEPS_" + EXT, "$(BUILD_DIR_DEV)\\lib\\php_" + dependson + ".lib");\r
-               } else {\r
-                       ADD_FLAG("LDFLAGS_" + EXT, "/libpath:$(BUILD_DIR)");\r
-                       ADD_FLAG("DEPS_" + EXT, "$(BUILD_DIR)\\php_" + dependson + ".lib");\r
-               }\r
-\r
-       } else {\r
-\r
-               if (dep_present == "no") {\r
-                       if (ext_shared) {\r
-                               WARNING(extname + " cannot be built: missing dependency, " + dependson + " not found");\r
-\r
-                               var dllname = ' php_' + extname + '.dll';\r
-\r
-                               if (!REMOVE_TARGET(dllname, 'EXT_TARGETS')) {\r
-                                       REMOVE_TARGET(dllname, 'PECL_TARGETS');\r
-                               }\r
-\r
-                               return false;\r
-\r
-                       }\r
-\r
-                       ERROR("Cannot build " + extname + "; " + dependson + " not enabled");\r
-                       return false;\r
-               }\r
-       } // dependency is statically built-in to PHP\r
-       return true;\r
-}\r
-\r
-var static_pgo_enabled = false;\r
-\r
-function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir)\r
-{\r
-       var objs = null;\r
-       var EXT = extname.toUpperCase();\r
-       var extname_for_printing;\r
-       var ldflags;\r
-\r
-       if (shared == null) {\r
-               eval("shared = PHP_" + EXT + "_SHARED;");\r
-       } else {\r
-               eval("PHP_" + EXT + "_SHARED = shared;");\r
-       }\r
-\r
-       if (cflags == null) {\r
-               cflags = "";\r
-       }\r
-\r
-       if (typeof(obj_dir) == "undefined") {\r
-               extname_for_printing = configure_module_dirname;\r
-       } else {\r
-               extname_for_printing = configure_module_dirname + " (via " + obj_dir + ")";\r
-       }\r
-\r
-       if (shared) {\r
-               STDOUT.WriteLine("Enabling extension " + extname_for_printing + " [shared]");\r
-               cflags = "/D COMPILE_DL_" + EXT + " /D " + EXT + "_EXPORTS=1 " + cflags;\r
-               ADD_FLAG("CFLAGS_PHP", "/D COMPILE_DL_" + EXT);\r
-       } else {\r
-               STDOUT.WriteLine("Enabling extension " + extname_for_printing);\r
-       }\r
-\r
-       MFO.WriteBlankLines(1);\r
-       MFO.WriteLine("# objects for EXT " + extname);\r
-       MFO.WriteBlankLines(1);\r
-\r
-       ADD_SOURCES(configure_module_dirname, file_list, extname, obj_dir);\r
-       \r
-       MFO.WriteBlankLines(1);\r
-\r
-       if (shared) {\r
-               if (dllname == null) {\r
-                       dllname = "php_" + extname + ".dll";\r
-               }\r
-               var libname = dllname.substring(0, dllname.length-4) + ".lib";\r
-\r
-               var resname = generate_version_info_resource(dllname, extname, configure_module_dirname, false);\r
-               var ld = "@$(CC)";\r
-\r
-               ldflags = "";\r
-               if (is_pgo_desired(extname) && (PHP_PGI == "yes" || PHP_PGO != "no")) {\r
-                       // Add compiler and link flags if PGO options are selected\r
-                       if (PHP_DEBUG != "yes" && PHP_PGI == "yes") {\r
-                               ADD_FLAG('LDFLAGS_' + EXT, "/LTCG:PGINSTRUMENT");\r
-                       }\r
-                       else if (PHP_DEBUG != "yes" && PHP_PGO != "no") {\r
-                               ADD_FLAG('LDFLAGS_' + EXT, "/LTCG:PGUPDATE");\r
-                       }\r
-\r
-                       ADD_FLAG('CFLAGS_' + EXT, "/GL /O2");\r
-\r
-                       ldflags = " /PGD:$(PGOPGD_DIR)\\" + dllname.substring(0, dllname.indexOf(".")) + ".pgd";\r
-               }\r
-\r
-               MFO.WriteLine("$(BUILD_DIR)\\" + libname + ": $(BUILD_DIR)\\" + dllname);\r
-               MFO.WriteBlankLines(1);\r
-               if (MODE_PHPIZE) {\r
-                       MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(PHPLIB) $(BUILD_DIR)\\" + resname);\r
-                       MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");\r
-               } else {\r
-                       MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);\r
-                       MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + ldflags + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");\r
-               }\r
-               MFO.WriteLine("\t-@$(_VC_MANIFEST_EMBED_DLL)");\r
-               MFO.WriteBlankLines(1);\r
-\r
-               if (configure_module_dirname.match("pecl")) {\r
-                       ADD_FLAG("PECL_TARGETS", dllname);\r
-               } else {\r
-                       ADD_FLAG("EXT_TARGETS", dllname);\r
-               }\r
-               MFO.WriteLine(dllname + ": $(BUILD_DIR)\\" + dllname);\r
-               MFO.WriteLine("\t@echo EXT " + extname + " build complete");\r
-               MFO.WriteBlankLines(1);\r
-               \r
-               DEFINE('CFLAGS_' + EXT + '_OBJ', '$(CFLAGS_' + EXT + ')');\r
-       } else {\r
-               ADD_FLAG("STATIC_EXT_OBJS", "$(" + EXT + "_GLOBAL_OBJS)");\r
-               ADD_FLAG("STATIC_EXT_LIBS", "$(LIBS_" + EXT + ")");\r
-               ADD_FLAG("STATIC_EXT_LDFLAGS", "$(LDFLAGS_" + EXT + ")");\r
-               ADD_FLAG("STATIC_EXT_CFLAGS", "$(CFLAGS_" + EXT + ")");\r
-               if (is_pgo_desired(extname) && (PHP_PGI == "yes" || PHP_PGO != "no")) {\r
-                       if (!static_pgo_enabled) {\r
-                               if (PHP_DEBUG != "yes" && PHP_PGI == "yes") {\r
-                                       ADD_FLAG('STATIC_EXT_LDFLAGS', "/LTCG:PGINSTRUMENT");\r
-                               }\r
-                               else if (PHP_DEBUG != "yes" && PHP_PGO != "no") {\r
-                                       ADD_FLAG('STATIC_EXT_LDFLAGS', "/LTCG:PGUPDATE");\r
-                               }\r
-\r
-                               ADD_FLAG("STATIC_EXT_CFLAGS", "/GL /O2");\r
-                               static_pgo_enabled = true;\r
-                       }\r
-               }\r
-\r
-               /* find the header that declares the module pointer,\r
-                * so we can include it in internal_functions.c */\r
-               var ext_dir = FSO.GetFolder(configure_module_dirname);\r
-               var fc = new Enumerator(ext_dir.Files);\r
-               var re = /\.h$/;\r
-               var s, c;\r
-               for (; !fc.atEnd(); fc.moveNext()) {\r
-                       s = fc.item() + "";\r
-                       if (s.match(re)) {\r
-                               c = file_get_contents(s);\r
-                               if (c.match("phpext_")) {\r
-                                       extension_include_code += '#include "' + configure_module_dirname + '/' + FSO.GetFileName(s) + '"\r\n';\r
-                               }\r
-                       }\r
-               }\r
-       \r
-               extension_module_ptrs += '\tphpext_' + extname + '_ptr,\r\n';\r
-       \r
-               DEFINE('CFLAGS_' + EXT + '_OBJ', '$(CFLAGS_PHP) $(CFLAGS_' + EXT + ')');\r
-       }\r
-       if (MODE_PHPIZE && FSO.FileExists(PHP_DIR + "/include/main/config.pickle.h")) {\r
-               cflags = "/FI main/config.pickle.h " + cflags;\r
-       }\r
-       ADD_FLAG("CFLAGS_" + EXT, cflags);\r
-\r
-       extensions_enabled[extensions_enabled.length] = [extname, shared ? 'shared' : 'static'];\r
-}\r
-\r
-function ADD_SOURCES(dir, file_list, target, obj_dir)\r
-{\r
-       var i;\r
-       var tv;\r
-       var src, obj, sym, flags;\r
-\r
-       if (target == null) {\r
-               target = "php";\r
-       }\r
-\r
-       sym = target.toUpperCase() + "_GLOBAL_OBJS";\r
-       flags = "CFLAGS_" + target.toUpperCase() + '_OBJ';\r
-\r
-       if (configure_subst.Exists(sym)) {\r
-               tv = configure_subst.Item(sym);\r
-       } else {\r
-               tv = "";\r
-       }\r
-\r
-       file_list = file_list.split(new RegExp("\\s+"));\r
-       file_list.sort();\r
-\r
-       var re = new RegExp("\.[a-z0-9A-Z]+$");\r
-\r
-       dir = dir.replace(new RegExp("/", "g"), "\\");\r
-       var objs_line = "";\r
-       var srcs_line = "";\r
-\r
-       var sub_build = "$(BUILD_DIR)\\";\r
-\r
-       /* if module dir is not a child of the main source dir,\r
-        * we need to tweak it; we should have detected such a\r
-        * case in condense_path and rewritten the path to\r
-        * be relative.\r
-        * This probably breaks for non-sibling dirs, but that\r
-        * is not a problem as buildconf only checks for pecl\r
-        * as either a child or a sibling */\r
-       if (obj_dir == null) {\r
-               var build_dir = dir.replace(new RegExp("^..\\\\"), "");\r
-               var mangle_dir = build_dir.replace(new RegExp("[\\\\/.-]", "g"), "_");\r
-               var bd_flags_name = "CFLAGS_BD_" + mangle_dir.toUpperCase();\r
-       }\r
-       else {\r
-               var build_dir = obj_dir.replace(new RegExp("^..\\\\"), "");\r
-               var mangle_dir = build_dir.replace(new RegExp("[\\\\/.-]", "g"), "_");\r
-               var bd_flags_name = "CFLAGS_BD_" + mangle_dir.toUpperCase();\r
-       }\r
-       \r
-       var dirs = build_dir.split("\\");\r
-       var i, d = "";\r
-       for (i = 0; i < dirs.length; i++) {\r
-               d += dirs[i];\r
-               build_dirs[build_dirs.length] = d;\r
-               d += "\\";\r
-       }\r
-       sub_build += d;\r
-\r
-\r
-       DEFINE(bd_flags_name, " /Fd" + sub_build + " /Fp" + sub_build + " /FR" + sub_build + " ");\r
-\r
-       for (i in file_list) {\r
-               src = file_list[i];\r
-               obj = src.replace(re, ".obj");\r
-               tv += " " + sub_build + obj;\r
-\r
-               if (!PHP_MP_DISABLED) {\r
-                       if (i > 0) {\r
-                               objs_line += " " + sub_build + obj;     \r
-                               srcs_line += " " + dir + "\\" + src;\r
-                       } else {\r
-                               objs_line = sub_build + obj;    \r
-                               srcs_line = dir + "\\" + src;\r
-                       }\r
-               } else {\r
-                       MFO.WriteLine(sub_build + obj + ": " + dir + "\\" + src);\r
-\r
-                       if (PHP_ANALYZER == "pvs") {\r
-                               MFO.WriteLine("\t@\"$(PVS_STUDIO)\" --cl-params $(" + flags + ") $(CFLAGS) $(" + bd_flags_name + ") /c " + dir + "\\" + src + " --source-file "  + dir + "\\" + src\r
-                                       + " --cfg PVS-Studio.conf --errors-off \"V122 V117 V111\" ");\r
-                       }\r
-                       MFO.WriteLine("\t@$(CC) $(" + flags + ") $(CFLAGS) $(" + bd_flags_name + ") /c " + dir + "\\" + src + " /Fo" + sub_build + obj);\r
-               }\r
-       }\r
-\r
-       if (!PHP_MP_DISABLED) {\r
-               MFO.WriteLine(objs_line + ": " + srcs_line);\r
-               MFO.WriteLine("\t$(CC) $(" + flags + ") $(CFLAGS) /Fo" + sub_build + " $(" + bd_flags_name + ") /c " + srcs_line);\r
-       }\r
-\r
-       DEFINE(sym, tv);\r
-}\r
-\r
-function REMOVE_TARGET(dllname, flag)\r
-{\r
-       var dllname = dllname.replace(/\s/g, "");\r
-       var EXT = dllname.replace(/php_(\S+)\.dll/, "$1").toUpperCase();\r
-       var php_flags = configure_subst.Item("CFLAGS_PHP");\r
-\r
-       if (configure_subst.Exists(flag)) {\r
-               var targets = configure_subst.Item(flag);\r
-\r
-               if (targets.match(dllname)) {\r
-                       configure_subst.Remove(flag);\r
-                       targets = targets.replace(dllname, "");\r
-                       targets = targets.replace(/\s+/, " ");\r
-                       targets = targets.replace(/\s$/, "");\r
-                       configure_subst.Add(flag, targets);\r
-                       configure_hdr.Add("HAVE_" + EXT, new Array(0, ""));\r
-                       configure_subst.Item("CFLAGS_PHP") = php_flags.replace(" /D COMPILE_DL_" + EXT, "");\r
-                       extensions_enabled.pop();\r
-                       return true;\r
-               }\r
-       }\r
-       return false;\r
-}\r
-\r
-function generate_internal_functions()\r
-{\r
-       var infile, outfile;\r
-       var indata;\r
-\r
-       STDOUT.WriteLine("Generating main/internal_functions.c");\r
-       \r
-       infile = FSO.OpenTextFile("main/internal_functions.c.in", 1);\r
-       indata = infile.ReadAll();\r
-       infile.Close();\r
-       \r
-       indata = indata.replace("@EXT_INCLUDE_CODE@", extension_include_code);\r
-       indata = indata.replace("@EXT_MODULE_PTRS@", extension_module_ptrs);\r
-\r
-       if (FSO.FileExists("main/internal_functions.c")) {\r
-               var origdata = file_get_contents("main/internal_functions.c");\r
-\r
-               if (origdata == indata) {\r
-                       STDOUT.WriteLine("\t[content unchanged; skipping]");\r
-                       return;\r
-               }\r
-       }\r
-\r
-       outfile = FSO.CreateTextFile("main/internal_functions.c", true);\r
-       outfile.Write(indata);\r
-       outfile.Close();\r
-}\r
-\r
-function output_as_table(header, ar_out)\r
-{\r
-       var l = header.length;\r
-       var cols = 80;\r
-       var fixedlength = "";\r
-       var t = 0;\r
-       var i,j,k,m;\r
-       var out = "| ";\r
-       var min = new Array(l);\r
-       var max = new Array(l);\r
-\r
-       if (!!ar_out[0] && l != ar_out[0].length) {\r
-               STDOUT.WriteLine("Invalid header argument, can't output the table " + l + " " + ar_out[0].length  );\r
-               return;\r
-       }\r
-\r
-       for (j=0; j < l; j++) {\r
-               var tmax, tmin;\r
-\r
-               /*Figure out the max length per column */\r
-               tmin = 0;\r
-               tmax = 0;\r
-               for (k = 0; k < ar_out.length; k++) {\r
-                       if(typeof ar_out[k][j] != 'undefined') {\r
-                               var t = ar_out[k][j].length;\r
-                               if (t > tmax) tmax = t;\r
-                               else if (t < tmin) tmin = t;\r
-                       }\r
-               }\r
-               if (tmax > header[j].length) {\r
-                       max[j] = tmax;\r
-               } else {\r
-                       max[j] = header[j].length;\r
-               }\r
-               if (tmin < header[j].length) {\r
-                       min[j] = header[j].length;\r
-               }\r
-       }\r
-\r
-       sep = "";\r
-       k = 0;\r
-       for (i = 0; i < l; i++) {\r
-               k += max[i] + 3;\r
-       }\r
-       k++;\r
-\r
-       for (j=0; j < k; j++) {\r
-               sep += "-";\r
-       }\r
-\r
-       STDOUT.WriteLine(sep);\r
-       out = "|";\r
-       for (j=0; j < l; j++) {\r
-               out += " " + header[j];\r
-               for (var i = 0; i < (max[j] - header[j].length); i++){\r
-                       out += " ";\r
-               }\r
-               out += " |";\r
-       }\r
-       STDOUT.WriteLine(out);\r
-\r
-       STDOUT.WriteLine(sep);\r
-\r
-       out = "|";\r
-       for (i=0; i < ar_out.length; i++) {\r
-               line = ar_out[i];\r
-               for (j=0; j < l; j++) {\r
-                       out += " " + line[j];\r
-                       if(typeof line[j] != 'undefined') {\r
-                               for (var k = 0; k < (max[j] - line[j].length); k++){\r
-                                       out += " ";\r
-                               }\r
-                       }\r
-                       out += " |";\r
-               }\r
-               STDOUT.WriteLine(out);\r
-               out = "|";\r
-       }\r
-\r
-       STDOUT.WriteLine(sep);\r
-}\r
-\r
-function write_summary()\r
-{\r
-       var ar = new Array();\r
-\r
-       STDOUT.WriteBlankLines(2);\r
-\r
-       STDOUT.WriteLine("Enabled extensions:");\r
-       output_as_table(["Extension", "Mode"], extensions_enabled.sort());\r
-       STDOUT.WriteBlankLines(2);\r
-       if (!MODE_PHPIZE) {\r
-               STDOUT.WriteLine("Enabled SAPI:");\r
-               output_as_table(["Sapi Name"], sapi_enabled);\r
-               STDOUT.WriteBlankLines(2);\r
-       }\r
-       ar[0] = ['Build type', PHP_DEBUG == "yes" ? "Debug" : "Release"];\r
-       ar[1] = ['Thread Safety', PHP_ZTS == "yes" ? "Yes" : "No"];\r
-       ar[2] = ['Compiler', VC_VERSIONS[VCVERS]];\r
-       ar[3] = ['Architecture', X64 ? 'x64' : 'x86'];\r
-       if (PHP_PGO == "yes") {\r
-               ar[4] = ['Optimization', "PGO"];\r
-       } else if (PHP_PGI == "yes") {\r
-               ar[4] = ['Optimization', "PGI"];\r
-       } else {\r
-               ar[4] = ['Optimization', PHP_DEBUG == "yes" ? "disabled" : "PGO disabled"];\r
-       }\r
-       if (PHP_ANALYZER == "vs") {\r
-               ar[5] = ['Static analyzer', 'Visual Studio'];\r
-       } else if (PHP_ANALYZER == "pvs") {\r
-               ar[5] = ['Static analyzer', 'PVS-Studio'];\r
-       } else {\r
-               ar[5] = ['Static analyzer', 'disabled'];\r
-       }\r
-\r
-       output_as_table(["",""], ar);\r
-       STDOUT.WriteBlankLines(2);\r
-}\r
-\r
-function generate_files()\r
-{\r
-       var i, dir, bd, last;\r
-\r
-       STDOUT.WriteBlankLines(1);\r
-       STDOUT.WriteLine("Creating build dirs...");\r
-       dir = get_define("BUILD_DIR");\r
-       build_dirs.sort();\r
-       last = null;\r
-\r
-       if (!FSO.FolderExists(dir)) {\r
-               FSO.CreateFolder(dir);\r
-       }\r
-\r
-       for (i = 0; i < build_dirs.length; i++) {\r
-               bd = FSO.BuildPath(dir, build_dirs[i]);\r
-               if (bd == last) {\r
-                       continue;\r
-               }\r
-               last = bd;\r
-\r
-               build_dir = get_define('BUILD_DIR');\r
-               build_dir = build_dir.replace(new RegExp("\\\\", "g"), "\\\\");\r
-               if (build_dir.substr(build_dir.Length - 2, 2) != '\\\\') {\r
-                       build_dir += '\\\\';\r
-               }\r
-               ADD_FLAG("BUILD_DIRS_SUB", bd.replace(new RegExp(build_dir), ''));\r
-\r
-               if (!FSO.FolderExists(bd)) {\r
-                       FSO.CreateFolder(bd);\r
-               }\r
-       }\r
-\r
-       STDOUT.WriteLine("Generating files...");\r
-       generate_makefile();\r
-       if (!MODE_PHPIZE) {\r
-               generate_internal_functions();\r
-               generate_config_h();\r
-               generate_phpize();\r
-       } else {\r
-               generate_config_pickle_h();\r
-               generate_ext_pickle();\r
-       }\r
-       STDOUT.WriteLine("Done.");\r
-       STDOUT.WriteBlankLines(1);\r
-       write_summary();\r
-\r
-       if (PHP_SNAPSHOT_BUILD != "no") {\r
-               STDOUT.WriteLine("Type 'nmake snap' to build a PHP snapshot");\r
-       } else {\r
-               STDOUT.WriteLine("Type 'nmake' to build PHP");\r
-       }\r
-}\r
-\r
-function generate_ext_pickle()\r
-{\r
-       var content;\r
-       var DEPS = null;\r
-       var dest;\r
-       var deps_lines = new Array();\r
-\r
-       var build_var_name = function(name) {\r
-               return "PHP_" + name.toUpperCase();\r
-       }\r
-\r
-       STDOUT.WriteLine("Generating pickle deps");\r
-       dest = PHP_DIR + "/script/";\r
-\r
-       if (!FSO.FolderExists(dest)) {\r
-               FSO.CreateFolder(dest);\r
-       }\r
-\r
-       if (FSO.FileExists(dest + "/ext_pickle.js")) {\r
-               DEPS = FSO.OpenTextFile(dest + "/ext_pickle.js", 1);\r
-\r
-               while (!DEPS.AtEndOfStream) {\r
-                       var ln = DEPS.ReadLine();\r
-                       var found = false;\r
-\r
-                       for (var i in extensions_enabled) {\r
-                               var reg0 = new RegExp(build_var_name(extensions_enabled[i][0]) + "\s*=.+", "g");\r
-                               var reg1 = new RegExp(build_var_name(extensions_enabled[i][0]) + "_SHARED" + "\s*=.+", "g");\r
-\r
-                               if (ln.match(reg1) || ln.match(reg0)) {\r
-                                       found = true;\r
-                                       break;\r
-                               }\r
-                       }\r
-\r
-                       if (!found) {\r
-                               deps_lines.push(ln);\r
-                       }\r
-               }\r
-       }\r
-\r
-       for (var i in extensions_enabled) {\r
-               deps_lines.push(build_var_name(extensions_enabled[i][0]) + "=true;");\r
-               deps_lines.push(build_var_name(extensions_enabled[i][0]) + "_SHARED=" + (extensions_enabled[i][1] == 'shared' ? 'true' : 'false') + ";");\r
-       }\r
-\r
-       if (!!DEPS) {\r
-               DEPS.Close();\r
-               DEPS = null;\r
-       }\r
-\r
-       /* Replace the ext_pickle.js with the new content */\r
-       DEPS = FSO.CreateTextFile(dest + "/ext_pickle.js", true);\r
-\r
-       for (var j in deps_lines) {\r
-               DEPS.WriteLine(deps_lines[j]);\r
-       }\r
-\r
-       DEPS.Close();\r
-}\r
-\r
-function generate_config_pickle_h()\r
-{\r
-       var outfile = null;\r
-       var lines = new Array();\r
-       var keys = (new VBArray(configure_hdr.Keys())).toArray();\r
-       dest = PHP_DIR + "/include/main";\r
-\r
-       var ignore_key = function(key) {\r
-               var ignores = [ "CONFIGURE_COMMAND", "PHP_COMPILER_ID", "COMPILER", "ARCHITECTURE", "HAVE_STRNLEN", "PHP_DIR" ];\r
-\r
-               for (var k in ignores) {\r
-                       if (ignores[k] == key) {\r
-                               return true;\r
-                       }\r
-               }\r
-\r
-               return false;\r
-       }\r
-\r
-\r
-       STDOUT.WriteLine("Generating main/config.pickle.h");\r
-\r
-       if (FSO.FileExists(dest + "/config.pickle.h")) {\r
-               outfile = FSO.OpenTextFile(dest + "/config.pickle.h", 1);\r
-\r
-               while (!outfile.AtEndOfStream) {\r
-                       var found = false;\r
-                       var ln = outfile.ReadLine();\r
-\r
-                       for (var i in keys) {\r
-                               var reg = new RegExp("#define[\s ]+" + keys[i] + "[\s ]*.*", "g");\r
-\r
-                               if (ln.match(reg)) {\r
-                                       found = true;\r
-                                       break;\r
-                               }\r
-                       }\r
-\r
-                       if (!found) {\r
-                               lines.push(ln);\r
-                       }\r
-               }\r
-       }\r
-\r
-       for (var i in keys) {\r
-               var item = configure_hdr.Item(keys[i]);\r
-\r
-               if (ignore_key(keys[i])) {\r
-                       continue;\r
-               }\r
-\r
-               /* XXX fix comment handling */\r
-               /*if (!lines[j].match(/^#define.+/g)) {\r
-                       continue;\r
-               }*/\r
-\r
-               lines.push("#define " + keys[i] + " " + item[0]);\r
-       }\r
-\r
-       if (outfile) {\r
-               outfile.Close();\r
-               outfile = null;\r
-       }\r
-\r
-       outfile = FSO.CreateTextFile(dest + "/config.pickle.h", true);\r
-\r
-       for (var k in lines) {\r
-               outfile.WriteLine(lines[k]);\r
-       }\r
-\r
-       outfile.Close();\r
-}\r
-\r
-function generate_config_h()\r
-{\r
-       var infile, outfile;\r
-       var indata;\r
-       var prefix;\r
-\r
-       prefix = PHP_PREFIX.replace(new RegExp("\\\\", "g"), "\\\\");\r
-\r
-       STDOUT.WriteLine("Generating main/config.w32.h");\r
-       \r
-       infile = FSO.OpenTextFile("win32/build/config.w32.h.in", 1);\r
-       indata = infile.ReadAll();\r
-       infile.Close();\r
-       \r
-       outfile = FSO.CreateTextFile("main/config.w32.h", true);\r
-\r
-       indata = indata.replace(new RegExp("@PREFIX@", "g"), prefix);\r
-       outfile.Write(indata);\r
-\r
-       var keys = (new VBArray(configure_hdr.Keys())).toArray();\r
-       var i, j;\r
-       var item;\r
-       var pieces, stuff_to_crack, chunk;\r
-\r
-       outfile.WriteBlankLines(1);\r
-       outfile.WriteLine("/* values determined by configure.js */");\r
-\r
-       for (i in keys) {\r
-               item = configure_hdr.Item(keys[i]);\r
-               outfile.WriteBlankLines(1);\r
-               pieces = item[0];\r
-\r
-               if (item[1] != undefined) {\r
-                       outfile.WriteLine("/* " + item[1] + " */");\r
-               }\r
-\r
-               if (typeof(pieces) == "string" && pieces.charCodeAt(0) == 34) {\r
-                       /* quoted string have a maximal length of 2k under vc.\r
-                        * solution is to crack them and let the compiler concat\r
-                        * them implicitly */\r
-                       stuff_to_crack = pieces;\r
-                       pieces = "";\r
-\r
-                       while (stuff_to_crack.length) {\r
-                               j = 65;\r
-                               while (stuff_to_crack.charCodeAt(j) != 32 && j < stuff_to_crack.length)\r
-                                       j++;\r
-\r
-                               chunk = stuff_to_crack.substr(0, j);\r
-                               pieces += chunk;\r
-                               stuff_to_crack = stuff_to_crack.substr(chunk.length);\r
-                               if (stuff_to_crack.length)\r
-                                       pieces += '" "';\r
-                       }\r
-               }\r
-               \r
-               outfile.WriteLine("#define " + keys[i] + " " + pieces);\r
-       }\r
-\r
-       if (VCVERS >= 1800) {\r
-               outfile.WriteLine("");\r
-               outfile.WriteLine("#define HAVE_ACOSH 1");\r
-               outfile.WriteLine("#define HAVE_ASINH 1");\r
-               outfile.WriteLine("#define HAVE_ATANH 1");\r
-       }\r
-\r
-       \r
-       outfile.Close();\r
-}\r
-\r
-function generate_phpize()\r
-{\r
-       STDOUT.WriteLine("Generating phpize");\r
-       dest = get_define("BUILD_DIR") + '/devel';\r
-\r
-       if (!FSO.FolderExists(dest)) {\r
-               FSO.CreateFolder(dest);\r
-       }\r
-\r
-       var MF = FSO.CreateTextFile(dest + "/phpize.js", true);\r
-       var DEPS = FSO.CreateTextFile(dest + "/ext_deps.js", true);\r
-       \r
-       prefix = get_define("PHP_PREFIX");\r
-       prefix = prefix.replace(new RegExp("/", "g"), "\\");\r
-       prefix = prefix.replace(new RegExp("\\\\", "g"), "\\\\");\r
-       MF.WriteLine("var PHP_PREFIX=" + '"' + prefix + '"');\r
-       MF.WriteLine("var PHP_ZTS=" + '"' + (PHP_ZTS.toLowerCase() == "yes" ? "Yes" : "No") + '"');\r
-       MF.WriteLine("var VC_VERSION=" + VCVERS);\r
-       MF.WriteLine("var PHP_VERSION=" + PHP_VERSION);\r
-       MF.WriteLine("var PHP_MINOR_VERSION=" + PHP_MINOR_VERSION);\r
-       MF.WriteLine("var PHP_RELEASE_VERSION=" + PHP_RELEASE_VERSION);\r
-       MF.WriteBlankLines(1);\r
-       MF.WriteLine("/* Genereted extensions list with mode (static/shared) */");\r
-\r
-       var count = extensions_enabled.length;\r
-       for (i in extensions_enabled) {\r
-               out = "PHP_" + extensions_enabled[i][0].toUpperCase() + "_SHARED=" + (extensions_enabled[i][1] == 'shared' ? 'true' : 'false') + ";";\r
-               DEPS.WriteLine("PHP_" + extensions_enabled[i][0].toUpperCase() + "=true;");\r
-               DEPS.WriteLine(out);\r
-               MF.WriteLine(out);\r
-       }\r
-\r
-       MF.WriteBlankLines(2);\r
-       MF.WriteLine("/* Genereted win32/build/phpize.js.in */");\r
-       MF.WriteBlankLines(1);\r
-       MF.Write(file_get_contents("win32/build/phpize.js.in"));\r
-       MF.Close();\r
-       DEPS.Close();\r
-\r
-       /* Generate flags file */\r
-       /* spit out variable definitions */\r
-       CJ = FSO.CreateTextFile(dest + "/config.phpize.js");\r
-\r
-       CJ.WriteLine("var PHP_ZTS =" + '"' + PHP_ZTS + '"');\r
-       CJ.WriteLine("var PHP_DLL_LIB =" + '"' + get_define('PHPLIB') + '"');\r
-       CJ.WriteLine("var PHP_DLL =" + '"' + get_define('PHPDLL') + '"');\r
-       CJ.WriteBlankLines(1);\r
-       CJ.Close();\r
-}\r
-\r
-function generate_makefile()\r
-{\r
-       STDOUT.WriteLine("Generating Makefile");\r
-       var MF = FSO.CreateTextFile("Makefile", true);\r
-\r
-       MF.WriteLine("# Generated by configure.js");\r
-       /* spit out variable definitions */\r
-       var keys = (new VBArray(configure_subst.Keys())).toArray();\r
-       var i;\r
-       MF.WriteLine("PHP_SRC_DIR =" + PHP_SRC_DIR);\r
-       for (i in keys) {\r
-               // The trailing space is needed to prevent the trailing backslash\r
-               // that is part of the build dir flags (CFLAGS_BD_XXX) from being\r
-               // seen as a line continuation character\r
-               MF.WriteLine(keys[i] + "=" + \r
-                       //word_wrap_and_indent(1, configure_subst.Item(keys[i]), ' \\', '\t') + " "\r
-                       configure_subst.Item(keys[i]) + " "\r
-                       );\r
-               MF.WriteBlankLines(1);\r
-       }\r
-\r
-       MF.WriteBlankLines(1);\r
-       if (MODE_PHPIZE) {\r
-               var TF = FSO.OpenTextFile(PHP_DIR + "/script/Makefile.phpize", 1);\r
-       } else {\r
-               var TF = FSO.OpenTextFile("win32/build/Makefile", 1);\r
-       }\r
-\r
-       MF.Write(TF.ReadAll());\r
-\r
-       MF.WriteLine("build-headers:");\r
-       MF.WriteLine("  @if not exist $(BUILD_DIR_DEV)\\include mkdir $(BUILD_DIR_DEV)\\include >nul");\r
-       MF.WriteLine("  @for %D in ($(INSTALL_HEADERS_DIR)) do @if not exist $(BUILD_DIR_DEV)\\include\\%D mkdir $(BUILD_DIR_DEV)\\include\\%D >nul");\r
-       for (i in headers_install) {\r
-               if (headers_install[i][2] != "") {\r
-                               MF.WriteLine("  @if not exist $(BUILD_DIR_DEV)\\include\\" + headers_install[i][2] + " mkdir $(BUILD_DIR_DEV)\\include\\" + \r
-                                                                                               headers_install[i][2] + ">nul");\r
-                               MF.WriteLine("  @copy " + headers_install[i][0] + " " + "$(BUILD_DIR_DEV)\\include\\" + headers_install[i][2] + " /y >nul");\r
-               }\r
-       }\r
-       MF.WriteLine("  @for %D in ($(INSTALL_HEADERS_DIR)) do @copy %D*.h $(BUILD_DIR_DEV)\\include\\%D /y >nul");\r
-       if (MODE_PHPIZE) {\r
-               MF.WriteBlankLines(1);\r
-               MF.WriteLine("build-bins:");\r
-               for (var i in extensions_enabled) {\r
-                       var lib = "php_" + extensions_enabled[i][0] + ".lib";\r
-                       var dll = "php_" + extensions_enabled[i][0] + ".dll";\r
-                       MF.WriteLine("  @copy $(BUILD_DIR)\\" + lib + " $(BUILD_DIR_DEV)\\lib");\r
-                       MF.WriteLine("  @copy $(BUILD_DIR)\\" + dll + " $(PHP_PREFIX)");\r
-               }\r
-       } else {\r
-               MF.WriteBlankLines(1);\r
-               MF.WriteLine("build-ext-libs:");\r
-               MF.WriteLine("  @if not exist $(BUILD_DIR_DEV)\\lib mkdir $(BUILD_DIR_DEV)\\lib >nul");\r
-               for (var i in extensions_enabled) {\r
-                       var lib;\r
-\r
-                       lib = "php_" + extensions_enabled[i][0] + "*.lib";\r
-\r
-                       if ('shared' == extensions_enabled[i][1]) {\r
-                               MF.WriteLine("  @if exist $(BUILD_DIR)\\" + lib + " copy $(BUILD_DIR)\\" + lib + " $(BUILD_DIR_DEV)\\lib");\r
-                       }\r
-               }\r
-       }\r
-       TF.Close();\r
-\r
-       MF.WriteBlankLines(2);\r
-\r
-       MFO.Close();\r
-       TF = FSO.OpenTextFile("Makefile.objects", 1);\r
-       if (!TF.AtEndOfStream) {\r
-               MF.Write(TF.ReadAll());\r
-       }\r
-       TF.Close();\r
-\r
-       MF.Close();     \r
-}\r
-\r
-function ADD_FLAG(name, flags, target)\r
-{\r
-       if (target != null) {\r
-               name = target.toUpperCase() + "_" + name;\r
-       }\r
-       if (configure_subst.Exists(name)) {\r
-               var curr_flags = configure_subst.Item(name);\r
-\r
-               if (curr_flags.indexOf(flags) >= 0) {\r
-                       return;\r
-               }\r
-               \r
-               flags = curr_flags + " " + flags;\r
-               configure_subst.Remove(name);\r
-       }\r
-       configure_subst.Add(name, flags);\r
-}\r
-\r
-function get_define(name)\r
-{\r
-       if (configure_subst.Exists(name)) {\r
-               return configure_subst.Item(name);\r
-       }\r
-       return "";\r
-}\r
-\r
-// Add a .def to the core to export symbols\r
-function ADD_DEF_FILE(name)\r
-{\r
-       if (!configure_subst.Exists("PHPDEF")) {\r
-               DEFINE("PHPDEF", "$(BUILD_DIR)\\$(PHPDLL).def");\r
-               ADD_FLAG("PHP_LDFLAGS", "/def:$(PHPDEF)");\r
-       }\r
-       ADD_FLAG("PHP_DLL_DEF_SOURCES", name);\r
-}\r
-\r
-function AC_DEFINE(name, value, comment, quote)\r
-{\r
-       if (quote == null) {\r
-               quote = true;\r
-       }\r
-       if (quote && typeof(value) == "string") {\r
-               value = '"' + value.replace(new RegExp('(["\\\\])', "g"), '\\$1') + '"';\r
-       } else if (typeof(value) != "undefined" && value.length == 0) {\r
-               value = '""';\r
-       }\r
-       var item = new Array(value, comment);\r
-       if (configure_hdr.Exists(name)) {\r
-               var orig_item = configure_hdr.Item(name);\r
-               STDOUT.WriteLine("AC_DEFINE[" + name + "]=" + value + ": is already defined to " + orig_item[0]);\r
-       } else {\r
-               configure_hdr.Add(name, item);\r
-       }\r
-}\r
-\r
-function MESSAGE(msg)\r
-{\r
-       STDOUT.WriteLine("" + msg);\r
-}\r
-\r
-function ERROR(msg)\r
-{\r
-       STDERR.WriteLine("ERROR: " + msg);\r
-       WScript.Quit(3);\r
-}\r
-\r
-function WARNING(msg)\r
-{\r
-       STDERR.WriteLine("WARNING: " + msg);\r
-       STDERR.WriteBlankLines(1);\r
-}\r
-\r
-function copy_and_subst(srcname, destname, subst_array)\r
-{\r
-       if (!FSO.FileExists(srcname)) {\r
-               srcname = configure_module_dirname + "\\" + srcname;\r
-               destname = configure_module_dirname + "\\" + destname;\r
-       }\r
-\r
-       var content = file_get_contents(srcname);\r
-       var i;\r
-\r
-       for (i = 0; i < subst_array.length; i+=2) {\r
-               var re = subst_array[i];\r
-               var rep = subst_array[i+1];\r
-\r
-               content = content.replace(re, rep);\r
-       }\r
-       \r
-       var f = FSO.CreateTextFile(destname, true);\r
-       f.Write(content);\r
-       f.Close();\r
-}\r
-\r
-// glob using simple filename wildcards\r
-// returns an array of matches that are found\r
-// in the filesystem\r
-function glob(path_pattern)\r
-{\r
-       var path_parts = path_pattern.replace(new RegExp("/", "g"), "\\").split("\\");\r
-       var p;\r
-       var base = "";\r
-       var is_pat_re = /\*/;\r
-\r
-//STDOUT.WriteLine("glob: " + path_pattern);\r
-\r
-       if (FSO.FileExists(path_pattern)) {\r
-               return new Array(path_pattern);\r
-       }\r
-       \r
-       // first, build as much as possible that doesn't have a pattern\r
-       for (p = 0; p < path_parts.length; p++) {\r
-               if (path_parts[p].match(is_pat_re))\r
-                       break;\r
-               if (p)\r
-                       base += "\\";\r
-               base += path_parts[p];  \r
-       }\r
-\r
-       return _inner_glob(base, p, path_parts);\r
-}\r
-\r
-function _inner_glob(base, p, parts)\r
-{\r
-       var pat = parts[p];\r
-       var full_name = base + "\\" + pat;\r
-       var re = null;\r
-       var items = null;\r
-\r
-       if (p == parts.length) {\r
-               return false;\r
-       }\r
-\r
-//STDOUT.WriteLine("inner: base=" + base + " p=" + p + " pat=" + pat);\r
-\r
-       if (FSO.FileExists(full_name)) {\r
-               if (p < parts.length - 1) {\r
-                       // we didn't reach the full extent of the pattern\r
-                       return false;\r
-               }\r
-               return new Array(full_name);\r
-       }\r
-\r
-       if (FSO.FolderExists(full_name) && p == parts.length - 1) {\r
-               // we have reached the end of the pattern; no need to recurse\r
-               return new Array(full_name);\r
-       }\r
-\r
-       // Convert the pattern into a regexp\r
-       re = new RegExp("^" + pat.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\?/g, '.') + "$", "i");\r
-\r
-       items = new Array();\r
-\r
-       if (!FSO.FolderExists(base)) {\r
-               return false;\r
-       }\r
-\r
-       var folder = FSO.GetFolder(base);\r
-       var fc = null;\r
-       var subitems = null;\r
-       var item_name = null;\r
-       var j;\r
-\r
-       fc = new Enumerator(folder.SubFolders);\r
-       for (; !fc.atEnd(); fc.moveNext()) {\r
-               item_name = FSO.GetFileName(fc.item());\r
-\r
-               if (item_name.match(re)) {\r
-                       // got a match; if we are at the end of the pattern, just add these\r
-                       // things to the items array\r
-                       if (p == parts.length - 1) {\r
-                               items[items.length] = fc.item();\r
-                       } else {\r
-                               // we should recurse and do more matches\r
-                               subitems = _inner_glob(base + "\\" + item_name, p + 1, parts);\r
-                               if (subitems) {\r
-                                       for (j = 0; j < subitems.length; j++) {\r
-                                               items[items.length] = subitems[j];\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       // if we are at the end of the pattern, we should match\r
-       // files too\r
-       if (p == parts.length - 1) {\r
-               fc = new Enumerator(folder.Files);\r
-               for (; !fc.atEnd(); fc.moveNext()) {\r
-                       item_name = FSO.GetFileName(fc.item());\r
-                       if (item_name.match(re)) {\r
-                               items[items.length] = fc.item();\r
-                       }\r
-               }\r
-       }\r
-\r
-       if (items.length == 0)\r
-               return false;\r
-\r
-       return items;\r
-}\r
-\r
-function PHP_INSTALL_HEADERS(dir, headers_list)\r
-{\r
-       headers_list = headers_list.split(new RegExp("\\s+"));\r
-       headers_list.sort();\r
-       if (dir.length > 0 && dir.substr(dir.length - 1) != '/' && dir.substr(dir.length - 1) != '\\') {\r
-               dir += '/';\r
-       }\r
-       dir = dir.replace(new RegExp("/", "g"), "\\");\r
-\r
-       for (i in headers_list) {\r
-               found = false;\r
-               src = headers_list[i];\r
-               src = src.replace(new RegExp("/", "g"), "\\");\r
-               isdir = FSO.FolderExists(dir + src);\r
-               isfile = FSO.FileExists(dir + src);\r
-               if (isdir) {\r
-                       if (src.length > 0 && src.substr(src.length - 1) != '/' && src.substr(src.length - 1) != '\\') {\r
-                               src += '\\';\r
-                       }\r
-                       headers_install[headers_install.length] = [dir + src, 'dir',''];\r
-                       ADD_FLAG("INSTALL_HEADERS_DIR", dir + src);\r
-                       found = true;\r
-               } else if (isfile) {\r
-                       dirname = FSO.GetParentFolderName(dir + src);\r
-                       headers_install[headers_install.length] = [dir + src, 'file', dirname];\r
-                       ADD_FLAG("INSTALL_HEADERS", dir + src);\r
-                       found = true;\r
-               } else {\r
-                       path =  configure_module_dirname + "\\"+ src;\r
-                       isdir = FSO.FolderExists(path);\r
-                       isfile = FSO.FileExists(path);\r
-                       if (isdir) {\r
-                               if (src.length > 0 && src.substr(src.length - 1) != '/' && src.substr(src.length - 1) != '\\') {\r
-                                       src += '\\';\r
-                               }\r
-                               headers_install[headers_install.length] = [path, 'dir',''];\r
-                               ADD_FLAG("INSTALL_HEADERS_DIR", path);\r
-                       } else if (isfile) {\r
-                               dirname = FSO.GetParentFolderName(path);\r
-                               headers_install[headers_install.length] = [path, 'file', dir];\r
-                               ADD_FLAG("INSTALL_HEADERS", dir + src);\r
-                               found = true;\r
-                       }\r
-               }\r
-\r
-               if (found == false) {\r
-                       STDOUT.WriteLine(headers_list);\r
-                       ERROR("Cannot find header " + dir + src);\r
-               }\r
-       }\r
-}\r
-\r
-// for snapshot builders, this option will attempt to enable everything\r
-// and you can then build everything, ignoring fatal errors within a module\r
-// by running "nmake snap"\r
-PHP_SNAPSHOT_BUILD = "no";\r
-if (!MODE_PHPIZE) {\r
-       ARG_ENABLE('snapshot-build', 'Build a snapshot; turns on everything it can and ignores build errors', 'no');\r
-\r
-       // one-shot build optimizes build by asking compiler to build\r
-       // several objects at once, reducing overhead of starting new\r
-       // compiler processes.\r
-       ARG_ENABLE('one-shot', 'Optimize for fast build - best for release and snapshot builders, not so hot for edit-and-rebuild hacking', 'no');\r
-}\r
-\r
+// Utils for configure script
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 7                                                        |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 1997-2008 The PHP Group                                |
+  +----------------------------------------------------------------------+
+  | This source file is subject to version 3.01 of the PHP license,      |
+  | that is bundled with this package in the file LICENSE, and is        |
+  | available through the world-wide-web at the following url:           |
+  | http://www.php.net/license/3_01.txt                                  |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@php.net so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Author: Wez Furlong <wez@thebrainroom.com>                           |
+  +----------------------------------------------------------------------+
+*/
+
+// $Id: confutils.js,v 1.60.2.1.2.8.2.33 2009-05-29 07:43:07 kalle Exp $
+
+var STDOUT = WScript.StdOut;
+var STDERR = WScript.StdErr;
+var WshShell = WScript.CreateObject("WScript.Shell");
+var FSO = WScript.CreateObject("Scripting.FileSystemObject");
+var MFO = null;
+var SYSTEM_DRIVE = WshShell.Environment("Process").Item("SystemDrive");
+var PROGRAM_FILES = WshShell.Environment("Process").Item("ProgramFiles");
+var PROGRAM_FILESx86 = WshShell.Environment("Process").Item("ProgramFiles(x86)");
+var VCINSTALLDIR = WshShell.Environment("Process").Item("VCINSTALLDIR");
+var PHP_SRC_DIR=FSO.GetParentFolderName(WScript.ScriptFullName);
+
+var VS_TOOLSET = true;
+var CLANG_TOOLSET = false;
+var INTEL_TOOLSET = false;
+var VCVERS = -1;
+var CLANGVERS = -1;
+var INTELVERS = -1;
+var COMPILER_NUMERIC_VERSION = -1;
+var COMPILER_NAME = "unknown";
+
+/* Store the enabled extensions (summary + QA check) */
+var extensions_enabled = new Array();
+
+/* Store the SAPI enabled (summary + QA check) */
+var sapi_enabled = new Array();
+
+/* Store the headers to install */
+var headers_install = new Array();
+
+/* Mapping CL version > human readable name */
+var VC_VERSIONS = new Array();
+VC_VERSIONS[1200] = 'MSVC6 (Visual C++ 6.0)';
+VC_VERSIONS[1300] = 'MSVC7 (Visual C++ 2002)';
+VC_VERSIONS[1310] = 'MSVC7.1 (Visual C++ 2003)';
+VC_VERSIONS[1400] = 'MSVC8 (Visual C++ 2005)';
+VC_VERSIONS[1500] = 'MSVC9 (Visual C++ 2008)';
+VC_VERSIONS[1600] = 'MSVC10 (Visual C++ 2010)';
+VC_VERSIONS[1700] = 'MSVC11 (Visual C++ 2012)';
+VC_VERSIONS[1800] = 'MSVC12 (Visual C++ 2013)';
+/* XXX update after the final rename */
+VC_VERSIONS[1900] = 'MSVC14 (Visual C++ CTP14)';
+
+var VC_VERSIONS_SHORT = new Array();
+VC_VERSIONS_SHORT[1200] = 'VC6';
+VC_VERSIONS_SHORT[1300] = 'VC7';
+VC_VERSIONS_SHORT[1310] = 'VC7.1';
+VC_VERSIONS_SHORT[1400] = 'VC8';
+VC_VERSIONS_SHORT[1500] = 'VC9';
+VC_VERSIONS_SHORT[1600] = 'VC10';
+VC_VERSIONS_SHORT[1700] = 'VC11';
+VC_VERSIONS_SHORT[1800] = 'VC12';
+VC_VERSIONS_SHORT[1900] = 'VC14';
+
+if (PROGRAM_FILES == null) {
+       PROGRAM_FILES = "C:\\Program Files";
+}
+
+if (MODE_PHPIZE) {
+       if (!FSO.FileExists("config.w32")) {
+               STDERR.WriteLine("Must be run from the root of the extension source");
+               WScript.Quit(10);
+       }
+} else {
+       if (!FSO.FileExists("README.GIT-RULES")) {
+               STDERR.WriteLine("Must be run from the root of the php source");
+               WScript.Quit(10);
+       }
+}
+
+var CWD = WshShell.CurrentDirectory;
+
+if (typeof(CWD) == "undefined") {
+       CWD = FSO.GetParentFolderName(FSO.GetAbsolutePathName("README.GIT-RULES"));
+}
+
+/* defaults; we pick up the precise versions from configure.in */
+var PHP_VERSION = 5;
+var PHP_MINOR_VERSION = 0;
+var PHP_RELEASE_VERSION = 0;
+var PHP_EXTRA_VERSION = "";
+var PHP_VERSION_STRING = "5.0.0";
+
+function get_version_numbers()
+{
+       var cin = file_get_contents("configure.in");
+       
+       if (cin.match(new RegExp("PHP_MAJOR_VERSION=(\\d+)"))) {
+               PHP_VERSION = RegExp.$1;
+       }
+       if (cin.match(new RegExp("PHP_MINOR_VERSION=(\\d+)"))) {
+               PHP_MINOR_VERSION = RegExp.$1;
+       }
+       if (cin.match(new RegExp("PHP_RELEASE_VERSION=(\\d+)"))) {
+               PHP_RELEASE_VERSION = RegExp.$1;
+       }
+       PHP_VERSION_STRING = PHP_VERSION + "." + PHP_MINOR_VERSION + "." + PHP_RELEASE_VERSION;
+
+       if (cin.match(new RegExp("PHP_EXTRA_VERSION=\"([^\"]+)\""))) {
+               PHP_EXTRA_VERSION = RegExp.$1;
+               if (PHP_EXTRA_VERSION.length) {
+                       PHP_VERSION_STRING += PHP_EXTRA_VERSION;
+               }
+       }
+       DEFINE('PHP_VERSION_STRING', PHP_VERSION_STRING);
+}
+
+configure_args = new Array();
+configure_subst = WScript.CreateObject("Scripting.Dictionary");
+
+configure_hdr = WScript.CreateObject("Scripting.Dictionary");
+build_dirs = new Array();
+
+extension_include_code = "";
+extension_module_ptrs = "";
+
+if (!MODE_PHPIZE) {
+       get_version_numbers();
+}
+
+/* execute a command and return the output as a string */
+function execute(command_line)
+{
+       var e = WshShell.Exec(command_line);
+       var ret = "";
+
+       ret = e.StdOut.ReadAll();
+
+//STDOUT.WriteLine("command " + command_line);
+//STDOUT.WriteLine(ret);
+
+       return ret;
+}
+
+function probe_binary(EXE, what)
+{
+       // tricky escapes to get stderr redirection to work
+       var command = 'cmd /c ""' + EXE;
+       if (what == "version") {
+               command = command + '" -v"';
+       }
+       var version = execute(command + '" 2>&1"');
+
+       if (what == "64") {
+               if (version.match(/x64/)) {
+                       return 1;
+               }
+       } else {
+               if (version.match(/(\d+\.\d+(\.\d+)?(\.\d+)?)/)) {
+                       return RegExp.$1;
+               }
+       }
+       return 0;
+}
+
+function condense_path(path)
+{
+       path = FSO.GetAbsolutePathName(path);
+
+       if (path.substr(0, CWD.length).toLowerCase()
+                       == CWD.toLowerCase() &&
+                       (path.charCodeAt(CWD.length) == 92 || path.charCodeAt(CWD.length) == 47)) {
+               return path.substr(CWD.length + 1);
+       }
+
+       var a = CWD.split("\\");
+       var b = path.split("\\");
+       var i, j;
+
+       for (i = 0; i < b.length; i++) {
+               if (a[i].toLowerCase() == b[i].toLowerCase())
+                       continue;
+               if (i > 0) {
+                       /* first difference found */
+                       path = "";
+                       for (j = 0; j < a.length - i; j++) {
+                               path += "..\\";
+                       }
+                       for (j = i; j < b.length; j++) {
+                               path += b[j];
+                               if (j < b.length - 1)
+                                       path += "\\";
+                       }
+                       return path;
+               }
+               /* on a different drive */
+               break;
+       }
+       
+       return path;
+}
+
+function ConfigureArg(type, optname, helptext, defval)
+{
+       var opptype = type == "enable" ? "disable" : "without";
+
+       if (defval == "yes" || defval == "yes,shared") {
+               this.arg = "--" + opptype + "-" + optname;
+               this.imparg = "--" + type + "-" + optname;
+       } else {
+               this.arg = "--" + type + "-" + optname;
+               this.imparg = "--" + opptype + "-" + optname;
+       }
+       
+       this.optname = optname;
+       this.helptext = helptext;
+       this.defval = defval;
+       this.symval = optname.toUpperCase().replace(new RegExp("-", "g"), "_");
+       this.seen = false;
+       this.argval = defval;
+}
+
+function ARG_WITH(optname, helptext, defval)
+{
+       configure_args[configure_args.length] = new ConfigureArg("with", optname, helptext, defval);
+}
+
+function ARG_ENABLE(optname, helptext, defval)
+{
+       configure_args[configure_args.length] = new ConfigureArg("enable", optname, helptext, defval);
+}
+
+function analyze_arg(argval)
+{
+       var ret = new Array();
+       var shared = false;
+
+       if (argval == "shared") {
+               shared = true;
+               argval = "yes";
+       } else if (argval == null) {
+               /* nothing */
+       } else if (arg_match = argval.match(new RegExp("^shared,(.*)"))) {
+               shared = true;
+               argval = arg_match[1];
+       } else if (arg_match = argval.match(new RegExp("^(.*),shared$"))) {
+               shared = true;
+               argval = arg_match[1];
+       }
+
+       ret[0] = shared;
+       ret[1] = argval;
+       return ret;
+}
+
+function word_wrap_and_indent(indent, text, line_suffix, indent_char)
+{
+       if (text == null) {
+               return "";
+       }
+       
+       var words = text.split(new RegExp("\\s+", "g"));
+       var i = 0;
+       var ret_text = "";
+       var this_line = "";
+       var t;
+       var space = "";
+       var lines = 0;
+
+       if (line_suffix == null) {
+               line_suffix = "";
+       }
+
+       if (indent_char == null) {
+               indent_char = " ";
+       }
+
+       for (i = 0; i < indent; i++) {
+               space += indent_char;
+       }
+       
+       for (i = 0; i < words.length; i++) {
+               if (this_line.length) {
+                       t = this_line + " " + words[i];
+               } else {
+                       t = words[i];
+               }
+
+               if (t.length + indent > 78) {
+                       if (lines++) {
+                               ret_text += space;
+                       }
+                       ret_text += this_line + line_suffix + "\r\n";
+                       this_line = "";
+               }
+
+               if (this_line.length) {
+                       this_line += " " + words[i];
+               } else {
+                       this_line = words[i];
+               }
+       }
+
+       if (this_line.length) {
+               if (lines)
+                       ret_text += space;
+               ret_text += this_line;
+       }
+
+       return ret_text;
+}
+
+function conf_process_args()
+{
+       var i, j;
+       var configure_help_mode = false;
+       var analyzed = false;
+       var nice = "cscript /nologo configure.js ";
+       var disable_all = false;
+       
+       args = WScript.Arguments;
+       for (i = 0; i < args.length; i++) {
+               arg = args(i);
+               nice += ' "' + arg + '"';
+               if (arg == "--help") {
+                       configure_help_mode = true;
+                       break;
+               }
+               if (arg == "--disable-all") {
+                       disable_all = true;
+                       continue;
+               }
+
+               // If it is --foo=bar, split on the equals sign
+               arg = arg.split("=", 2);
+               argname = arg[0];
+               if (arg.length > 1) {
+                       argval = arg[1];
+               } else {
+                       argval = null;
+               }
+
+               // Find the arg
+               found = false;
+               for (j = 0; j < configure_args.length; j++) {
+                       if (argname == configure_args[j].imparg || argname == configure_args[j].arg) {
+                               found = true;
+
+                               arg = configure_args[j];
+                               arg.seen = true;
+
+                               analyzed = analyze_arg(argval);
+
+                               /* Force shared when called after phpize */
+                               if (MODE_PHPIZE) {
+                                       shared = "shared";
+                               } else {
+                                       shared = analyzed[0];
+                               }
+                               argval = analyzed[1];
+
+                               if (argname == arg.imparg) {
+                                       /* we matched the implicit, or default arg */
+                                       if (argval == null) {
+                                               argval = arg.defval;
+                                       }
+                               } else {
+                                       /* we matched the non-default arg */
+                                       if (argval == null) {
+                                               argval = arg.defval == "no" ? "yes" : "no";
+                                       }
+                               }
+                               
+                               arg.argval = argval;
+                               eval("PHP_" + arg.symval + " = argval;");
+                               eval("PHP_" + arg.symval + "_SHARED = shared;");
+                               break;
+                       }
+               }
+               if (!found) {
+                       STDERR.WriteLine("Unknown option " + argname + "; please try configure.js --help for a list of valid options");
+                       WScript.Quit(2);
+               }
+       }
+
+       if (configure_help_mode) {
+               STDOUT.WriteLine(word_wrap_and_indent(0,
+"Options that enable extensions and SAPI will accept \
+'yes' or 'no' as a parameter.  They also accept 'shared' \
+as a synonym for 'yes' and request a shared build of that \
+module.  Not all modules can be built as shared modules; \
+configure will display [shared] after the module name if \
+can be built that way. \
+"
+                       ));
+               STDOUT.WriteBlankLines(1);
+
+               // Measure width to pretty-print the output
+               max_width = 0;
+               for (i = 0; i < configure_args.length; i++) {
+                       arg = configure_args[i];
+                       if (arg.arg.length > max_width)
+                               max_width = arg.arg.length;
+               }
+
+               for (i = 0; i < configure_args.length; i++) {
+                       arg = configure_args[i];
+
+                       n = max_width - arg.arg.length;
+                       pad = "   ";
+                       for (j = 0; j < n; j++) {
+                               pad += " ";
+                       }
+                       STDOUT.WriteLine("  " + arg.arg + pad + word_wrap_and_indent(max_width + 5, arg.helptext));
+               }
+               WScript.Quit(1);
+       }
+
+       var snapshot_build_exclusions = new Array(
+               'debug', 'crt-debug', 'lzf-better-compression',
+                'php-build', 'snapshot-template', 'ereg',
+                'pcre-regex', 'fastcgi', 'force-cgi-redirect',
+                'path-info-check', 'zts', 'ipv6', 'memory-limit',
+                'zend-multibyte', 'fd-setsize', 'memory-manager',
+                't1lib', 'pgi', 'pgo'
+               );
+       var force;
+
+       // Now set any defaults we might have missed out earlier
+       for (i = 0; i < configure_args.length; i++) {
+               arg = configure_args[i];
+               if (arg.seen)
+                       continue;
+               analyzed = analyze_arg(arg.defval);
+               shared = analyzed[0];
+               argval = analyzed[1];
+               
+               // Don't trust a default "yes" answer for a non-core module
+               // in a snapshot build
+               if (PHP_SNAPSHOT_BUILD != "no" && argval == "yes" && !shared) {
+
+                       force = true;
+                       for (j = 0; j < snapshot_build_exclusions.length; j++) {
+                               if (snapshot_build_exclusions[j] == arg.optname) {
+                                       force = false;
+                                       break;
+                               }
+                       }
+
+                       if (force) {
+                               /* now check if it is a core module */
+                               force = false;
+                               for (j = 0; j < core_module_list.length; j++) {
+                                       if (core_module_list[j] == arg.optname) {
+                                               force = true;
+                                               break;
+                                       }
+                               }
+
+                               if (!force) {
+                                       STDOUT.WriteLine("snapshot: forcing " + arg.arg + " shared");
+                                       shared = true;
+                               }
+                       }
+               }
+               
+               if (PHP_SNAPSHOT_BUILD != "no" && argval == "no") {
+                       force = true;
+                       for (j = 0; j < snapshot_build_exclusions.length; j++) {
+                               if (snapshot_build_exclusions[j] == arg.optname) {
+                                       force = false;
+                                       break;
+                               }
+                       }
+                       if (force) {
+                               STDOUT.WriteLine("snapshot: forcing " + arg.optname + " on");
+                               argval = "yes";
+                               shared = true;
+                       }
+               }
+
+               if (disable_all) {
+                       force = true;
+                       for (j = 0; j < snapshot_build_exclusions.length; j++) {
+                               if (snapshot_build_exclusions[j] == arg.optname) {
+                                       force = false;
+                                       break;
+                               }
+                       }
+                       if (force) {
+                               if (arg.defval == '') {
+                                       argval = '';
+                               } else {
+                                       argval = "no";
+                               }
+                               shared = false;
+                       }
+               }
+
+               eval("PHP_" + arg.symval + " = argval;");
+               eval("PHP_" + arg.symval + "_SHARED = shared;");
+       }
+
+       MFO = FSO.CreateTextFile("Makefile.objects", true);
+
+       STDOUT.WriteLine("Saving configure options to config.nice.bat");
+       var nicefile = FSO.CreateTextFile("config.nice.bat", true);
+       nicefile.WriteLine(nice +  " %*");
+       nicefile.Close();
+
+       AC_DEFINE('CONFIGURE_COMMAND', nice, "Configure line");
+}
+
+function DEFINE(name, value)
+{
+       if (configure_subst.Exists(name)) {
+               configure_subst.Remove(name);
+       }
+       configure_subst.Add(name, value);
+}
+
+// Searches a set of paths for a file;
+// returns the dir in which the file was found,
+// true if it was found in the default env path,
+// or false if it was not found at all.
+// env_name is the optional name of an env var
+// specifying the default path to search
+function search_paths(thing_to_find, explicit_path, env_name)
+{
+       var i, found = false, place = false, file, env;
+
+       STDOUT.Write("Checking for " + thing_to_find + " ... ");
+
+       thing_to_find = thing_to_find.replace(new RegExp("/", "g"), "\\");
+
+       if (explicit_path != null) {
+               if (typeof(explicit_path) == "string") {
+                       explicit_path = explicit_path.split(";");
+               }
+
+               for (i = 0; i < explicit_path.length; i++) {
+                       file = glob(explicit_path[i] + "\\" + thing_to_find);
+                       if (file) {
+                               found = true;
+                               place = file[0];
+                               place = place.substr(0, place.length - thing_to_find.length - 1);
+                               break;
+                       }
+               }
+       }
+
+       if (!found && env_name != null) {
+               env = WshShell.Environment("Process").Item(env_name);
+               env = env.split(";");
+               for (i = 0; i < env.length; i++) {
+                       file = glob(env[i] + "\\" + thing_to_find);
+                       if (file) {
+                               found = true;
+                               place = true;
+                               break;
+                       }
+               }
+       }
+
+       if (found && place == true) {
+               STDOUT.WriteLine(" <in default path>");
+       } else if (found) {
+               STDOUT.WriteLine(" " + place);
+       } else {
+               STDOUT.WriteLine(" <not found>");
+       }
+       return place;
+}
+
+function PATH_PROG(progname, additional_paths, symbol)
+{
+       var exe;
+       var place;
+       var cyg_path = PHP_CYGWIN + "\\bin;" + PHP_CYGWIN + "\\usr\\local\\bin";
+       var php_build_bin_path = PHP_PHP_BUILD + "\\bin"
+
+       exe = progname + ".exe";
+
+       if (additional_paths == null) {
+               additional_paths = cyg_path;
+       } else {
+               additional_paths += ";" + cyg_path;
+       }
+
+       additional_paths = additional_paths + ";" + php_build_bin_path;
+
+       place = search_paths(exe, additional_paths, "PATH");
+
+       if (place == true) {
+               place = exe;
+       } else if (place != false) {
+               place = place + "\\" + exe;
+       }
+
+       if (place) {
+               if (symbol == null) {
+                       symbol = progname.toUpperCase();
+               }
+               DEFINE(symbol, place);
+       }
+       return place;
+}
+
+function find_pattern_in_path(pattern, path)
+{
+       if (path == null) {
+               return false;
+       }
+
+       var dirs = path.split(';');
+       var i;
+       var items;
+
+       for (i = 0; i < dirs.length; i++) {
+               items = glob(dirs[i] + "\\" + pattern);
+               if (items) {
+                       return condense_path(items[0]);
+               }
+       }
+       return false;
+}
+
+function CHECK_LIB(libnames, target, path_to_check, common_name)
+{
+       STDOUT.Write("Checking for library " + libnames + " ... ");
+
+       if (common_name == null && target != null) {
+               common_name = target;
+       }
+
+       if (path_to_check == null) {
+               path_to_check = "";
+       }
+
+       // if they specified a common name for the package that contains
+       // the library, tag some useful defaults on to the end of the
+       // path to be searched
+       if (common_name != null) {
+               path_to_check += ";" + PHP_PHP_BUILD + "\\" + common_name + "*";
+               path_to_check += ";" + PHP_PHP_BUILD + "\\lib\\" + common_name + "*";
+               path_to_check += ";..\\" + common_name + "*";
+       }
+
+       // Determine target for build flags
+       if (target == null) {
+               target = "";
+       } else {
+               target = "_" + target.toUpperCase();
+       }
+
+       // Expand path to include general dirs
+       path_to_check += ";" + php_usual_lib_suspects;
+
+       // It is common practice to put libs under one of these dir names
+       var subdirs = new Array(PHP_DEBUG == "yes" ? "Debug" : (PHP_DEBUG_PACK == "yes"?"Release_Dbg":"Release"), "lib", "libs", "libexec");
+
+       // libnames can be ; separated list of accepted library names
+       libnames = libnames.split(';');
+
+       // for debug builds, lib may have _debug appended, we want that first
+       if (PHP_DEBUG == "yes") {
+               var length = libnames.length;
+               for (var i = 0; i < length; i++) {
+                       var name = new String(libnames[i]);
+                       rExp = /.lib$/i;
+                       name = name.replace(rExp,"_debug.lib");
+                       libnames.unshift(name);
+               }
+       }
+
+       var i, j, k, libname;
+       var location = false;
+       var path = path_to_check.split(';');
+       
+       for (i = 0; i < libnames.length; i++) {
+               libname = libnames[i];
+
+               for (k = 0; k < path.length; k++) {
+                       location = glob(path[k] + "\\" + libname);
+                       if (location) {
+                               location = location[0];
+                               break;
+                       }
+                       for (j = 0; j < subdirs.length; j++) {
+                               location = glob(path[k] + "\\" + subdirs[j] + "\\" + libname);
+                               if (location) {
+                                       location = location[0];
+                                       break;
+                               }
+                       }
+                       if (location)
+                               break;
+               }
+
+               if (location) {
+                       location = condense_path(location);
+                       var libdir = FSO.GetParentFolderName(location);
+                       libname = FSO.GetFileName(location);
+                       ADD_FLAG("LDFLAGS" + target, '/libpath:"' + libdir + '" ');
+                       ADD_FLAG("LIBS" + target, libname);
+
+                       STDOUT.WriteLine(location);
+
+                       return location;
+               }
+
+               // Check in their standard lib path
+               location = find_pattern_in_path(libname, WshShell.Environment("Process").Item("LIB"));
+
+               if (location) {
+                       location = condense_path(location);
+                       libname = FSO.GetFileName(location);
+                       ADD_FLAG("LIBS" + target, libname);
+
+                       STDOUT.WriteLine("<in LIB path> " + libname);
+                       return location;
+               }
+
+               // Check in their general extra libs path
+               location = find_pattern_in_path(libname, PHP_EXTRA_LIBS);
+               if (location) {
+                       location = condense_path(location);
+                       libname = FSO.GetFileName(location);
+                       ADD_FLAG("LIBS" + target, libname);
+                       STDOUT.WriteLine("<in extra libs path>");
+                       return location;
+               }
+       }
+
+       STDOUT.WriteLine("<not found>");
+
+       return false;
+}
+
+function OLD_CHECK_LIB(libnames, target, path_to_check)
+{
+       if (target == null) {
+               target = "";
+       } else {
+               target = "_" + target.toUpperCase();
+       }
+       
+       if (path_to_check == null) {
+               path_to_check = php_usual_lib_suspects;
+       } else {
+               path_to_check += ";" + php_usual_lib_suspects;
+       }
+       var have = 0;
+       var p;
+       var i;
+       var libname;
+
+       var subdir = PHP_DEBUG == "yes" ? "Debug" : (PHP_DEBUG_PACK == "yes"?"Release_Dbg":"Release");
+
+       libnames = libnames.split(';');
+       for (i = 0; i < libnames.length; i++) {
+               libname = libnames[i];
+               p = search_paths(libname, path_to_check, "LIB");
+
+               if (!p) {
+                       p = search_paths(subdir + "\\" + libname, path_to_check, "LIB");
+                       if (p) {
+                               p += "\\" + subdir;
+                       }
+               }
+
+               if (typeof(p) == "string") {
+                       ADD_FLAG("LDFLAGS" + target, '/libpath:"' + p + '" ');
+                       ADD_FLAG("LIBS" + target, libname);
+                       have = 1;
+               } else if (p == true) {
+                       ADD_FLAG("LIBS" + target, libname);
+                       have = 1;
+               } else {
+                       /* not found in the defaults or the explicit paths,
+                        * so check the general extra libs; if we find
+                        * it here, no need to add another /libpath: for it as we
+                        * already have it covered, but we need to add the lib
+                        * to LIBS_XXX */
+                       if (false != search_paths(libname, PHP_EXTRA_LIBS, null)) {
+                               ADD_FLAG("LIBS" + target, libname);
+                               have = 1;
+                       }
+               }
+
+               if (have) {
+                       break;
+               }
+       }
+
+//     AC_DEFINE("HAVE_" + header_name.toUpperCase().replace(new RegExp("/\\\\-\.", "g"), "_"), have);
+
+       return have;
+
+}
+
+function CHECK_FUNC_IN_HEADER(header_name, func_name, path_to_check, add_to_flag)
+{
+       var c = false;
+       var sym;
+
+       STDOUT.Write("Checking for " + func_name + " in " + header_name + " ... ");
+
+       c = GREP_HEADER(header_name, func_name, path_to_check);
+
+       sym = func_name.toUpperCase();
+       sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");
+
+       if (typeof(add_to_flag) == "undefined") {
+               AC_DEFINE("HAVE_" + sym, c ? 1 : 0);
+       } else {
+               ADD_FLAG(add_to_flag, "/DHAVE_" + sym + "=" + (c ? "1" : "0"));
+       }
+
+       if (c) {
+               STDOUT.WriteLine("OK");
+               return c;
+       }
+       STDOUT.WriteLine("No");
+       return false;   
+}
+
+function GREP_HEADER(header_name, regex, path_to_check)
+{
+       var c = false;
+
+       if (FSO.FileExists(path_to_check + "\\" + header_name)) {
+               c = file_get_contents(path_to_check + "\\" + header_name);
+       }
+
+       if (!c) {
+               /* look in the include path */
+
+               var p = search_paths(header_name, path_to_check, "INCLUDE");
+               if (typeof(p) == "string") {
+                       c = file_get_contents(p);
+               } else if (p == false) {
+                       p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);
+                       if (typeof(p) == "string") {
+                               c = file_get_contents(p);
+                       }
+               } 
+               if (!c) {
+                       return false;
+               }
+       }
+
+       if (typeof(regex) == "string") {
+               regex = new RegExp(regex);
+       }
+
+       if (c.match(regex)) {
+               /* caller can now use RegExp.$1 etc. to get at patterns */
+               return true;
+       }
+       return false;
+}
+
+function CHECK_HEADER_ADD_INCLUDE(header_name, flag_name, path_to_check, use_env, add_dir_part, add_to_flag_only)
+{
+       var dir_part_to_add = "";
+       
+       if (use_env == null) {
+               use_env = true;
+       }
+
+       // if true, add the dir part of the header_name to the include path
+       if (add_dir_part == null) {
+               add_dir_part = false;
+       } else if (add_dir_part) {
+               var basename = FSO.GetFileName(header_name);
+               dir_part_to_add = "\\" + header_name.substr(0, header_name.length - basename.length - 1);
+       }
+
+       if (path_to_check == null) {
+               path_to_check = php_usual_include_suspects;
+       } else {
+               path_to_check += ";" + php_usual_include_suspects;
+       }
+       
+       var p = search_paths(header_name, path_to_check, use_env ? "INCLUDE" : null);
+       var have = 0;
+       var sym;
+
+       if (typeof(p) == "string") {
+               ADD_FLAG(flag_name, '/I "' + p + dir_part_to_add + '" ');
+       } else if (p == false) {
+               /* not found in the defaults or the explicit paths,
+                * so check the general extra includes; if we find
+                * it here, no need to add another /I for it as we
+                * already have it covered, unless we are adding
+                * the dir part.... */
+               p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);
+               if (typeof(p) == "string" && add_dir_part) {
+                       ADD_FLAG(flag_name, '/I "' + p + dir_part_to_add + '" ');
+               }
+       } 
+       have = p ? 1 : 0
+
+       sym = header_name.toUpperCase();
+       sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");
+
+       if (typeof(add_to_flag_only) == "undefined" &&
+                       flag_name.match(new RegExp("^CFLAGS_(.*)$"))) {
+               add_to_flag_only = true;
+       }
+
+       if (typeof(add_to_flag_only) != "undefined") {
+               ADD_FLAG(flag_name, "/DHAVE_" + sym + "=" + have);
+       } else {
+               AC_DEFINE("HAVE_" + sym, have, "have the " + header_name + " header file");
+       }
+
+       return p;
+}
+
+/* emits rule to generate version info for a SAPI
+ * or extension.  Returns the name of the .res file
+ * that will be generated */
+function generate_version_info_resource(makefiletarget, basename, creditspath, sapi)
+{
+       var resname = makefiletarget + ".res";
+       var res_desc = makefiletarget;
+       var res_prod_name = "PHP " + makefiletarget;
+       var credits;
+       var thanks = "";
+       var logo = "";
+       var debug = "";
+       var project_url = "http://www.php.net";
+       var project_header = creditspath + "/php_" + basename + ".h";
+       var versioning = "";
+
+       if (sapi) {
+               var internal_name = basename.toUpperCase() + " SAPI";
+       } else {
+               var internal_name = basename.toUpperCase() + " extension";
+       }
+
+       if (FSO.FileExists(creditspath + '/CREDITS')) {
+               credits = FSO.OpenTextFile(creditspath + '/CREDITS', 1);
+               res_desc = credits.ReadLine();
+               try {
+                       thanks = credits.ReadLine();
+               } catch (e) {
+                       thanks = null;
+               }
+               if (thanks == null) {
+                       thanks = "";
+               } else {
+                       thanks = "Thanks to " + thanks;
+               }
+               credits.Close();
+       }
+
+       if (creditspath.match(new RegExp("pecl"))) {
+               /* PECL project url - this will eventually work correctly for all */
+               project_url = "http://pecl.php.net/" + basename;
+
+               /* keep independent versioning PECL-specific for now */
+               if (FSO.FileExists(project_header)) {
+                       if (header = FSO.OpenTextFile(project_header, 1)) {
+                               contents = header.ReadAll();
+                               /* allowed: x.x.x[a|b|-alpha|-beta][RCx][-dev] */
+                               if (contents.match(new RegExp('PHP_' + basename.toUpperCase() + '_VERSION(\\s+)"((\\d+\.\\d+(\.\\d+)?)((a|b)(\\d)?|\-[a-z]{3,5})?(RC\\d+)?(\-dev)?)'))) {
+                                       project_version = RegExp.$2;
+                                       file_version = RegExp.$3.split('.');
+                                       if (!file_version[2]) {
+                                               file_version[2] = 0;
+                                       }
+                                       versioning = '\\"" /d EXT_FILE_VERSION=' + file_version[0] + ',' + file_version[1] + ',' + file_version[2] + ' /d EXT_VERSION="\\"' + project_version;
+                               }
+                               header.Close();
+                       }
+               }
+       }
+
+       if (makefiletarget.match(new RegExp("\\.exe$"))) {
+               logo = " /d WANT_LOGO ";
+       }
+
+       if (PHP_DEBUG != "no") {
+               debug = " /d _DEBUG";
+       }
+
+       /**
+        * Use user supplied template.rc if it exists
+        */
+       if (FSO.FileExists(creditspath + '\\template.rc')) {
+               MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": " + creditspath + "\\template.rc");
+               MFO.WriteLine("\t$(RC) /fo $(BUILD_DIR)\\" + resname + logo + debug +
+                       ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"' +
+                       makefiletarget + '\\"" /d PRODUCT_NAME="\\"' + res_prod_name +
+                       versioning + '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" ' +
+                       creditspath + '\\template.rc');
+               return resname;
+       }
+       if (MODE_PHPIZE) {
+               MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": $(PHP_DIR)\\build\\template.rc");
+               MFO.WriteLine("\t$(RC)  /I $(PHP_DIR)/include /n /fo $(BUILD_DIR)\\" + resname + logo + debug +
+                       ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'
+                       + makefiletarget + '\\"" /d URL="\\"' + project_url + 
+                       '\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning + 
+                       '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" $(PHP_DIR)\\build\\template.rc');
+       } else {
+               MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": win32\\build\\template.rc");
+               MFO.WriteLine("\t$(RC) /n /fo $(BUILD_DIR)\\" + resname + logo + debug +
+                       ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'
+                       + makefiletarget + '\\"" /d URL="\\"' + project_url + 
+                       '\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning + 
+                       '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" win32\\build\\template.rc');
+       }
+       MFO.WriteBlankLines(1);
+       return resname;
+}
+
+/* Check if PGO is enabled for given module. To disable PGO for a particular module,
+define a global variable by the following name scheme before SAPI() or EXTENSION() call
+       var PHP_MYMODULE_PGO = false; */
+function is_pgo_desired(mod)
+{
+       var varname = "PHP_" + mod.toUpperCase() + "_PGO";
+
+       /* XXX enable PGO in phpize mode */
+       if (MODE_PHPIZE) {
+               return false;
+       }
+
+       /* don't disable if there's no mention of the varname */
+       if (eval("typeof " + varname + " == 'undefined'")) {
+               return true;
+       }
+
+       return eval("!!" + varname);
+}
+
+function SAPI(sapiname, file_list, makefiletarget, cflags, obj_dir)
+{
+       var SAPI = sapiname.toUpperCase();
+       var ldflags;
+       var resname;
+       var ld;
+       var manifest;
+
+       if (typeof(obj_dir) == "undefined") {
+               sapiname_for_printing = configure_module_dirname;
+       } else {
+               sapiname_for_printing = configure_module_dirname + " (via " + obj_dir + ")";
+       }
+
+       STDOUT.WriteLine("Enabling SAPI " + sapiname_for_printing);
+
+       MFO.WriteBlankLines(1);
+       MFO.WriteLine("# objects for SAPI " + sapiname);
+       MFO.WriteBlankLines(1);
+
+       if (cflags) {
+               ADD_FLAG('CFLAGS_' + SAPI, cflags);
+       }
+
+       ADD_SOURCES(configure_module_dirname, file_list, sapiname, obj_dir);
+       MFO.WriteBlankLines(1);
+       MFO.WriteLine("# SAPI " + sapiname);
+       MFO.WriteBlankLines(1);
+
+       /* generate a .res file containing version information */
+       resname = generate_version_info_resource(makefiletarget, sapiname, configure_module_dirname, true);
+       
+       MFO.WriteLine(makefiletarget + ": $(BUILD_DIR)\\" + makefiletarget);
+       MFO.WriteLine("\t@echo SAPI " + sapiname_for_printing + " build complete");
+       if (MODE_PHPIZE) {
+               MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(BUILD_DIR)\\" + resname);
+       } else {
+               MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
+       }
+
+       if (makefiletarget.match(new RegExp("\\.dll$"))) {
+               ldflags = "/dll $(LDFLAGS)";
+               manifest = "-@$(_VC_MANIFEST_EMBED_DLL)";
+       } else if (makefiletarget.match(new RegExp("\\.lib$"))) {
+               ldflags = "$(LDFLAGS)";
+               ld = "$(MAKE_LIB)";
+       } else {
+               ldflags = "$(LDFLAGS)";
+               manifest = "-@$(_VC_MANIFEST_EMBED_EXE)";
+       }
+       
+       if(is_pgo_desired(sapiname) && (PHP_PGI == "yes" || PHP_PGO != "no")) {
+               // Add compiler and link flags if PGO options are selected
+               if (PHP_DEBUG != "yes" && PHP_PGI == "yes") {
+                       ADD_FLAG('CFLAGS_' + SAPI, "/GL /O2");
+                       ADD_FLAG('LDFLAGS_' + SAPI, "/LTCG:PGINSTRUMENT");
+               }
+               else if (PHP_DEBUG != "yes" && PHP_PGO != "no") {
+                       ADD_FLAG('CFLAGS_' + SAPI, "/GL /O2");
+                       ADD_FLAG('LDFLAGS_' + SAPI, "/LTCG:PGUPDATE");
+               }
+
+               ldflags += " /PGD:$(PGOPGD_DIR)\\" + makefiletarget.substring(0, makefiletarget.indexOf(".")) + ".pgd";
+       }
+
+       if (MODE_PHPIZE) {
+               if (ld) {
+                       MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);
+               } else {
+                       ld = "@$(CC)";
+                       MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");
+               }
+       } else {
+               if (ld) {
+                       MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);
+               } else {
+                       ld = "@$(CC)";
+                       MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");
+               }
+       }
+
+       if (manifest) {
+               MFO.WriteLine("\t" + manifest);
+       }
+               
+       DEFINE('CFLAGS_' + SAPI + '_OBJ', '$(CFLAGS_' + SAPI + ')');
+
+       if (configure_module_dirname.match("pecl")) {
+               ADD_FLAG("PECL_TARGETS", makefiletarget);
+       } else {
+               ADD_FLAG("SAPI_TARGETS", makefiletarget);
+       }
+
+       MFO.WriteBlankLines(1);
+       sapi_enabled[sapi_enabled.length] = [sapiname];
+}
+
+function ADD_DIST_FILE(filename)
+{
+       if (configure_module_dirname.match("pecl")) {
+               ADD_FLAG("PECL_EXTRA_DIST_FILES", filename);
+       } else {
+               ADD_FLAG("PHP_EXTRA_DIST_FILES", filename);
+       }
+}      
+
+function file_get_contents(filename)
+{
+       var f, c;
+       try {
+               f = FSO.OpenTextFile(filename, 1);
+               c = f.ReadAll();
+               f.Close();
+               return c;
+       } catch (e) {
+               STDOUT.WriteLine("Problem reading " + filename);
+               return false;
+       }
+}
+
+// Add a dependency on another extension, so that
+// the dependencies are built before extname
+function ADD_EXTENSION_DEP(extname, dependson, optional)
+{
+       var EXT = extname.toUpperCase();
+       var DEP = dependson.toUpperCase();
+       var dep_present = false;
+       var dep_shared = false;
+
+       try {
+               dep_present = eval("PHP_" + DEP);
+
+               if (dep_present != "no") {
+                       try {
+                               dep_shared = eval("PHP_" + DEP + "_SHARED");
+                       } catch (e) {
+                               dep_shared = false;
+                       }
+               }
+
+       } catch (e) {
+               dep_present = "no";
+       }
+
+       if (optional) {
+               if (dep_present == "no") {
+                       MESSAGE("\t" + dependson + " not found: " + dependson + " support in " + extname + " disabled");
+                       return false;
+               }
+       }
+
+       var ext_shared = eval("PHP_" + EXT + "_SHARED");
+
+       if (dep_shared) {
+               if (!ext_shared) {
+                       if (optional) {
+                               MESSAGE("\tstatic " + extname + " cannot depend on shared " + dependson + ": " + dependson + "support disabled");
+                               return false;
+                       }
+                       ERROR("static " + extname + " cannot depend on shared " + dependson);
+               }
+
+               ADD_FLAG("LIBS_" + EXT, "php_" + dependson + ".lib");
+               if (MODE_PHPIZE) {
+                       ADD_FLAG("LDFLAGS_" + EXT, "/libpath:$(BUILD_DIR_DEV)\\lib");
+                       ADD_FLAG("DEPS_" + EXT, "$(BUILD_DIR_DEV)\\lib\\php_" + dependson + ".lib");
+               } else {
+                       ADD_FLAG("LDFLAGS_" + EXT, "/libpath:$(BUILD_DIR)");
+                       ADD_FLAG("DEPS_" + EXT, "$(BUILD_DIR)\\php_" + dependson + ".lib");
+               }
+
+       } else {
+
+               if (dep_present == "no") {
+                       if (ext_shared) {
+                               WARNING(extname + " cannot be built: missing dependency, " + dependson + " not found");
+
+                               var dllname = ' php_' + extname + '.dll';
+
+                               if (!REMOVE_TARGET(dllname, 'EXT_TARGETS')) {
+                                       REMOVE_TARGET(dllname, 'PECL_TARGETS');
+                               }
+
+                               return false;
+
+                       }
+
+                       ERROR("Cannot build " + extname + "; " + dependson + " not enabled");
+                       return false;
+               }
+       } // dependency is statically built-in to PHP
+       return true;
+}
+
+var static_pgo_enabled = false;
+
+function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir)
+{
+       var objs = null;
+       var EXT = extname.toUpperCase();
+       var extname_for_printing;
+       var ldflags;
+
+       if (shared == null) {
+               eval("shared = PHP_" + EXT + "_SHARED;");
+       } else {
+               eval("PHP_" + EXT + "_SHARED = shared;");
+       }
+
+       if (cflags == null) {
+               cflags = "";
+       }
+
+       if (typeof(obj_dir) == "undefined") {
+               extname_for_printing = configure_module_dirname;
+       } else {
+               extname_for_printing = configure_module_dirname + " (via " + obj_dir + ")";
+       }
+
+       if (shared) {
+               STDOUT.WriteLine("Enabling extension " + extname_for_printing + " [shared]");
+               cflags = "/D COMPILE_DL_" + EXT + " /D " + EXT + "_EXPORTS=1 " + cflags;
+               ADD_FLAG("CFLAGS_PHP", "/D COMPILE_DL_" + EXT);
+       } else {
+               STDOUT.WriteLine("Enabling extension " + extname_for_printing);
+       }
+
+       MFO.WriteBlankLines(1);
+       MFO.WriteLine("# objects for EXT " + extname);
+       MFO.WriteBlankLines(1);
+
+       ADD_SOURCES(configure_module_dirname, file_list, extname, obj_dir);
+       
+       MFO.WriteBlankLines(1);
+
+       if (shared) {
+               if (dllname == null) {
+                       dllname = "php_" + extname + ".dll";
+               }
+               var libname = dllname.substring(0, dllname.length-4) + ".lib";
+
+               var resname = generate_version_info_resource(dllname, extname, configure_module_dirname, false);
+               var ld = "@$(CC)";
+
+               ldflags = "";
+               if (is_pgo_desired(extname) && (PHP_PGI == "yes" || PHP_PGO != "no")) {
+                       // Add compiler and link flags if PGO options are selected
+                       if (PHP_DEBUG != "yes" && PHP_PGI == "yes") {
+                               ADD_FLAG('LDFLAGS_' + EXT, "/LTCG:PGINSTRUMENT");
+                       }
+                       else if (PHP_DEBUG != "yes" && PHP_PGO != "no") {
+                               ADD_FLAG('LDFLAGS_' + EXT, "/LTCG:PGUPDATE");
+                       }
+
+                       ADD_FLAG('CFLAGS_' + EXT, "/GL /O2");
+
+                       ldflags = " /PGD:$(PGOPGD_DIR)\\" + dllname.substring(0, dllname.indexOf(".")) + ".pgd";
+               }
+
+               MFO.WriteLine("$(BUILD_DIR)\\" + libname + ": $(BUILD_DIR)\\" + dllname);
+               MFO.WriteBlankLines(1);
+               if (MODE_PHPIZE) {
+                       MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(PHPLIB) $(BUILD_DIR)\\" + resname);
+                       MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");
+               } else {
+                       MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
+                       MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + ldflags + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");
+               }
+               MFO.WriteLine("\t-@$(_VC_MANIFEST_EMBED_DLL)");
+               MFO.WriteBlankLines(1);
+
+               if (configure_module_dirname.match("pecl")) {
+                       ADD_FLAG("PECL_TARGETS", dllname);
+               } else {
+                       ADD_FLAG("EXT_TARGETS", dllname);
+               }
+               MFO.WriteLine(dllname + ": $(BUILD_DIR)\\" + dllname);
+               MFO.WriteLine("\t@echo EXT " + extname + " build complete");
+               MFO.WriteBlankLines(1);
+               
+               DEFINE('CFLAGS_' + EXT + '_OBJ', '$(CFLAGS_' + EXT + ')');
+       } else {
+               ADD_FLAG("STATIC_EXT_OBJS", "$(" + EXT + "_GLOBAL_OBJS)");
+               ADD_FLAG("STATIC_EXT_LIBS", "$(LIBS_" + EXT + ")");
+               ADD_FLAG("STATIC_EXT_LDFLAGS", "$(LDFLAGS_" + EXT + ")");
+               ADD_FLAG("STATIC_EXT_CFLAGS", "$(CFLAGS_" + EXT + ")");
+               if (is_pgo_desired(extname) && (PHP_PGI == "yes" || PHP_PGO != "no")) {
+                       if (!static_pgo_enabled) {
+                               if (PHP_DEBUG != "yes" && PHP_PGI == "yes") {
+                                       ADD_FLAG('STATIC_EXT_LDFLAGS', "/LTCG:PGINSTRUMENT");
+                               }
+                               else if (PHP_DEBUG != "yes" && PHP_PGO != "no") {
+                                       ADD_FLAG('STATIC_EXT_LDFLAGS', "/LTCG:PGUPDATE");
+                               }
+
+                               ADD_FLAG("STATIC_EXT_CFLAGS", "/GL /O2");
+                               static_pgo_enabled = true;
+                       }
+               }
+
+               /* find the header that declares the module pointer,
+                * so we can include it in internal_functions.c */
+               var ext_dir = FSO.GetFolder(configure_module_dirname);
+               var fc = new Enumerator(ext_dir.Files);
+               var re = /\.h$/;
+               var s, c;
+               for (; !fc.atEnd(); fc.moveNext()) {
+                       s = fc.item() + "";
+                       if (s.match(re)) {
+                               c = file_get_contents(s);
+                               if (c.match("phpext_")) {
+                                       extension_include_code += '#include "' + configure_module_dirname + '/' + FSO.GetFileName(s) + '"\r\n';
+                               }
+                       }
+               }
+       
+               extension_module_ptrs += '\tphpext_' + extname + '_ptr,\r\n';
+       
+               DEFINE('CFLAGS_' + EXT + '_OBJ', '$(CFLAGS_PHP) $(CFLAGS_' + EXT + ')');
+       }
+       if (MODE_PHPIZE && FSO.FileExists(PHP_DIR + "/include/main/config.pickle.h")) {
+               cflags = "/FI main/config.pickle.h " + cflags;
+       }
+       ADD_FLAG("CFLAGS_" + EXT, cflags);
+
+       extensions_enabled[extensions_enabled.length] = [extname, shared ? 'shared' : 'static'];
+}
+
+function ADD_SOURCES(dir, file_list, target, obj_dir)
+{
+       var i;
+       var tv;
+       var src, obj, sym, flags;
+
+       if (target == null) {
+               target = "php";
+       }
+
+       sym = target.toUpperCase() + "_GLOBAL_OBJS";
+       flags = "CFLAGS_" + target.toUpperCase() + '_OBJ';
+
+       if (configure_subst.Exists(sym)) {
+               tv = configure_subst.Item(sym);
+       } else {
+               tv = "";
+       }
+
+       file_list = file_list.split(new RegExp("\\s+"));
+       file_list.sort();
+
+       var re = new RegExp("\.[a-z0-9A-Z]+$");
+
+       dir = dir.replace(new RegExp("/", "g"), "\\");
+       var objs_line = "";
+       var srcs_line = "";
+
+       var sub_build = "$(BUILD_DIR)\\";
+
+       /* if module dir is not a child of the main source dir,
+        * we need to tweak it; we should have detected such a
+        * case in condense_path and rewritten the path to
+        * be relative.
+        * This probably breaks for non-sibling dirs, but that
+        * is not a problem as buildconf only checks for pecl
+        * as either a child or a sibling */
+       if (obj_dir == null) {
+               var build_dir = dir.replace(new RegExp("^..\\\\"), "");
+               var mangle_dir = build_dir.replace(new RegExp("[\\\\/.-]", "g"), "_");
+               var bd_flags_name = "CFLAGS_BD_" + mangle_dir.toUpperCase();
+       }
+       else {
+               var build_dir = obj_dir.replace(new RegExp("^..\\\\"), "");
+               var mangle_dir = build_dir.replace(new RegExp("[\\\\/.-]", "g"), "_");
+               var bd_flags_name = "CFLAGS_BD_" + mangle_dir.toUpperCase();
+       }
+       
+       var dirs = build_dir.split("\\");
+       var i, d = "";
+       for (i = 0; i < dirs.length; i++) {
+               d += dirs[i];
+               build_dirs[build_dirs.length] = d;
+               d += "\\";
+       }
+       sub_build += d;
+
+
+       DEFINE(bd_flags_name, " /Fp" + sub_build + " /FR" + sub_build + " ");
+
+       for (i in file_list) {
+               src = file_list[i];
+               obj = src.replace(re, ".obj");
+               tv += " " + sub_build + obj;
+
+               if (!PHP_MP_DISABLED) {
+                       if (i > 0) {
+                               objs_line += " " + sub_build + obj;     
+                               srcs_line += " " + dir + "\\" + src;
+                       } else {
+                               objs_line = sub_build + obj;    
+                               srcs_line = dir + "\\" + src;
+                       }
+               } else {
+                       MFO.WriteLine(sub_build + obj + ": " + dir + "\\" + src);
+
+                       if (PHP_ANALYZER == "pvs") {
+                               MFO.WriteLine("\t@\"$(PVS_STUDIO)\" --cl-params $(" + flags + ") $(CFLAGS) $(" + bd_flags_name + ") /c " + dir + "\\" + src + " --source-file "  + dir + "\\" + src
+                                       + " --cfg PVS-Studio.conf --errors-off \"V122 V117 V111\" ");
+                       }
+                       MFO.WriteLine("\t@$(CC) $(" + flags + ") $(CFLAGS) $(" + bd_flags_name + ") /c " + dir + "\\" + src + " /Fo" + sub_build + obj);
+               }
+       }
+
+       if (!PHP_MP_DISABLED) {
+               MFO.WriteLine(objs_line + ": " + srcs_line);
+               MFO.WriteLine("\t$(CC) $(" + flags + ") $(CFLAGS) /Fo" + sub_build + " $(" + bd_flags_name + ") /c " + srcs_line);
+       }
+
+       DEFINE(sym, tv);
+}
+
+function REMOVE_TARGET(dllname, flag)
+{
+       var dllname = dllname.replace(/\s/g, "");
+       var EXT = dllname.replace(/php_(\S+)\.dll/, "$1").toUpperCase();
+       var php_flags = configure_subst.Item("CFLAGS_PHP");
+
+       if (configure_subst.Exists(flag)) {
+               var targets = configure_subst.Item(flag);
+
+               if (targets.match(dllname)) {
+                       configure_subst.Remove(flag);
+                       targets = targets.replace(dllname, "");
+                       targets = targets.replace(/\s+/, " ");
+                       targets = targets.replace(/\s$/, "");
+                       configure_subst.Add(flag, targets);
+                       configure_hdr.Add("HAVE_" + EXT, new Array(0, ""));
+                       configure_subst.Item("CFLAGS_PHP") = php_flags.replace(" /D COMPILE_DL_" + EXT, "");
+                       extensions_enabled.pop();
+                       return true;
+               }
+       }
+       return false;
+}
+
+function generate_internal_functions()
+{
+       var infile, outfile;
+       var indata;
+
+       STDOUT.WriteLine("Generating main/internal_functions.c");
+       
+       infile = FSO.OpenTextFile("main/internal_functions.c.in", 1);
+       indata = infile.ReadAll();
+       infile.Close();
+       
+       indata = indata.replace("@EXT_INCLUDE_CODE@", extension_include_code);
+       indata = indata.replace("@EXT_MODULE_PTRS@", extension_module_ptrs);
+
+       if (FSO.FileExists("main/internal_functions.c")) {
+               var origdata = file_get_contents("main/internal_functions.c");
+
+               if (origdata == indata) {
+                       STDOUT.WriteLine("\t[content unchanged; skipping]");
+                       return;
+               }
+       }
+
+       outfile = FSO.CreateTextFile("main/internal_functions.c", true);
+       outfile.Write(indata);
+       outfile.Close();
+}
+
+function output_as_table(header, ar_out)
+{
+       var l = header.length;
+       var cols = 80;
+       var fixedlength = "";
+       var t = 0;
+       var i,j,k,m;
+       var out = "| ";
+       var min = new Array(l);
+       var max = new Array(l);
+
+       if (!!ar_out[0] && l != ar_out[0].length) {
+               STDOUT.WriteLine("Invalid header argument, can't output the table " + l + " " + ar_out[0].length  );
+               return;
+       }
+
+       for (j=0; j < l; j++) {
+               var tmax, tmin;
+
+               /*Figure out the max length per column */
+               tmin = 0;
+               tmax = 0;
+               for (k = 0; k < ar_out.length; k++) {
+                       if(typeof ar_out[k][j] != 'undefined') {
+                               var t = ar_out[k][j].length;
+                               if (t > tmax) tmax = t;
+                               else if (t < tmin) tmin = t;
+                       }
+               }
+               if (tmax > header[j].length) {
+                       max[j] = tmax;
+               } else {
+                       max[j] = header[j].length;
+               }
+               if (tmin < header[j].length) {
+                       min[j] = header[j].length;
+               }
+       }
+
+       sep = "";
+       k = 0;
+       for (i = 0; i < l; i++) {
+               k += max[i] + 3;
+       }
+       k++;
+
+       for (j=0; j < k; j++) {
+               sep += "-";
+       }
+
+       STDOUT.WriteLine(sep);
+       out = "|";
+       for (j=0; j < l; j++) {
+               out += " " + header[j];
+               for (var i = 0; i < (max[j] - header[j].length); i++){
+                       out += " ";
+               }
+               out += " |";
+       }
+       STDOUT.WriteLine(out);
+
+       STDOUT.WriteLine(sep);
+
+       out = "|";
+       for (i=0; i < ar_out.length; i++) {
+               line = ar_out[i];
+               for (j=0; j < l; j++) {
+                       out += " " + line[j];
+                       if(typeof line[j] != 'undefined') {
+                               for (var k = 0; k < (max[j] - line[j].length); k++){
+                                       out += " ";
+                               }
+                       }
+                       out += " |";
+               }
+               STDOUT.WriteLine(out);
+               out = "|";
+       }
+
+       STDOUT.WriteLine(sep);
+}
+
+function write_summary()
+{
+       var ar = new Array();
+
+       STDOUT.WriteBlankLines(2);
+
+       STDOUT.WriteLine("Enabled extensions:");
+       output_as_table(["Extension", "Mode"], extensions_enabled.sort());
+       STDOUT.WriteBlankLines(2);
+       if (!MODE_PHPIZE) {
+               STDOUT.WriteLine("Enabled SAPI:");
+               output_as_table(["Sapi Name"], sapi_enabled);
+               STDOUT.WriteBlankLines(2);
+       }
+       ar[0] = ['Build type', PHP_DEBUG == "yes" ? "Debug" : "Release"];
+       ar[1] = ['Thread Safety', PHP_ZTS == "yes" ? "Yes" : "No"];
+       ar[2] = ['Compiler', COMPILER_NAME];
+       ar[3] = ['Architecture', X64 ? 'x64' : 'x86'];
+       if (PHP_PGO == "yes") {
+               ar[4] = ['Optimization', "PGO"];
+       } else if (PHP_PGI == "yes") {
+               ar[4] = ['Optimization', "PGI"];
+       } else {
+               ar[4] = ['Optimization', PHP_DEBUG == "yes" ? "disabled" : "PGO disabled"];
+       }
+       if (PHP_ANALYZER == "vs") {
+               ar[5] = ['Static analyzer', 'Visual Studio'];
+       } else if (PHP_ANALYZER == "pvs") {
+               ar[5] = ['Static analyzer', 'PVS-Studio'];
+       } else {
+               ar[5] = ['Static analyzer', 'disabled'];
+       }
+
+       output_as_table(["",""], ar);
+       STDOUT.WriteBlankLines(2);
+}
+
+function generate_files()
+{
+       var i, dir, bd, last;
+
+       STDOUT.WriteBlankLines(1);
+       STDOUT.WriteLine("Creating build dirs...");
+       dir = get_define("BUILD_DIR");
+       build_dirs.sort();
+       last = null;
+
+       if (!FSO.FolderExists(dir)) {
+               FSO.CreateFolder(dir);
+       }
+
+       for (i = 0; i < build_dirs.length; i++) {
+               bd = FSO.BuildPath(dir, build_dirs[i]);
+               if (bd == last) {
+                       continue;
+               }
+               last = bd;
+
+               build_dir = get_define('BUILD_DIR');
+               build_dir = build_dir.replace(new RegExp("\\\\", "g"), "\\\\");
+               if (build_dir.substr(build_dir.Length - 2, 2) != '\\\\') {
+                       build_dir += '\\\\';
+               }
+               ADD_FLAG("BUILD_DIRS_SUB", bd.replace(new RegExp(build_dir), ''));
+
+               if (!FSO.FolderExists(bd)) {
+                       FSO.CreateFolder(bd);
+               }
+       }
+
+       STDOUT.WriteLine("Generating files...");
+       generate_makefile();
+       if (!MODE_PHPIZE) {
+               generate_internal_functions();
+               generate_config_h();
+               generate_phpize();
+       } else {
+               generate_config_pickle_h();
+               generate_ext_pickle();
+       }
+       STDOUT.WriteLine("Done.");
+       STDOUT.WriteBlankLines(1);
+       write_summary();
+
+       if (PHP_SNAPSHOT_BUILD != "no") {
+               STDOUT.WriteLine("Type 'nmake snap' to build a PHP snapshot");
+       } else {
+               STDOUT.WriteLine("Type 'nmake' to build PHP");
+       }
+}
+
+function generate_ext_pickle()
+{
+       var content;
+       var DEPS = null;
+       var dest;
+       var deps_lines = new Array();
+
+       var build_var_name = function(name) {
+               return "PHP_" + name.toUpperCase();
+       }
+
+       STDOUT.WriteLine("Generating pickle deps");
+       dest = PHP_DIR + "/script/";
+
+       if (!FSO.FolderExists(dest)) {
+               FSO.CreateFolder(dest);
+       }
+
+       if (FSO.FileExists(dest + "/ext_pickle.js")) {
+               DEPS = FSO.OpenTextFile(dest + "/ext_pickle.js", 1);
+
+               while (!DEPS.AtEndOfStream) {
+                       var ln = DEPS.ReadLine();
+                       var found = false;
+
+                       for (var i in extensions_enabled) {
+                               var reg0 = new RegExp(build_var_name(extensions_enabled[i][0]) + "\s*=.+", "g");
+                               var reg1 = new RegExp(build_var_name(extensions_enabled[i][0]) + "_SHARED" + "\s*=.+", "g");
+
+                               if (ln.match(reg1) || ln.match(reg0)) {
+                                       found = true;
+                                       break;
+                               }
+                       }
+
+                       if (!found) {
+                               deps_lines.push(ln);
+                       }
+               }
+       }
+
+       for (var i in extensions_enabled) {
+               deps_lines.push(build_var_name(extensions_enabled[i][0]) + "=true;");
+               deps_lines.push(build_var_name(extensions_enabled[i][0]) + "_SHARED=" + (extensions_enabled[i][1] == 'shared' ? 'true' : 'false') + ";");
+       }
+
+       if (!!DEPS) {
+               DEPS.Close();
+               DEPS = null;
+       }
+
+       /* Replace the ext_pickle.js with the new content */
+       DEPS = FSO.CreateTextFile(dest + "/ext_pickle.js", true);
+
+       for (var j in deps_lines) {
+               DEPS.WriteLine(deps_lines[j]);
+       }
+
+       DEPS.Close();
+}
+
+function generate_config_pickle_h()
+{
+       var outfile = null;
+       var lines = new Array();
+       var keys = (new VBArray(configure_hdr.Keys())).toArray();
+       dest = PHP_DIR + "/include/main";
+
+       var ignore_key = function(key) {
+               var ignores = [ "CONFIGURE_COMMAND", "PHP_COMPILER_ID", "COMPILER", "ARCHITECTURE", "HAVE_STRNLEN", "PHP_DIR" ];
+
+               for (var k in ignores) {
+                       if (ignores[k] == key) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+
+       STDOUT.WriteLine("Generating main/config.pickle.h");
+
+       if (FSO.FileExists(dest + "/config.pickle.h")) {
+               outfile = FSO.OpenTextFile(dest + "/config.pickle.h", 1);
+
+               while (!outfile.AtEndOfStream) {
+                       var found = false;
+                       var ln = outfile.ReadLine();
+
+                       for (var i in keys) {
+                               var reg = new RegExp("#define[\s ]+" + keys[i] + "[\s ]*.*", "g");
+
+                               if (ln.match(reg)) {
+                                       found = true;
+                                       break;
+                               }
+                       }
+
+                       if (!found) {
+                               lines.push(ln);
+                       }
+               }
+       }
+
+       for (var i in keys) {
+               var item = configure_hdr.Item(keys[i]);
+
+               if (ignore_key(keys[i])) {
+                       continue;
+               }
+
+               /* XXX fix comment handling */
+               /*if (!lines[j].match(/^#define.+/g)) {
+                       continue;
+               }*/
+
+               lines.push("#define " + keys[i] + " " + item[0]);
+       }
+
+       if (outfile) {
+               outfile.Close();
+               outfile = null;
+       }
+
+       outfile = FSO.CreateTextFile(dest + "/config.pickle.h", true);
+
+       for (var k in lines) {
+               outfile.WriteLine(lines[k]);
+       }
+
+       outfile.Close();
+}
+
+function generate_config_h()
+{
+       var infile, outfile;
+       var indata;
+       var prefix;
+
+       prefix = PHP_PREFIX.replace(new RegExp("\\\\", "g"), "\\\\");
+
+       STDOUT.WriteLine("Generating main/config.w32.h");
+       
+       infile = FSO.OpenTextFile("win32/build/config.w32.h.in", 1);
+       indata = infile.ReadAll();
+       infile.Close();
+       
+       outfile = FSO.CreateTextFile("main/config.w32.h", true);
+
+       indata = indata.replace(new RegExp("@PREFIX@", "g"), prefix);
+       outfile.Write(indata);
+
+       var keys = (new VBArray(configure_hdr.Keys())).toArray();
+       var i, j;
+       var item;
+       var pieces, stuff_to_crack, chunk;
+
+       outfile.WriteBlankLines(1);
+       outfile.WriteLine("/* values determined by configure.js */");
+
+       for (i in keys) {
+               item = configure_hdr.Item(keys[i]);
+               outfile.WriteBlankLines(1);
+               pieces = item[0];
+
+               if (item[1] != undefined) {
+                       outfile.WriteLine("/* " + item[1] + " */");
+               }
+
+               if (typeof(pieces) == "string" && pieces.charCodeAt(0) == 34) {
+                       /* quoted string have a maximal length of 2k under vc.
+                        * solution is to crack them and let the compiler concat
+                        * them implicitly */
+                       stuff_to_crack = pieces;
+                       pieces = "";
+
+                       while (stuff_to_crack.length) {
+                               j = 65;
+                               while (stuff_to_crack.charCodeAt(j) != 32 && j < stuff_to_crack.length)
+                                       j++;
+
+                               chunk = stuff_to_crack.substr(0, j);
+                               pieces += chunk;
+                               stuff_to_crack = stuff_to_crack.substr(chunk.length);
+                               if (stuff_to_crack.length)
+                                       pieces += '" "';
+                       }
+               }
+               
+               outfile.WriteLine("#define " + keys[i] + " " + pieces);
+       }
+
+       if (VS_TOOLSET && VCVERS >= 1800) {
+               outfile.WriteLine("");
+               outfile.WriteLine("#define HAVE_ACOSH 1");
+               outfile.WriteLine("#define HAVE_ASINH 1");
+               outfile.WriteLine("#define HAVE_ATANH 1");
+       }
+
+       
+       outfile.Close();
+}
+
+function generate_phpize()
+{
+       STDOUT.WriteLine("Generating phpize");
+       dest = get_define("BUILD_DIR") + '/devel';
+
+       if (!FSO.FolderExists(dest)) {
+               FSO.CreateFolder(dest);
+       }
+
+       var MF = FSO.CreateTextFile(dest + "/phpize.js", true);
+       var DEPS = FSO.CreateTextFile(dest + "/ext_deps.js", true);
+       
+       prefix = get_define("PHP_PREFIX");
+       prefix = prefix.replace(new RegExp("/", "g"), "\\");
+       prefix = prefix.replace(new RegExp("\\\\", "g"), "\\\\");
+       MF.WriteLine("var PHP_PREFIX=" + '"' + prefix + '"');
+       MF.WriteLine("var PHP_ZTS=" + '"' + (PHP_ZTS.toLowerCase() == "yes" ? "Yes" : "No") + '"');
+       MF.WriteLine("var VC_VERSION=" + VCVERS);
+       MF.WriteLine("var PHP_VERSION=" + PHP_VERSION);
+       MF.WriteLine("var PHP_MINOR_VERSION=" + PHP_MINOR_VERSION);
+       MF.WriteLine("var PHP_RELEASE_VERSION=" + PHP_RELEASE_VERSION);
+       MF.WriteBlankLines(1);
+       MF.WriteLine("/* Genereted extensions list with mode (static/shared) */");
+
+       var count = extensions_enabled.length;
+       for (i in extensions_enabled) {
+               out = "PHP_" + extensions_enabled[i][0].toUpperCase() + "_SHARED=" + (extensions_enabled[i][1] == 'shared' ? 'true' : 'false') + ";";
+               DEPS.WriteLine("PHP_" + extensions_enabled[i][0].toUpperCase() + "=true;");
+               DEPS.WriteLine(out);
+               MF.WriteLine(out);
+       }
+
+       MF.WriteBlankLines(2);
+       MF.WriteLine("/* Genereted win32/build/phpize.js.in */");
+       MF.WriteBlankLines(1);
+       MF.Write(file_get_contents("win32/build/phpize.js.in"));
+       MF.Close();
+       DEPS.Close();
+
+       /* Generate flags file */
+       /* spit out variable definitions */
+       CJ = FSO.CreateTextFile(dest + "/config.phpize.js");
+
+       CJ.WriteLine("var PHP_ZTS =" + '"' + PHP_ZTS + '"');
+       CJ.WriteLine("var PHP_DLL_LIB =" + '"' + get_define('PHPLIB') + '"');
+       CJ.WriteLine("var PHP_DLL =" + '"' + get_define('PHPDLL') + '"');
+       CJ.WriteBlankLines(1);
+       CJ.Close();
+}
+
+function generate_makefile()
+{
+       STDOUT.WriteLine("Generating Makefile");
+       var MF = FSO.CreateTextFile("Makefile", true);
+
+       MF.WriteLine("# Generated by configure.js");
+       /* spit out variable definitions */
+       var keys = (new VBArray(configure_subst.Keys())).toArray();
+       var i;
+       MF.WriteLine("PHP_SRC_DIR =" + PHP_SRC_DIR);
+       for (i in keys) {
+               // The trailing space is needed to prevent the trailing backslash
+               // that is part of the build dir flags (CFLAGS_BD_XXX) from being
+               // seen as a line continuation character
+               MF.WriteLine(keys[i] + "=" + 
+                       //word_wrap_and_indent(1, configure_subst.Item(keys[i]), ' \\', '\t') + " "
+                       configure_subst.Item(keys[i]) + " "
+                       );
+               MF.WriteBlankLines(1);
+       }
+
+       MF.WriteBlankLines(1);
+       if (MODE_PHPIZE) {
+               var TF = FSO.OpenTextFile(PHP_DIR + "/script/Makefile.phpize", 1);
+       } else {
+               var TF = FSO.OpenTextFile("win32/build/Makefile", 1);
+       }
+
+       MF.Write(TF.ReadAll());
+
+       MF.WriteLine("build-headers:");
+       MF.WriteLine("  @if not exist $(BUILD_DIR_DEV)\\include mkdir $(BUILD_DIR_DEV)\\include >nul");
+       MF.WriteLine("  @for %D in ($(INSTALL_HEADERS_DIR)) do @if not exist $(BUILD_DIR_DEV)\\include\\%D mkdir $(BUILD_DIR_DEV)\\include\\%D >nul");
+       for (i in headers_install) {
+               if (headers_install[i][2] != "") {
+                               MF.WriteLine("  @if not exist $(BUILD_DIR_DEV)\\include\\" + headers_install[i][2] + " mkdir $(BUILD_DIR_DEV)\\include\\" + 
+                                                                                               headers_install[i][2] + ">nul");
+                               MF.WriteLine("  @copy " + headers_install[i][0] + " " + "$(BUILD_DIR_DEV)\\include\\" + headers_install[i][2] + " /y >nul");
+               }
+       }
+       MF.WriteLine("  @for %D in ($(INSTALL_HEADERS_DIR)) do @copy %D*.h $(BUILD_DIR_DEV)\\include\\%D /y >nul");
+       if (MODE_PHPIZE) {
+               MF.WriteBlankLines(1);
+               MF.WriteLine("build-bins:");
+               for (var i in extensions_enabled) {
+                       var lib = "php_" + extensions_enabled[i][0] + ".lib";
+                       var dll = "php_" + extensions_enabled[i][0] + ".dll";
+                       MF.WriteLine("  @copy $(BUILD_DIR)\\" + lib + " $(BUILD_DIR_DEV)\\lib");
+                       MF.WriteLine("  @copy $(BUILD_DIR)\\" + dll + " $(PHP_PREFIX)");
+               }
+       } else {
+               MF.WriteBlankLines(1);
+               MF.WriteLine("build-ext-libs:");
+               MF.WriteLine("  @if not exist $(BUILD_DIR_DEV)\\lib mkdir $(BUILD_DIR_DEV)\\lib >nul");
+               for (var i in extensions_enabled) {
+                       var lib;
+
+                       lib = "php_" + extensions_enabled[i][0] + "*.lib";
+
+                       if ('shared' == extensions_enabled[i][1]) {
+                               MF.WriteLine("  @if exist $(BUILD_DIR)\\" + lib + " copy $(BUILD_DIR)\\" + lib + " $(BUILD_DIR_DEV)\\lib");
+                       }
+               }
+       }
+       TF.Close();
+
+       MF.WriteBlankLines(2);
+
+       MFO.Close();
+       TF = FSO.OpenTextFile("Makefile.objects", 1);
+       if (!TF.AtEndOfStream) {
+               MF.Write(TF.ReadAll());
+       }
+       TF.Close();
+
+       MF.Close();     
+}
+
+function ADD_FLAG(name, flags, target)
+{
+       if (target != null) {
+               name = target.toUpperCase() + "_" + name;
+       }
+       if (configure_subst.Exists(name)) {
+               var curr_flags = configure_subst.Item(name);
+
+               if (curr_flags.indexOf(flags) >= 0) {
+                       return;
+               }
+               
+               flags = curr_flags + " " + flags;
+               configure_subst.Remove(name);
+       }
+       configure_subst.Add(name, flags);
+}
+
+function get_define(name)
+{
+       if (configure_subst.Exists(name)) {
+               return configure_subst.Item(name);
+       }
+       return "";
+}
+
+// Add a .def to the core to export symbols
+function ADD_DEF_FILE(name)
+{
+       if (!configure_subst.Exists("PHPDEF")) {
+               DEFINE("PHPDEF", "$(BUILD_DIR)\\$(PHPDLL).def");
+               ADD_FLAG("PHP_LDFLAGS", "/def:$(PHPDEF)");
+       }
+       ADD_FLAG("PHP_DLL_DEF_SOURCES", name);
+}
+
+function AC_DEFINE(name, value, comment, quote)
+{
+       if (quote == null) {
+               quote = true;
+       }
+       if (quote && typeof(value) == "string") {
+               value = '"' + value.replace(new RegExp('(["\\\\])', "g"), '\\$1') + '"';
+       } else if (typeof(value) != "undefined" && value.length == 0) {
+               value = '""';
+       }
+       var item = new Array(value, comment);
+       if (configure_hdr.Exists(name)) {
+               var orig_item = configure_hdr.Item(name);
+               STDOUT.WriteLine("AC_DEFINE[" + name + "]=" + value + ": is already defined to " + orig_item[0]);
+       } else {
+               configure_hdr.Add(name, item);
+       }
+}
+
+function MESSAGE(msg)
+{
+       STDOUT.WriteLine("" + msg);
+}
+
+function ERROR(msg)
+{
+       STDERR.WriteLine("ERROR: " + msg);
+       WScript.Quit(3);
+}
+
+function WARNING(msg)
+{
+       STDERR.WriteLine("WARNING: " + msg);
+       STDERR.WriteBlankLines(1);
+}
+
+function copy_and_subst(srcname, destname, subst_array)
+{
+       if (!FSO.FileExists(srcname)) {
+               srcname = configure_module_dirname + "\\" + srcname;
+               destname = configure_module_dirname + "\\" + destname;
+       }
+
+       var content = file_get_contents(srcname);
+       var i;
+
+       for (i = 0; i < subst_array.length; i+=2) {
+               var re = subst_array[i];
+               var rep = subst_array[i+1];
+
+               content = content.replace(re, rep);
+       }
+       
+       var f = FSO.CreateTextFile(destname, true);
+       f.Write(content);
+       f.Close();
+}
+
+// glob using simple filename wildcards
+// returns an array of matches that are found
+// in the filesystem
+function glob(path_pattern)
+{
+       var path_parts = path_pattern.replace(new RegExp("/", "g"), "\\").split("\\");
+       var p;
+       var base = "";
+       var is_pat_re = /\*/;
+
+//STDOUT.WriteLine("glob: " + path_pattern);
+
+       if (FSO.FileExists(path_pattern)) {
+               return new Array(path_pattern);
+       }
+       
+       // first, build as much as possible that doesn't have a pattern
+       for (p = 0; p < path_parts.length; p++) {
+               if (path_parts[p].match(is_pat_re))
+                       break;
+               if (p)
+                       base += "\\";
+               base += path_parts[p];  
+       }
+
+       return _inner_glob(base, p, path_parts);
+}
+
+function _inner_glob(base, p, parts)
+{
+       var pat = parts[p];
+       var full_name = base + "\\" + pat;
+       var re = null;
+       var items = null;
+
+       if (p == parts.length) {
+               return false;
+       }
+
+//STDOUT.WriteLine("inner: base=" + base + " p=" + p + " pat=" + pat);
+
+       if (FSO.FileExists(full_name)) {
+               if (p < parts.length - 1) {
+                       // we didn't reach the full extent of the pattern
+                       return false;
+               }
+               return new Array(full_name);
+       }
+
+       if (FSO.FolderExists(full_name) && p == parts.length - 1) {
+               // we have reached the end of the pattern; no need to recurse
+               return new Array(full_name);
+       }
+
+       // Convert the pattern into a regexp
+       re = new RegExp("^" + pat.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\?/g, '.') + "$", "i");
+
+       items = new Array();
+
+       if (!FSO.FolderExists(base)) {
+               return false;
+       }
+
+       var folder = FSO.GetFolder(base);
+       var fc = null;
+       var subitems = null;
+       var item_name = null;
+       var j;
+
+       fc = new Enumerator(folder.SubFolders);
+       for (; !fc.atEnd(); fc.moveNext()) {
+               item_name = FSO.GetFileName(fc.item());
+
+               if (item_name.match(re)) {
+                       // got a match; if we are at the end of the pattern, just add these
+                       // things to the items array
+                       if (p == parts.length - 1) {
+                               items[items.length] = fc.item();
+                       } else {
+                               // we should recurse and do more matches
+                               subitems = _inner_glob(base + "\\" + item_name, p + 1, parts);
+                               if (subitems) {
+                                       for (j = 0; j < subitems.length; j++) {
+                                               items[items.length] = subitems[j];
+                                       }
+                               }
+                       }
+               }
+       }
+
+       // if we are at the end of the pattern, we should match
+       // files too
+       if (p == parts.length - 1) {
+               fc = new Enumerator(folder.Files);
+               for (; !fc.atEnd(); fc.moveNext()) {
+                       item_name = FSO.GetFileName(fc.item());
+                       if (item_name.match(re)) {
+                               items[items.length] = fc.item();
+                       }
+               }
+       }
+
+       if (items.length == 0)
+               return false;
+
+       return items;
+}
+
+function PHP_INSTALL_HEADERS(dir, headers_list)
+{
+       headers_list = headers_list.split(new RegExp("\\s+"));
+       headers_list.sort();
+       if (dir.length > 0 && dir.substr(dir.length - 1) != '/' && dir.substr(dir.length - 1) != '\\') {
+               dir += '/';
+       }
+       dir = dir.replace(new RegExp("/", "g"), "\\");
+
+       for (i in headers_list) {
+               found = false;
+               src = headers_list[i];
+               src = src.replace(new RegExp("/", "g"), "\\");
+               isdir = FSO.FolderExists(dir + src);
+               isfile = FSO.FileExists(dir + src);
+               if (isdir) {
+                       if (src.length > 0 && src.substr(src.length - 1) != '/' && src.substr(src.length - 1) != '\\') {
+                               src += '\\';
+                       }
+                       headers_install[headers_install.length] = [dir + src, 'dir',''];
+                       ADD_FLAG("INSTALL_HEADERS_DIR", dir + src);
+                       found = true;
+               } else if (isfile) {
+                       dirname = FSO.GetParentFolderName(dir + src);
+                       headers_install[headers_install.length] = [dir + src, 'file', dirname];
+                       ADD_FLAG("INSTALL_HEADERS", dir + src);
+                       found = true;
+               } else {
+                       path =  configure_module_dirname + "\\"+ src;
+                       isdir = FSO.FolderExists(path);
+                       isfile = FSO.FileExists(path);
+                       if (isdir) {
+                               if (src.length > 0 && src.substr(src.length - 1) != '/' && src.substr(src.length - 1) != '\\') {
+                                       src += '\\';
+                               }
+                               headers_install[headers_install.length] = [path, 'dir',''];
+                               ADD_FLAG("INSTALL_HEADERS_DIR", path);
+                       } else if (isfile) {
+                               dirname = FSO.GetParentFolderName(path);
+                               headers_install[headers_install.length] = [path, 'file', dir];
+                               ADD_FLAG("INSTALL_HEADERS", dir + src);
+                               found = true;
+                       }
+               }
+
+               if (found == false) {
+                       STDOUT.WriteLine(headers_list);
+                       ERROR("Cannot find header " + dir + src);
+               }
+       }
+}
+
+// for snapshot builders, this option will attempt to enable everything
+// and you can then build everything, ignoring fatal errors within a module
+// by running "nmake snap"
+PHP_SNAPSHOT_BUILD = "no";
+if (!MODE_PHPIZE) {
+       ARG_ENABLE('snapshot-build', 'Build a snapshot; turns on everything it can and ignores build errors', 'no');
+
+       // one-shot build optimizes build by asking compiler to build
+       // several objects at once, reducing overhead of starting new
+       // compiler processes.
+       ARG_ENABLE('one-shot', 'Optimize for fast build - best for release and snapshot builders, not so hot for edit-and-rebuild hacking', 'no');
+}
+
+function toolset_get_compiler()
+{
+       if (VS_TOOLSET) {
+               return PATH_PROG('cl', null, 'PHP_CL')
+       } else if (CLANG_TOOLSET) {
+               return PATH_PROG('clang-cl', null, 'PHP_CL')
+       } else if (INTEL_TOOLSET) {
+               return PATH_PROG('icl', null, 'PHP_CL')
+       }
+
+       ERROR("Wrong toolset");
+}
+
+function toolset_get_compiler_version()
+{
+       var version;
+
+       if (VS_TOOLSET) {
+               version = probe_binary(PHP_CL).substr(0, 5).replace('.', '');
+
+               return version;
+       } else if (CLANG_TOOLSET) {
+               var command = 'cmd /c ""' + PHP_CL + '" -v"';
+               var full = execute(command + '" 2>&1"');
+
+               if (full.match(/clang version ([\d\.]+) \((.*)\)/)) {
+                       version = RegExp.$1;
+                       version = version.replace(/\./g, '');
+                       version = version/100 < 1 ? version*10 : version;
+
+                       return version;
+               }
+       } else if (INTEL_TOOLSET) {
+               var command = 'cmd /c ""' + PHP_CL + '" -v"';
+               var full = execute(command + '" 2>&1"');
+
+               if (full.match(/Version (\d\.\d\.\d)/)) {
+                       version = RegExp.$1;
+                       version = version.replace(/\./g, '');
+                       version = version/100 < 1 ? version*10 : version;
+
+                       return version;
+               }
+       }
+
+       ERROR("Wrong toolset");
+}
+
+function toolset_get_compiler_name()
+{
+       var version;
+
+       if (VS_TOOLSET) {
+               version = probe_binary(PHP_CL).substr(0, 5).replace('.', '');
+               return VC_VERSIONS[version];
+       } else if (CLANG_TOOLSET || INTEL_TOOLSET) {
+               var command = 'cmd /c ""' + PHP_CL + '" -v"';
+               var full = execute(command + '" 2>&1"');
+
+               return full.split(/\n/)[0].replace(/\s/g, ' ');
+       }
+
+       ERROR("Wrong toolset");
+}
+
+
+function toolset_is_64()
+{
+       if (VS_TOOLSET) {
+               return probe_binary(PHP_CL, 64, null, 'PHP_CL');
+       } else if (CLANG_TOOLSET) {
+               /* Seems to be impossible to get it from the clang binary, so lets use the normal cl.exe,
+               as clang should be running in VS environment. */
+               var vs_cl = PATH_PROG('cl', null, 'PHP_CL')
+               return probe_binary(vs_cl, 64);
+       } else if (INTEL_TOOLSET) {
+
+       }
+
+       ERROR("Wrong toolset");
+}
+
+
+function toolset_get_linker()
+{
+       if (VS_TOOLSET) {
+               return PATH_PROG('link', WshShell.Environment("Process").Item("PATH"));
+       } else if (CLANG_TOOLSET) {
+               //return PATH_PROG('lld', WshShell.Environment("Process").Item("PATH"), "LINK");
+               return PATH_PROG('link', WshShell.Environment("Process").Item("PATH"));
+       } else if (INTEL_TOOLSET) {
+               return PATH_PROG('xilink', WshShell.Environment("Process").Item("PATH"), "LINK");
+       }
+
+       ERROR("Wrong toolset");
+}
+
+