File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / win32 / build / buildconf.js
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:48:06 2012 UTC (13 years, 1 month ago) by misho
Branches: php, MAIN
CVS tags: v5_4_3elwix, v5_4_29p0, v5_4_29, v5_4_20p0, v5_4_20, v5_4_17p0, v5_4_17, v5_3_10, HEAD
php

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