Annotation of embedaddon/php/win32/build/confutils.js, revision 1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>