Annotation of embedaddon/php/win32/build/buildconf.js, revision 1.1.1.1

1.1       misho       1: /*
                      2:   +----------------------------------------------------------------------+
                      3:   | PHP Version 5                                                        |
                      4:   +----------------------------------------------------------------------+
                      5:   | Copyright (c) 1997-2008 The PHP Group                                |
                      6:   +----------------------------------------------------------------------+
                      7:   | This source file is subject to version 3.01 of the PHP license,      |
                      8:   | that is bundled with this package in the file LICENSE, and is        |
                      9:   | available through the world-wide-web at the following url:           |
                     10:   | http://www.php.net/license/3_01.txt                                  |
                     11:   | If you did not receive a copy of the PHP license and are unable to   |
                     12:   | obtain it through the world-wide-web, please send a note to          |
                     13:   | license@php.net so we can mail you a copy immediately.               |
                     14:   +----------------------------------------------------------------------+
                     15:   | Author: Wez Furlong <wez@thebrainroom.com>                           |
                     16:   +----------------------------------------------------------------------+
                     17: */
                     18: 
                     19: /* $Id: buildconf.js,v 1.13.2.2.2.1.2.5 2009-01-02 12:18:21 kalle Exp $ */
                     20: // This generates a configure script for win32 build
                     21: 
                     22: WScript.StdOut.WriteLine("Rebuilding configure.js");
                     23: var FSO = WScript.CreateObject("Scripting.FileSystemObject");
                     24: var C = FSO.CreateTextFile("configure.js", true);
                     25: var B = FSO.CreateTextFile("configure.bat", true);
                     26: var DSP = false;
                     27: 
                     28: var modules = "";
                     29: var MODULES = WScript.CreateObject("Scripting.Dictionary");
                     30: var module_dirs = new Array();
                     31: 
                     32: function file_get_contents(filename)
                     33: {
                     34:        var F = FSO.OpenTextFile(filename, 1);
                     35:        var t = F.ReadAll();
                     36:        F.Close();
                     37:        return t;
                     38: }
                     39: 
                     40: function Module_Item(module_name, config_path, dir_line, deps, content)
                     41: {
                     42:        this.module_name = module_name;
                     43:        this.config_path = config_path;
                     44:        this.dir_line = dir_line;
                     45:        this.deps = deps;
                     46:        this.content = content;
                     47: }
                     48: 
                     49: function find_config_w32(dirname)
                     50: {
                     51:        if (!FSO.FolderExists(dirname)) {
                     52:                return;
                     53:        }
                     54: 
                     55:        var f = FSO.GetFolder(dirname);
                     56:        var     fc = new Enumerator(f.SubFolders);
                     57:        var c, i, ok, n;
                     58:        var item = null;
                     59:        var re_dep_line = new RegExp("ADD_EXTENSION_DEP\\([^,]*\\s*,\\s*['\"]([^'\"]+)['\"].*\\)", "gm");
                     60:        
                     61:        for (; !fc.atEnd(); fc.moveNext())
                     62:        {
                     63:                ok = true;
                     64:                /* check if we already picked up a module with the same dirname;
                     65:                 * if we have, don't include it here */
                     66:                n = FSO.GetFileName(fc.item());
                     67:                
                     68:                if (n == '.svn' || n == 'tests')
                     69:                        continue;
                     70:                        
                     71:        //      WScript.StdOut.WriteLine("checking " + dirname + "/" + n);
                     72:                if (MODULES.Exists(n)) {
                     73:                        WScript.StdOut.WriteLine("Skipping " + dirname + "/" + n + " -- already have a module with that name");
                     74:                        continue;
                     75:                }
                     76: 
                     77:                c = FSO.BuildPath(fc.item(), "config.w32");
                     78:                if (FSO.FileExists(c)) {
                     79: //                     WScript.StdOut.WriteLine(c);
                     80: 
                     81:                        var dir_line = "configure_module_dirname = condense_path(FSO.GetParentFolderName('"
                     82:                                                                + c.replace(new RegExp('(["\\\\])', "g"), '\\$1') + "'));\r\n";
                     83:                        var contents = file_get_contents(c);
                     84:                        var deps = new Array();
                     85: 
                     86:                        // parse out any deps from the file
                     87:                        var calls = contents.match(re_dep_line);
                     88:                        if (calls != null) {
                     89:                                for (i = 0; i < calls.length; i++) {
                     90:                                        // now we need the extension name out of this thing
                     91:                                        if (calls[i].match(re_dep_line)) {
                     92: //                                             WScript.StdOut.WriteLine("n depends on " + RegExp.$1);
                     93:                                                deps[deps.length] = RegExp.$1;
                     94: 
                     95:                                        }
                     96:                                }
                     97:                        }
                     98: 
                     99:                        item = new Module_Item(n, c, dir_line, deps, contents);
                    100:                        MODULES.Add(n, item);
                    101:                }
                    102:        }
                    103: }
                    104: 
                    105: // Emit core modules array.  This is used by a snapshot
                    106: // build to override a default "yes" value so that external
                    107: // modules don't break the build by becoming statically compiled
                    108: function emit_core_module_list()
                    109: {
                    110:        var module_names = (new VBArray(MODULES.Keys())).toArray();
                    111:        var i, mod_name, j;
                    112:        var item;
                    113:        var output = "";
                    114: 
                    115:        C.WriteLine("core_module_list = new Array(");
                    116: 
                    117:        // first, look for modules with empty deps; emit those first
                    118:        for (i in module_names) {
                    119:                mod_name = module_names[i];
                    120:                C.WriteLine("\"" + mod_name.replace(/_/g, "-") + "\",");
                    121:        }
                    122: 
                    123:        C.WriteLine("false // dummy");
                    124: 
                    125:        C.WriteLine(");");
                    126: }
                    127: 
                    128: 
                    129: function emit_module(item)
                    130: {
                    131:        return item.dir_line + item.content;
                    132: }
                    133: 
                    134: function emit_dep_modules(module_names)
                    135: {
                    136:        var i, mod_name, j;
                    137:        var output = "";
                    138:        var item = null;
                    139: 
                    140:        for (i in module_names) {
                    141:                mod_name = module_names[i];
                    142: 
                    143:                if (MODULES.Exists(mod_name)) {
                    144:                        item = MODULES.Item(mod_name);
                    145:                        MODULES.Remove(mod_name);
                    146:                        if (item.deps.length) {
                    147:                                output += emit_dep_modules(item.deps);
                    148:                        }
                    149:                        output += emit_module(item);
                    150:                }
                    151:        }
                    152: 
                    153:        return output;
                    154: }
                    155: 
                    156: function gen_modules()
                    157: {
                    158:        var module_names = (new VBArray(MODULES.Keys())).toArray();
                    159:        var i, mod_name, j;
                    160:        var item;
                    161:        var output = "";
                    162: 
                    163:        // first, look for modules with empty deps; emit those first
                    164:        for (i in module_names) {
                    165:                mod_name = module_names[i];
                    166:                item = MODULES.Item(mod_name);
                    167:                if (item.deps.length == 0) {
                    168:                        MODULES.Remove(mod_name);
                    169:                        output += emit_module(item);
                    170:                }
                    171:        }
                    172: 
                    173:        // now we are left with modules that have dependencies on other modules
                    174:        module_names = (new VBArray(MODULES.Keys())).toArray();
                    175:        output += emit_dep_modules(module_names);
                    176: 
                    177:        return output;
                    178: }
                    179: 
                    180: // Process buildconf arguments
                    181: function buildconf_process_args()
                    182: {
                    183:        args = WScript.Arguments;
                    184: 
                    185:        for (i = 0; i < args.length; i++) {
                    186:                arg = args(i);
                    187:                // If it is --foo=bar, split on the equals sign
                    188:                arg = arg.split("=", 2);
                    189:                argname = arg[0];
                    190:                if (arg.length > 1) {
                    191:                        argval = arg[1];
                    192:                } else {
                    193:                        argval = null;
                    194:                }
                    195: 
                    196:                if (argname == '--add-modules-dir' && argval != null) {
                    197:                        WScript.StdOut.WriteLine("Adding " + argval + " to the module search path");
                    198:                        module_dirs[module_dirs.length] = argval;
                    199:                }
                    200: 
                    201:                if (argname == '--add-project-files') {
                    202:                        WScript.StdOut.WriteLine("Adding dsp templates into the mix");
                    203:                        DSP = true;
                    204:                }
                    205:        }
                    206: }
                    207: 
                    208: buildconf_process_args();
                    209: 
                    210: // Write the head of the configure script
                    211: C.WriteLine("/* This file automatically generated from win32/build/confutils.js */");
                    212: C.WriteLine("MODE_PHPIZE=false;");
                    213: C.Write(file_get_contents("win32/build/confutils.js"));
                    214: 
                    215: // If project files were requested, pull in the code to generate them
                    216: if (DSP == true) {
                    217:        C.WriteLine('PHP_DSP="yes"');
                    218:        C.WriteBlankLines(1);
                    219:        C.Write(file_get_contents("win32/build/projectgen.js"));
                    220: } else {
                    221:        C.WriteLine('PHP_DSP="no"');
                    222:        C.WriteBlankLines(1);
                    223: }
                    224: 
                    225: // Pull in code from sapi and extensions
                    226: modules = file_get_contents("win32/build/config.w32");
                    227: 
                    228: // Pick up confs from TSRM and Zend if present
                    229: find_config_w32(".");
                    230: find_config_w32("sapi");
                    231: find_config_w32("ext");
                    232: emit_core_module_list();
                    233: 
                    234: // If we have not specified any module dirs let's add some defaults
                    235: if (module_dirs.length == 0) {
                    236:        find_config_w32("pecl");
                    237:        find_config_w32("..\\pecl");
                    238:        find_config_w32("pecl\\rpc");
                    239:        find_config_w32("..\\pecl\\rpc");
                    240: } else {
                    241:        for (i = 0; i < module_dirs.length; i++) {
                    242:                find_config_w32(module_dirs[i]);
                    243:        }
                    244: }
                    245: 
                    246: // Now generate contents of module based on MODULES, chasing dependencies
                    247: // to ensure that dependent modules are emitted first
                    248: modules += gen_modules();
                    249: 
                    250: // Look for ARG_ENABLE or ARG_WITH calls
                    251: re = new RegExp("(ARG_(ENABLE|WITH)\([^;]+\);)", "gm");
                    252: calls = modules.match(re);
                    253: for (i = 0; i < calls.length; i++) {
                    254:        item = calls[i];
                    255:        C.WriteLine("try {");
                    256:        C.WriteLine(item);
                    257:        C.WriteLine("} catch (e) {");
                    258:        C.WriteLine('\tSTDOUT.WriteLine("problem: " + e);');
                    259:        C.WriteLine("}");
                    260: }
                    261: 
                    262: C.WriteBlankLines(1);
                    263: C.WriteLine("conf_process_args();");
                    264: C.WriteBlankLines(1);
                    265: 
                    266: // Comment out the calls from their original positions
                    267: modules = modules.replace(re, "/* $1 */");
                    268: C.Write(modules);
                    269: 
                    270: C.WriteBlankLines(1);
                    271: C.Write(file_get_contents("win32/build/configure.tail"));
                    272: 
                    273: B.WriteLine("@echo off");
                    274: B.WriteLine("cscript /nologo configure.js %*");

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