- add phpize support for windows, need a nmake install for now (nmake devel-pkg version is coming), works exactly the same as on unix, or should :)

This commit is contained in:
Pierre Joye 2010-12-13 18:43:10 +00:00
parent 4ee6b4dfbb
commit aea6771d19
30 changed files with 876 additions and 50 deletions

View File

@ -7,6 +7,8 @@ AC_DEFINE('HAVE_DATE', 1, 'Have date/time support');
ADD_FLAG('CFLAGS_DATE', "/wd4244");
PHP_INSTALL_HEADERS("ext/date/", "php_date.h lib/timelib.h lib/timelib_structs.h lib/timelib_config.h");
var tl_config = FSO.CreateTextFile("ext/date/lib/timelib_config.h", true);
tl_config.WriteLine("#include \"config.w32.h\"");
tl_config.Close();

View File

@ -19,6 +19,7 @@ if (PHP_DOM == "yes") {
if (!PHP_DOM_SHARED) {
ADD_FLAG("CFLAGS_DOM", "/D LIBXML_STATIC ");
}
PHP_INSTALL_HEADERS("ext/dom", "xml_common.h");
} else {
WARNING("dom support can't be enabled, libxml is not enabled")
PHP_DOM = "no"

View File

@ -8,4 +8,5 @@ if (PHP_EREG != "no") {
ADD_SOURCES("ext/ereg/regex", "regcomp.c regexec.c regerror.c regfree.c", "ereg");
AC_DEFINE('REGEX', 1, 'Bundled regex');
AC_DEFINE('HSREGEX', 1, 'Bundled regex');
}
PHP_INSTALL_HEADERS("ext/ereg", "php_ereg.h php_regex.h regex/");
}

View File

@ -5,4 +5,5 @@ ARG_ENABLE("filter", "Filter Support", "yes");
if (PHP_FILTER == "yes") {
EXTENSION("filter", "filter.c sanitizing_filters.c logical_filters.c callback_filter.c");
PHP_INSTALL_HEADERS("ext/filter", "php_filter.h");
}

View File

@ -66,6 +66,8 @@ if (PHP_GD != "no") {
/D USE_GD_IOCTX \
/D MSWIN32 \
");
PHP_INSTALL_HEADERS("", "ext/gd ext/gd/libgd" );
} else {
WARNING("gd not enabled; libraries and headers not found");
}

View File

@ -15,6 +15,11 @@ if (PHP_HASH != "no") {
AC_DEFINE('HAVE_HASH_EXT', 1);
EXTENSION("hash", "hash.c hash_md.c hash_sha.c hash_ripemd.c hash_haval.c "
+ "hash_tiger.c hash_gost.c hash_snefru.c hash_whirlpool.c "
+ "hash_adler32.c hash_crc32.c hash_salsa.c");
+ "hash_adler32.c hash_crc32.c hash_salsa.c hash_joaat.c hash_fnv.c");
PHP_INSTALL_HEADERS("ext/hash/", "php_hash.h php_hash_md.h php_hash_sha.h php_hash_ripemd.h " +
"php_hash_haval.h php_hash_tiger.h php_hash_gost.h php_hash_snefru.h " +
"php_hash_whirlpool.h php_hash_adler32.h php_hash_crc32.h php_hash_salsa.h " +
"php_hash_types.h");
}

View File

@ -19,6 +19,7 @@ if (PHP_ICONV != "no") {
if (!PHP_ICONV_SHARED) {
ADD_DEF_FILE("ext\\iconv\\php_iconv.def");
}
PHP_INSTALL_HEADERS("", "ext/iconv");
} else {
WARNING("iconv support can't be enabled, libraries or headers are missing")
PHP_ICONV = "no";

View File

@ -15,6 +15,7 @@ if (PHP_LIBXML == "yes") {
if (!PHP_LIBXML_SHARED) {
ADD_DEF_FILE("ext\\libxml\\php_libxml2.def");
}
PHP_INSTALL_HEADERS("ext/libxml/", "php_libxml.h");
} else {
WARNING("libxml support can't be enabled, iconv or libxml are missing")
PHP_LIBXML = "no"

View File

@ -54,6 +54,8 @@ if (PHP_MBSTRING != "no") {
AC_DEFINE('HAVE_MBSTR_RU', 1, 'RU');
AC_DEFINE('HAVE_MBSTR_TW', 1, 'TW');
PHP_INSTALL_HEADERS("ext/mbstring", "mbstring.h oniguruma/oniguruma.h php_mbregex.h php_onig_compat.h libmbfl/config.h libmbfl/mbfl/eaw_table.h libmbfl/mbfl/mbfilter.h libmbfl/mbfl/mbfilter_8bit.h libmbfl/mbfl/mbfilter_pass.h libmbfl/mbfl/mbfilter_wchar.h libmbfl/mbfl/mbfl_allocators.h libmbfl/mbfl/mbfl_consts.h libmbfl/mbfl/mbfl_convert.h libmbfl/mbfl/mbfl_defs.h libmbfl/mbfl/mbfl_encoding.h libmbfl/mbfl/mbfl_filter_output.h libmbfl/mbfl/mbfl_ident.h libmbfl/mbfl/mbfl_language.h libmbfl/mbfl/mbfl_memory_device.h libmbfl/mbfl/mbfl_string.h");
if (PHP_MBREGEX != "no") {
AC_DEFINE('HAVE_STDARG_PROTOTYPES', 1, 'have stdarg.h');
AC_DEFINE('HAVE_MBREGEX', 1);
@ -72,5 +74,6 @@ if (PHP_MBSTRING != "no") {
koi8.c koi8_r.c sjis.c utf8.c unicode.c utf16_be.c utf16_le.c \
utf32_be.c utf32_le.c gb18030.c", "mbstring");
ADD_SOURCES("ext/mbstring", "php_mbregex.c", "mbstring");
PHP_INSTALL_HEADERS("ext/mbstring", "php_mbregex.h");
}
}

View File

@ -27,6 +27,7 @@ if (PHP_MYSQLI != "no") {
AC_DEFINE('HAVE_MYSQLILIB', 1, 'Have MySQLi library');
ADD_EXTENSION_DEP('mysqli', 'mysqlnd', true);
MESSAGE("\tmysqlnd build");
PHP_INSTALL_HEADERS("ext/mysqli", "php_mysqli_structs.h");
} else {
if (CHECK_LIB("libmysql.lib", "mysqli", PHP_MYSQLI) &&
CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_MYSQLI", PHP_MYSQLI +
@ -35,6 +36,7 @@ if (PHP_MYSQLI != "no") {
EXTENSION("mysqli", mysqli_source);
AC_DEFINE('HAVE_MYSQLILIB', 1, 'Have MySQLi library');
MESSAGE("\tlibmysql build");
PHP_INSTALL_HEADERS("ext/mysqli", "php_mysqli_structs.h");
} else {
WARNING("mysqli not enabled; libraries and headers not found");
PHP_MYSQLI = "no"

View File

@ -25,5 +25,6 @@ if (PHP_MYSQLND != "no") {
{
AC_DEFINE("MYSQLND_COMPRESSION_ENABLED", 1, "Compression support");
}
PHP_INSTALL_HEADERS("", "ext/mysqlnd");
}
}

View File

@ -9,3 +9,4 @@ ADD_DEF_FILE("ext\\pcre\\php_pcre.def");
AC_DEFINE('HAVE_BUNDLED_PCRE', 1, 'Using bundled PCRE library');
AC_DEFINE('HAVE_PCRE', 1, 'Have PCRE library');
PHP_PCRE="yes";
PHP_INSTALL_HEADERS("ext/pcre", "php_pcre.h pcrelib/");

View File

@ -6,4 +6,5 @@ ARG_ENABLE("pdo", "Enable PHP Data Objects support", "no");
if (PHP_PDO != "no") {
EXTENSION('pdo', 'pdo.c pdo_dbh.c pdo_stmt.c pdo_sql_parser.c pdo_sqlstate.c', false /* force static, PHP_PDO_SHARED is broken yet somehow */);
ADD_EXTENSION_DEP('pdo', 'spl', true);
PHP_INSTALL_HEADERS("ext/pdo", "php_pdo.h php_pdo_driver.h");
}

View File

@ -6,4 +6,5 @@ ARG_ENABLE("session", "session support", "yes");
if (PHP_SESSION == "yes") {
EXTENSION("session", "session.c mod_files.c mod_mm.c mod_user.c", false /* never shared */);
AC_DEFINE("HAVE_PHP_SESSION", 1, "Session support");
PHP_INSTALL_HEADERS("ext/session/", "mod_mm.h");
}

View File

@ -8,6 +8,7 @@ if (PHP_SOCKETS != "no") {
&& CHECK_HEADER_ADD_INCLUDE("winsock.h", "CFLAGS_SOCKETS")) {
EXTENSION('sockets', 'sockets.c');
AC_DEFINE('HAVE_SOCKETS', 1);
PHP_INSTALL_HEADERS("ext/sockets", "php_sockets.h");
} else {
WARNING("sockets not enabled; libraries and headers not found");
}

View File

@ -4,3 +4,4 @@
EXTENSION("spl", "php_spl.c spl_functions.c spl_engine.c spl_iterators.c spl_array.c spl_directory.c spl_exceptions.c spl_observer.c spl_dllist.c spl_heap.c spl_fixedarray.c", false /*never shared */);
AC_DEFINE('HAVE_SPL', 1);
PHP_SPL="yes";
PHP_INSTALL_HEADERS("ext/spl", "php_spl.h spl_array.h spl_directory.h spl_engine.h spl_exceptions.h spl_functions.h spl_iterators.h spl_observer.h spl_dllist.h spl_heap.h spl_fixedarray.h");

View File

@ -10,4 +10,5 @@ if (PHP_SQLITE3 != "no") {
ADD_SOURCES(configure_module_dirname + "/libsqlite", "sqlite3.c", "sqlite3");
AC_DEFINE("HAVE_SQLITE3", 1, "SQLite support");
PHP_INSTALL_HEADERS("ext/sqlite3", "libsqlite/sqlite3.h");
}

View File

@ -21,7 +21,8 @@ EXTENSION("standard", "array.c base64.c basic_functions.c browscap.c \
php_fopen_wrapper.c credits.c css.c var_unserializer.c ftok.c sha1.c \
user_filters.c uuencode.c filters.c proc_open.c \
streamsfuncs.c http.c flock_compat.c", false /* never shared */);
PHP_INSTALL_HEADERS("", "ext/standard");
if (PHP_MBREGEX != "no") {
CHECK_HEADER_ADD_INCLUDE("oniguruma.h", "CFLAGS_STANDARD", PHP_MBREGEX + ";ext\\mbstring\\oniguruma")
}
PHP_INSTALL_HEADERS("", "ext/standard");

View File

@ -11,6 +11,7 @@ if (PHP_XML == "yes") {
if (!PHP_XML_SHARED) {
ADD_FLAG("CFLAGS_XML", "/D LIBXML_STATIC ");
}
PHP_INSTALL_HEADERS("", "ext/xml");
} else {
WARNING("xml support can't be enabled, libraries or headers are missing")
PHP_ZLIB = "no"

View File

@ -735,8 +735,6 @@ static const zend_function_entry zip_functions[] = {
static zend_class_entry *zip_class_entry;
static zend_object_handlers zip_object_handlers;
static HashTable zip_prop_handlers;
typedef int (*zip_read_int_t)(struct zip *za TSRMLS_DC);
typedef char *(*zip_read_const_char_t)(struct zip *za, int *len TSRMLS_DC);
typedef char *(*zip_read_const_char_from_ze_t)(ze_zip_object *obj TSRMLS_DC);

View File

@ -152,7 +152,23 @@ msi-installer: dist
$(BUILD_DIR)\php.exe ..\php-installer\build-installer.php "$(BUILD_DIR)" "$(PHPDLL)" "$(SAPI_TARGETS)" "$(EXT_TARGETS)" "$(PECL_TARGETS)"
# need to redirect, since INSTALL is a file in the root...
install: really-install
install: really-install install-devel install-lib
install-lib:
@if not exist $(PHP_PREFIX)\lib mkdir $(PHP_PREFIX)\lib >nul
@copy $(BUILD_DIR)\$(PHPLIB) $(PHP_PREFIX)\lib /y >nul
install-devel: install-headers
@if not exist $(PHP_PREFIX)\script mkdir $(PHP_PREFIX)\script >nul
@if not exist $(PHP_PREFIX)\build mkdir $(PHP_PREFIX)\build >nul
@copy win32\build\confutils.js $(PHP_PREFIX)\script\ /y >nul
@copy win32\build\configure.tail $(PHP_PREFIX)\script\ /y >nul
@copy win32\build\config.w32.phpize.in $(PHP_PREFIX)\script\ /y >nul
@copy win32\build\Makefile.phpize $(PHP_PREFIX)\script\ /y >nul
@copy win32\build\phpize.bat $(PHP_PREFIX)\ /y >nul
@copy win32\build\template.rc $(PHP_PREFIX)\build\ /y >nul
@copy $(BUILD_DIR)\devel\config.phpize.js $(PHP_PREFIX)\script\ /y >nul
@copy $(BUILD_DIR)\devel\phpize.js $(PHP_PREFIX)\script\ /y >nul
really-install:
@if not exist $(PHP_PREFIX) mkdir $(PHP_PREFIX)
@ -162,5 +178,3 @@ really-install:
@echo Registering event source with syslog (requires admin rights)
@echo It's okay for this step to fail:
-$(PHP_PREFIX)\php.exe -n -dextension_dir=$(PHP_PREFIX) win32/build/registersyslog.php $(PHP_PREFIX)\$(PHPDLL)

View File

@ -0,0 +1,38 @@
CC="$(PHP_CL)"
LD="$(LINK)"
MC="$(MC)"
MT="$(MT)"
PHPSDK_DIR=$(PHP_DIR)
PHPLIB=$(PHPSDK_DIR)\lib\$(PHPLIB)
LDFLAGS=/libpath:"$(PHPSDK_DIR)\lib\;$(PHPSDK_DIR)"
CFLAGS=/nologo /FD $(BASE_INCLUDES) /D _WINDOWS /D ZEND_WIN32=1 /D PHP_WIN32=1 /D WIN32 /D_USE_32BIT_TIME_T=1 /D ZEND_WIN32_FORCE_INLINE /GF /D ZEND_DEBUG=0 /D ZTS=1 /D FD_SETSIZE=256
CFLAGS_PHP=/D _USRDLL /D PHP5DLLTS_EXPORTS /D PHP_EXPORTS /D TSRM_EXPORTS /D SAPI_EXPORTS /D WINVER=0x500 /D COMPILE_DL_AJAXMIN
all: $(EXT_TARGETS) $(PECL_TARGETS)
build_dirs: $(BUILD_DIR) $(BUILD_DIRS_SUB)
clean-pecl:
@echo Cleaning PECL targets only
-rd /s /q $(BUILD_DIR)\pecl
clean-all:
@echo Cleaning standard build dirs
@for %D in (_x $(BUILD_DIRS_SUB)) do @if exist %D @rd /s /q %D
-@del /f /q $(BUILD_DIR)\*.res $(BUILD_DIR)\*.manifest $(BUILD_DIR)\*.lib $(BUILD_DIR)\*.ilk $(BUILD_DIR)\*.pdb $(BUILD_DIR)\*.exp $(PHPDEF) $(BUILD_DIR)\*.rc $(BUILD_DIR)\*.dbg $(BUILD_DIR)\*.bin $(BUILD_DIR)\php*.dll $(BUILD_DIR)\php*.exe > NUL
clean: clean-pecl
@echo Cleaning distribution build dirs
@for %D in (_x $(BUILD_DIRS_SUB)) do @if exist %D @del /F /Q %D\*.* > NUL
-@del /F /Q $(BUILD_DIR)\*.res $(BUILD_DIR)\*.lib $(BUILD_DIR)\*.ilk $(BUILD_DIR)\*.pdb $(BUILD_DIR)\*.exp $(PHPDEF) $(BUILD_DIR)\php-$(PHP_VERSION_STRING)-Win32.zip $(BUILD_DIR)\pecl-$(PHP_VERSION_STRING)-Win32.zip > NUL
!if $(MT) == ""
_VC_MANIFEST_EMBED_EXE=
_VC_MANIFEST_EMBED_DLL=
!else
_VC_MANIFEST_EMBED_EXE= if exist $@.manifest $(MT) -nologo -manifest $@.manifest -outputresource:$@;1
_VC_MANIFEST_EMBED_DLL= if exist $@.manifest $(MT) -nologo -manifest $@.manifest -outputresource:$@;2
!endif

View File

@ -209,6 +209,7 @@ buildconf_process_args();
// Write the head of the configure script
C.WriteLine("/* This file automatically generated from win32/build/confutils.js */");
C.WriteLine("MODE_PHPIZE=false;");
C.Write(file_get_contents("win32/build/confutils.js"));
// If project files were requested, pull in the code to generate them

View File

@ -102,7 +102,7 @@ if (PHP_DEBUG == "yes" && PHP_DEBUG_PACK == "yes") {
}
ARG_ENABLE('zts', 'Thread safety', 'yes');
// Configures the hard-coded installation dir
ARG_ENABLE('prefix', 'where PHP will be installed', '');
ARG_WITH('prefix', 'where PHP will be installed', '');
if (PHP_PREFIX == '') {
PHP_PREFIX = "C:\\php";
if (PHP_DEBUG == "yes")
@ -199,6 +199,9 @@ if (PHP_DEBUG == "yes") {
if (PHP_ZTS == "yes") {
ADD_FLAG("CFLAGS", "/D ZTS=1");
ADD_FLAG("ZTS", "1");
} else {
ADD_FLAG("ZTS", "0");
}
DEFINE("PHP_ZTS_ARCHIVE_POSTFIX", PHP_ZTS == "yes" ? '' : "-nts");
@ -351,6 +354,8 @@ ADD_SOURCES("main/streams", "streams.c cast.c memory.c filter.c plain_wrapper.c
ADD_SOURCES("win32", "glob.c readdir.c \
registry.c select.c sendmail.c time.c winutil.c wsyslog.c globals.c");
PHP_INSTALL_HEADERS("", "Zend/ TSRM/ main/ main/streams/ win32/");
STDOUT.WriteBlankLines(1);
/* Can we build with IPv6 support? */

View File

@ -0,0 +1,340 @@
// vim:ft=javascript
// $Id: config.w32 305923 2010-12-02 23:23:14Z pajoye $
// "Master" config file; think of it as a configure.in
// equivalent.
var PHP_CYGWIN="notset";
PHP_CL = PATH_PROG('cl', null, 'PHP_CL');
if (!PHP_CL) {
ERROR("MS C++ compiler is required");
}
/* For the record here: */
// 1200 is VC6
// 1300 is vs.net 2002
// 1310 is vs.net 2003
// 1400 is vs.net 2005
// 1500 is vs.net 2008
// 1600 is vs.net 2010
// Which version of the compiler do we have?
VCVERS = probe_binary(PHP_CL).substr(0, 5).replace('.', '');
STDOUT.WriteLine(" Detected compiler " + VC_VERSIONS[VCVERS]);
AC_DEFINE('COMPILER', VC_VERSIONS[VCVERS], "Detected compiler version");
DEFINE("PHP_COMPILER_SHORT", VC_VERSIONS_SHORT[VCVERS]);
AC_DEFINE('PHP_COMPILER_ID', VC_VERSIONS_SHORT[VCVERS], "Compiler compatibility ID");
// do we use x64 or 80x86 version of compiler?
X64 = probe_binary(PHP_CL, 64, null, 'PHP_CL');
if (X64) {
STDOUT.WriteLine(" Detected 64-bit compiler");
} else {
STDOUT.WriteLine(" Detected 32-bit compiler");
}
AC_DEFINE('ARCHITECTURE', X64 ? 'x64' : 'x86', "Detected compiler architecture");
DEFINE("PHP_ARCHITECTURE", X64 ? 'x64' : 'x86');
// cygwin now ships with link.exe. Avoid searching the cygwin path
// for this, as we want the MS linker, not the fileutil
PATH_PROG('link', WshShell.Environment("Process").Item("PATH"));
PATH_PROG('nmake');
// we don't want to define LIB, as that will override the default library path
// that is set in that env var
PATH_PROG('lib', null, 'MAKE_LIB');
if (!PATH_PROG('bison')) {
ERROR('bison is required')
}
// There's a minimum requirement for re2c..
MINRE2C = "0.13.4";
RE2C = PATH_PROG('re2c');
if (RE2C) {
var intvers, intmin;
var pattern = /\./g;
RE2CVERS = probe_binary(RE2C, "version");
STDOUT.WriteLine(' Detected re2c version ' + RE2CVERS);
intvers = RE2CVERS.replace(pattern, '') - 0;
intmin = MINRE2C.replace(pattern, '') - 0;
if (intvers < intmin) {
STDOUT.WriteLine('WARNING: The minimum RE2C version requirement is ' + MINRE2C);
STDOUT.WriteLine('Parsers will not be generated. Upgrade your copy at http://sf.net/projects/re2c');
DEFINE('RE2C', '');
} else {
DEFINE('RE2C_FLAGS', '');
}
} else {
STDOUT.WriteLine('Parsers will not be regenerated');
}
PATH_PROG('zip');
PATH_PROG('lemon');
// avoid picking up midnight commander from cygwin
PATH_PROG('mc', WshShell.Environment("Process").Item("PATH"));
// Try locating manifest tool
if (VCVERS > 1200) {
PATH_PROG('mt', WshShell.Environment("Process").Item("PATH"));
}
// stick objects somewhere outside of the source tree
ARG_ENABLE('object-out-dir', 'Alternate location for binary objects during build', '');
if (PHP_OBJECT_OUT_DIR.length) {
PHP_OBJECT_OUT_DIR = FSO.GetAbsolutePathName(PHP_OBJECT_OUT_DIR);
if (!FSO.FolderExists(PHP_OBJECT_OUT_DIR)) {
ERROR('you chosen output directory ' + PHP_OBJECT_OUT_DIR + ' does not exist');
}
PHP_OBJECT_OUT_DIR += '\\';
} else if (X64) {
if (!FSO.FolderExists("x64")) {
FSO.CreateFolder("x64");
}
PHP_OBJECT_OUT_DIR = 'x64\\';
}
ARG_ENABLE('debug', 'Compile with debugging symbols', "no");
ARG_ENABLE('debug-pack', 'Release binaries with external debug symbols (--enable-debug must not be specified)', 'no');
if (PHP_DEBUG == "yes" && PHP_DEBUG_PACK == "yes") {
ERROR("Use of both --enable-debug and --enable-debug-pack not allowed.");
}
DEFINE('PHP_PREFIX', PHP_PREFIX);
DEFINE("BASE_INCLUDES", "/I " + PHP_DIR + "/include /I " + PHP_DIR + "/include/main /I " + PHP_DIR + "/include/Zend /I " + PHP_DIR + "/include/TSRM /I " + PHP_DIR + "/include/ext ");
// CFLAGS for building the PHP dll
DEFINE("CFLAGS_PHP", "/D _USRDLL /D PHP5DLLTS_EXPORTS /D PHP_EXPORTS \
/D LIBZEND_EXPORTS /D TSRM_EXPORTS /D SAPI_EXPORTS /D WINVER=0x500");
DEFINE('CFLAGS_PHP_OBJ', '$(CFLAGS_PHP) $(STATIC_EXT_CFLAGS)');
// General CFLAGS for building objects
DEFINE("CFLAGS", "/nologo /FD $(BASE_INCLUDES) /D _WINDOWS \
/D ZEND_WIN32=1 /D PHP_WIN32=1 /D WIN32 /D _MBCS /W3 ");
if (VCVERS < 1400) {
// Enable automatic precompiled headers
ADD_FLAG('CFLAGS', ' /YX ');
if (PHP_DEBUG == "yes") {
// Set some debug/release specific options
ADD_FLAG('CFLAGS', ' /GZ ');
}
}
if (VCVERS >= 1400) {
// fun stuff: MS deprecated ANSI stdio and similar functions
// disable annoying warnings. In addition, time_t defaults
// to 64-bit. Ask for 32-bit.
if (X64) {
ADD_FLAG('CFLAGS', ' /wd4996 /Wp64 ');
} else {
ADD_FLAG('CFLAGS', ' /wd4996 /D_USE_32BIT_TIME_T=1 ');
}
if (PHP_DEBUG == "yes") {
// Set some debug/release specific options
ADD_FLAG('CFLAGS', ' /RTC1 ');
}
}
ARG_WITH('prefix', 'PHP installation prefix', '');
ARG_WITH('mp', 'Tell VC9+ use up to [n,auto,disable] processes for compilation', 'auto');
if (VCVERS >= 1500 && PHP_MP != 'disable') {
// no from disable-all
if(PHP_MP == 'auto' || PHP_MP == 'no') {
ADD_FLAG('CFLAGS', ' /MP ');
} else {
if(parseInt(PHP_MP) != 0) {
ADD_FLAG('CFLAGS', ' /MP'+ PHP_MP +' ');
} else {
STDOUT.WriteLine('WARNING: Invalid argument for MP: ' + PHP_MP);
}
}
}
/* For snapshot builders, where can we find the additional
* files that make up the snapshot template? */
ARG_WITH("snapshot-template", "Path to snapshot builder template dir", "no");
// General DLL link flags
DEFINE("DLL_LDFLAGS", "/dll ");
// PHP DLL link flags
DEFINE("PHP_LDFLAGS", "$(DLL_LDFLAGS)");
// General libs
// urlmon.lib ole32.lib oleaut32.lib uuid.lib gdi32.lib winspool.lib comdlg32.lib
DEFINE("LIBS", "kernel32.lib ole32.lib user32.lib advapi32.lib shell32.lib ws2_32.lib Dnsapi.lib");
// Set some debug/release specific options
if (PHP_DEBUG == "yes") {
ADD_FLAG("CFLAGS", "/LDd /MDd /W3 /Gm /Od /D _DEBUG /D ZEND_DEBUG=1 " +
(X64?"/Zi":"/ZI"));
ADD_FLAG("LDFLAGS", "/debug");
// Avoid problems when linking to release libraries that use the release
// version of the libc
ADD_FLAG("PHP_LDFLAGS", "/nodefaultlib:msvcrt");
} else {
// Generate external debug files when --enable-debug-pack is specified
if (PHP_DEBUG_PACK == "yes") {
ADD_FLAG("CFLAGS", "/Zi");
ADD_FLAG("LDFLAGS", "/incremental:no /debug /opt:ref,icf");
}
// Equivalent to Release_TSInline build -> best optimization
ADD_FLAG("CFLAGS", "/LD /MD /W3 /Ox /D NDebug /D NDEBUG /D ZEND_WIN32_FORCE_INLINE /GF /D ZEND_DEBUG=0");
// if you have VS.Net /GS hardens the binary against buffer overruns
// ADD_FLAG("CFLAGS", "/GS");
}
if (PHP_ZTS == "yes") {
ADD_FLAG("CFLAGS", "/D ZTS=1");
}
DEFINE("PHP_ZTS_ARCHIVE_POSTFIX", PHP_ZTS == "yes" ? '' : "-nts");
// we want msvcrt in the PHP DLL
ADD_FLAG("PHP_LDFLAGS", "/nodefaultlib:libcmt");
// set up the build dir and DLL name
if (PHP_DEBUG == "yes" && PHP_ZTS == "yes") {
DEFINE("BUILD_DIR", PHP_OBJECT_OUT_DIR + "Debug_TS");
DEFINE("PHPDLL", "php" + PHP_VERSION + "ts_debug.dll");
DEFINE("PHPLIB", "php" + PHP_VERSION + "ts_debug.lib");
} else if (PHP_DEBUG == "yes" && PHP_ZTS == "no") {
DEFINE("BUILD_DIR", PHP_OBJECT_OUT_DIR + "Debug");
DEFINE("PHPDLL", "php" + PHP_VERSION + "_debug.dll");
DEFINE("PHPLIB", "php" + PHP_VERSION + "_debug.lib");
} else if (PHP_DEBUG == "no" && PHP_ZTS == "yes") {
DEFINE("BUILD_DIR", PHP_OBJECT_OUT_DIR + "Release_TS");
DEFINE("PHPDLL", "php" + PHP_VERSION + "ts.dll");
DEFINE("PHPLIB", "php" + PHP_VERSION + "ts.lib");
} else if (PHP_DEBUG == "no" && PHP_ZTS == "no") {
DEFINE("BUILD_DIR", PHP_OBJECT_OUT_DIR + "Release");
DEFINE("PHPDLL", "php" + PHP_VERSION + ".dll");
DEFINE("PHPLIB", "php" + PHP_VERSION + ".lib");
}
// Find the php_build dir - it contains headers and libraries
// that we need
ARG_WITH('php-build', 'Path to where you extracted the development libraries (http://wiki.php.net/internals/windows/libs). Assumes that it is a sibling of this source dir (..\\deps) if not specified', 'no');
if (PHP_PHP_BUILD == 'no') {
if (FSO.FolderExists("..\\deps")) {
PHP_PHP_BUILD = "..\\deps";
} else {
if (FSO.FolderExists("..\\php_build")) {
PHP_PHP_BUILD = "..\\php_build";
} else {
if (X64) {
if (FSO.FolderExists("..\\win64build")) {
PHP_PHP_BUILD = "..\\win64build";
} else if (FSO.FolderExists("..\\php-win64-dev\\php_build")) {
PHP_PHP_BUILD = "..\\php-win64-dev\\php_build";
}
} else {
if (FSO.FolderExists("..\\win32build")) {
PHP_PHP_BUILD = "..\\win32build";
} else if (FSO.FolderExists("..\\php-win32-dev\\php_build")) {
PHP_PHP_BUILD = "..\\php-win32-dev\\php_build";
}
}
}
}
PHP_PHP_BUILD = FSO.GetAbsolutePathName(PHP_PHP_BUILD);
}
DEFINE("PHP_BUILD", PHP_PHP_BUILD);
ARG_WITH('extra-includes', 'Extra include path to use when building everything', '');
ARG_WITH('extra-libs', 'Extra library path to use when linking everything', '');
var php_usual_include_suspects = PHP_PHP_BUILD+"\\include";
var php_usual_lib_suspects = PHP_PHP_BUILD+"\\lib";
ADD_FLAG("CFLAGS", '/I "' + php_usual_include_suspects + '" ');
ADD_FLAG("LDFLAGS", '/libpath:"\\"' + php_usual_lib_suspects + '\\"" ');
// Poke around for some headers
function probe_basic_headers()
{
var p;
if (PHP_PHP_BUILD != "no") {
php_usual_include_suspects += ";" + PHP_PHP_BUILD + "\\include";
php_usual_lib_suspects += ";" + PHP_PHP_BUILD + "\\lib";
}
}
function add_extra_dirs()
{
var path, i, f;
if (PHP_EXTRA_INCLUDES.length) {
path = PHP_EXTRA_INCLUDES.split(';');
for (i = 0; i < path.length; i++) {
f = FSO.GetAbsolutePathName(path[i]);
if (FSO.FolderExists(f)) {
ADD_FLAG("CFLAGS", '/I "' + f + '" ');
}
}
}
if (PHP_EXTRA_LIBS.length) {
path = PHP_EXTRA_LIBS.split(';');
for (i = 0; i < path.length; i++) {
f = FSO.GetAbsolutePathName(path[i]);
if (FSO.FolderExists(f)) {
if (VCVERS <= 1200 && f.indexOf(" ") >= 0) {
ADD_FLAG("LDFLAGS", '/libpath:"\\"' + f + '\\"" ');
} else {
ADD_FLAG("LDFLAGS", '/libpath:"' + f + '" ');
}
}
}
}
}
probe_basic_headers();
add_extra_dirs();
//DEFINE("PHP_BUILD", PHP_PHP_BUILD);
STDOUT.WriteBlankLines(1);
STDOUT.WriteLine("Build dir: " + get_define('BUILD_DIR'));
STDOUT.WriteLine("PHP Core: " + get_define('PHPDLL') + " and " + get_define('PHPLIB'));
if (VCVERS == 1200) {
AC_DEFINE('ZEND_DVAL_TO_LVAL_CAST_OK', 1);
}
if (VCVERS >= 1400) {
AC_DEFINE('HAVE_STRNLEN', 1);
}
STDOUT.WriteBlankLines(1);
if (PHP_SNAPSHOT_TEMPLATE == "no") {
/* default is as a sibling of the php_build dir */
if (FSO.FolderExists(PHP_PHP_BUILD + "\\template")) {
PHP_SNAPSHOT_TEMPLATE = FSO.GetAbsolutePathName(PHP_PHP_BUILD + "\\template");
} else if (FSO.FolderExists(PHP_PHP_BUILD + "\\..\\template")) {
PHP_SNAPSHOT_TEMPLATE = FSO.GetAbsolutePathName(PHP_PHP_BUILD + "\\..\\template");
}
}
DEFINE('SNAPSHOT_TEMPLATE', PHP_SNAPSHOT_TEMPLATE);
if (PHP_DSP != "no") {
if (FSO.FolderExists("tmp")) {
FSO.DeleteFolder("tmp");
}
FSO.CreateFolder("tmp");
}
AC_DEFINE("PHP_DIR", PHP_DIR);
DEFINE("PHP_DIR", PHP_DIR);

View File

@ -2,7 +2,7 @@
// $Id$
// tail end of configure
if (sapi_enabled.length < 1) {
if (!MODE_PHPIZE && sapi_enabled.length < 1) {
MESSAGE("");
ERROR("No SAPI selected, please enable at least one SAPI.");
}

View File

@ -34,6 +34,9 @@ var extensions_enabled = new Array();
/* Store the SAPI enabled (summary + QA check) */
var sapi_enabled = new Array();
/* Store the headers to install */
var headers_install = new Array();
/* Mapping CL version > human readable name */
var VC_VERSIONS = new Array();
VC_VERSIONS[1200] = 'MSVC6 (Visual C++ 6.0)';
@ -55,11 +58,18 @@ if (PROGRAM_FILES == null) {
PROGRAM_FILES = "C:\\Program Files";
}
if (!FSO.FileExists("README.SVN-RULES")) {
STDERR.WriteLine("Must be run from the root of the php source");
WScript.Quit(10);
if (MODE_PHPIZE) {
if (!FSO.FileExists("config.w32")) {
STDERR.WriteLine("Must be run from the root of the extension source");
WScript.Quit(10);
}
} else {
if (!FSO.FileExists("README.SVN-RULES")) {
STDERR.WriteLine("Must be run from the root of the php source");
WScript.Quit(10);
}
}
var CWD = WshShell.CurrentDirectory;
if (typeof(CWD) == "undefined") {
@ -106,7 +116,9 @@ build_dirs = new Array();
extension_include_code = "";
extension_module_ptrs = "";
get_version_numbers();
if (!MODE_PHPIZE) {
get_version_numbers();
}
/* execute a command and return the output as a string */
function execute(command_line)
@ -330,7 +342,13 @@ function conf_process_args()
arg.seen = true;
analyzed = analyze_arg(argval);
shared = analyzed[0];
/* Force shared when called after phpize */
if (MODE_PHPIZE) {
shared = "shared";
} else {
shared = analyzed[0];
}
argval = analyzed[1];
if (argname == arg.imparg) {
@ -972,13 +990,21 @@ function generate_version_info_resource(makefiletarget, basename, creditspath, s
creditspath + '\\template.rc');
return resname;
}
MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": win32\\build\\template.rc");
MFO.WriteLine("\t$(RC) /n /fo $(BUILD_DIR)\\" + resname + logo + debug +
' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'
+ makefiletarget + '\\"" /d URL="\\"' + project_url +
'\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning +
'\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" win32\\build\\template.rc');
if (MODE_PHPIZE) {
MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": $(PHP_DIR)\\build\\template.rc");
MFO.WriteLine("\t$(RC) /I $(PHP_DIR)/include /n /fo $(BUILD_DIR)\\" + resname + logo + debug +
' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'
+ makefiletarget + '\\"" /d URL="\\"' + project_url +
'\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning +
'\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" $(PHP_DIR)\\build\\template.rc');
} else {
MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": win32\\build\\template.rc");
MFO.WriteLine("\t$(RC) /n /fo $(BUILD_DIR)\\" + resname + logo + debug +
' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'
+ makefiletarget + '\\"" /d URL="\\"' + project_url +
'\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning +
'\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" win32\\build\\template.rc');
}
MFO.WriteBlankLines(1);
return resname;
}
@ -1017,7 +1043,11 @@ function SAPI(sapiname, file_list, makefiletarget, cflags, obj_dir)
MFO.WriteLine(makefiletarget + ": $(BUILD_DIR)\\" + makefiletarget);
MFO.WriteLine("\t@echo SAPI " + sapiname_for_printing + " build complete");
MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
if (MODE_PHPIZE) {
MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(BUILD_DIR)\\" + resname);
} else {
MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
}
if (makefiletarget.match(new RegExp("\\.dll$"))) {
ldflags = "/dll $(LDFLAGS)";
@ -1030,11 +1060,20 @@ function SAPI(sapiname, file_list, makefiletarget, cflags, obj_dir)
manifest = "-@$(_VC_MANIFEST_EMBED_EXE)";
}
if (ld) {
MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);
if (MODE_PHPIZE) {
if (ld) {
MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);
} else {
ld = "@$(CC)";
MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");
}
} else {
ld = "@$(CC)";
MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");
if (ld) {
MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);
} else {
ld = "@$(CC)";
MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");
}
}
if (manifest) {
@ -1199,8 +1238,13 @@ function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir)
MFO.WriteLine("$(BUILD_DIR)\\" + libname + ": $(BUILD_DIR)\\" + dllname);
MFO.WriteBlankLines(1);
MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");
if (MODE_PHPIZE) {
MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(PHPLIB) $(BUILD_DIR)\\" + resname);
MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");
} else {
MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");
}
MFO.WriteLine("\t-@$(_VC_MANIFEST_EMBED_DLL)");
MFO.WriteBlankLines(1);
@ -1314,7 +1358,7 @@ function ADD_SOURCES(dir, file_list, target, obj_dir)
obj = src.replace(re, ".obj");
tv += " " + sub_build + obj;
if (PHP_ONE_SHOT == "yes") {
if (!MODE_PHPIZE && PHP_ONE_SHOT == "yes") {
if (i > 0) {
objs_line += " " + sub_build + obj;
srcs_line += " " + dir + "\\" + src;
@ -1328,7 +1372,7 @@ function ADD_SOURCES(dir, file_list, target, obj_dir)
}
}
if (PHP_ONE_SHOT == "yes") {
if (!MODE_PHPIZE && PHP_ONE_SHOT == "yes") {
MFO.WriteLine(objs_line + ": " + srcs_line);
MFO.WriteLine("\t$(CC) $(" + flags + ") $(CFLAGS) /Fo" + sub_build + " $(" + bd_flags_name + ") /c " + srcs_line);
}
@ -1475,11 +1519,11 @@ function write_summary()
STDOUT.WriteLine("Enabled extensions:");
output_as_table(["Extension", "Mode"], extensions_enabled.sort());
STDOUT.WriteBlankLines(2);
STDOUT.WriteLine("Enabled SAPI:");
output_as_table(["Sapi Name"], sapi_enabled);
STDOUT.WriteBlankLines(2);
if (!MODE_PHPIZE) {
STDOUT.WriteLine("Enabled SAPI:");
output_as_table(["Sapi Name"], sapi_enabled);
STDOUT.WriteBlankLines(2);
}
ar[0] = ['Build type', PHP_DEBUG == "yes" ? "Debug" : "Release"];
ar[1] = ['Thread Safety', PHP_ZTS == "yes" ? "Yes" : "No"];
ar[2] = ['Compiler', VC_VERSIONS[VCVERS]];
@ -1526,9 +1570,11 @@ function generate_files()
STDOUT.WriteLine("Generating files...");
generate_makefile();
generate_internal_functions();
generate_config_h();
if (!MODE_PHPIZE) {
generate_internal_functions();
generate_config_h();
generate_phpize();
}
STDOUT.WriteLine("Done.");
STDOUT.WriteBlankLines(1);
write_summary();
@ -1602,13 +1648,54 @@ function generate_config_h()
outfile.Close();
}
function generate_phpize()
{
STDOUT.WriteLine("Generating phpize");
dest = get_define("BUILD_DIR") + '/devel';
if (!FSO.FolderExists(dest)) {
FSO.CreateFolder(dest);
}
var MF = FSO.CreateTextFile(dest + "/phpize.js", true);
prefix = get_define("PHP_PREFIX");
prefix = prefix.replace(new RegExp("/", "g"), "\\");
prefix = prefix.replace(new RegExp("\\\\", "g"), "\\\\");
MF.WriteLine("var PHP_PREFIX=" + '"' + prefix + '"');
MF.WriteLine("var PHP_ZTS=" + '"' + (PHP_ZTS.toLowerCase() == "yes" ? "Yes" : "No") + '"');
MF.WriteLine("var VC_VERSION=" + VCVERS);
MF.WriteLine("var PHP_VERSION=" + PHP_VERSION);
MF.WriteLine("var PHP_MINOR_VERSION=" + PHP_MINOR_VERSION);
MF.WriteLine("var PHP_RELEASE_VERSION=" + PHP_RELEASE_VERSION);
MF.WriteBlankLines(2);
MF.WriteLine("/* Genereted win32/build/phpize.js.in */");
MF.WriteBlankLines(1);
MF.Write(file_get_contents("win32/build/phpize.js.in"));
MF.Close();
/* Generate flags file */
/* spit out variable definitions */
CJ = FSO.CreateTextFile(dest + "/config.phpize.js");
/*
function escape(in) {
val = t.replace(new RegExp('("\\\\)', "g"), '\\$1');
}
*/
//if (typeof t == "string") {
CJ.WriteLine("var PHP_ZTS =" + '"' + PHP_ZTS + '"');
CJ.WriteLine("var PHP_LIB =" + '"' + get_define('PHPLIB') + '"');
CJ.WriteBlankLines(1);
CJ.Close();
}
function generate_makefile()
{
STDOUT.WriteLine("Generating Makefile");
var MF = FSO.CreateTextFile("Makefile", true);
MF.WriteLine("# Generated by configure.js");
/* spit out variable definitions */
var keys = (new VBArray(configure_subst.Keys())).toArray();
var i;
@ -1625,9 +1712,25 @@ function generate_makefile()
}
MF.WriteBlankLines(1);
if (MODE_PHPIZE) {
var TF = FSO.OpenTextFile(PHP_DIR + "/script/Makefile.phpize", 1);
} else {
var TF = FSO.OpenTextFile("win32/build/Makefile", 1);
}
var TF = FSO.OpenTextFile("win32/build/Makefile", 1);
MF.Write(TF.ReadAll());
MF.WriteLine("install-headers:");
MF.WriteLine(" @if not exist $(PHP_PREFIX)\\include mkdir $(PHP_PREFIX)\\include >nul");
MF.WriteLine(" @for %D in ($(INSTALL_HEADERS_DIR)) do @if not exist $(PHP_PREFIX)\\include\\%D mkdir $(PHP_PREFIX)\\include\\%D >nul");
for (i in headers_install) {
if (headers_install[i][2] != "") {
MF.WriteLine(" @if not exist $(PHP_PREFIX)\\include\\" + headers_install[i][2] + " mkdir $(PHP_PREFIX)\\include\\" +
headers_install[i][2] + ">nul");
MF.WriteLine(" @copy " + headers_install[i][0] + " " + "$(PHP_PREFIX)\\include\\" + headers_install[i][2] + " /y >nul");
}
}
MF.WriteLine(" @for %D in ($(INSTALL_HEADERS_DIR)) do @copy %D*.h $(PHP_PREFIX)\\include\\%D /y >nul");
TF.Close();
MF.WriteBlankLines(2);
@ -1848,16 +1951,47 @@ function _inner_glob(base, p, parts)
return items;
}
function PHP_INSTALL_HEADERS(dir, headers_list)
{
headers_list = headers_list.split(new RegExp("\\s+"));
headers_list.sort();
if (dir.length > 0 && dir.substr(dir.length - 1) != '/') {
dir += '/';
}
dir = dir.replace(new RegExp("/", "g"), "\\");
for (i in headers_list) {
src = headers_list[i];
src = src.replace(new RegExp("/", "g"), "\\");
isdir = FSO.FolderExists(dir + src);
isfile = FSO.FileExists(dir + src);
if (isdir) {
if (src.length > 0 && src.substr(src.length - 1) != '/') {
src += '\\';
}
headers_install[headers_install.length] = [dir + src, 'dir',''];
ADD_FLAG("INSTALL_HEADERS_DIR", dir + src);
} else if (isfile) {
dirname = FSO.GetParentFolderName(dir + src);
headers_install[headers_install.length] = [dir + src, 'file', dirname];
ADD_FLAG("INSTALL_HEADERS", dir + src);
} else {
STDOUT.WriteLine(headers_list);
ERROR("Cannot find header " + dir + src);
}
}
}
// for snapshot builders, this option will attempt to enable everything
// and you can then build everything, ignoring fatal errors within a module
// by running "nmake snap"
PHP_SNAPSHOT_BUILD = "no";
ARG_ENABLE('snapshot-build', 'Build a snapshot; turns on everything it can and ignores build errors', 'no');
// one-shot build optimizes build by asking compiler to build
// several objects at once, reducing overhead of starting new
// compiler processes.
ARG_ENABLE('one-shot', 'Optimize for fast build - best for release and snapshot builders, not so hot for edit-and-rebuild hacking', 'no');
if (!MODE_PHPIZE) {
ARG_ENABLE('snapshot-build', 'Build a snapshot; turns on everything it can and ignores build errors', 'no');
// one-shot build optimizes build by asking compiler to build
// several objects at once, reducing overhead of starting new
// compiler processes.
ARG_ENABLE('one-shot', 'Optimize for fast build - best for release and snapshot builders, not so hot for edit-and-rebuild hacking', 'no');
}

6
win32/build/phpize.bat Normal file
View File

@ -0,0 +1,6 @@
@echo off
SET PHP_BUILDCONF_PATH=%~dp0
cscript /nologo %PHP_BUILDCONF_PATH%\script\phpize.js %*
copy %PHP_BUILDCONF_PATH%\win32\build\configure.bat %PHP_BUILDCONF_PATH% > nul
IF NOT EXIST %PHP_BUILDCONF_PATH% (echo Error generating configure script, configure script was not copied) ELSE (echo Now run 'configure --help')
SET PHP_BUILDCONF_PATH=

262
win32/build/phpize.js.in Normal file
View File

@ -0,0 +1,262 @@
/*
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2008 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Pierre Joye <pierre1@php.net> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
// This generates a configure script for win32 build
var STDOUT = WScript.StdOut;
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var C = FSO.CreateTextFile("configure.js", true);
var B = FSO.CreateTextFile("configure.bat", true);
var DSP = false;
re = /\\script/i;
var PHP_DIR=FSO.GetParentFolderName(WScript.ScriptFullName).replace(re,"");
var modules = "";
var MODULES = WScript.CreateObject("Scripting.Dictionary");
var module_dirs = new Array();
function ERROR(msg)
{
STDERR.WriteLine("ERROR: " + msg);
WScript.Quit(3);
}
function file_get_contents(filename)
{
var F = FSO.OpenTextFile(filename, 1);
var t = F.ReadAll();
F.Close();
return t;
}
function Module_Item(module_name, config_path, dir_line, deps, content)
{
this.module_name = module_name;
this.config_path = config_path;
this.dir_line = dir_line;
this.deps = deps;
this.content = content;
}
function get_module_dep(contents)
{
var re_dep_line = new RegExp("ADD_EXTENSION_DEP\\([^,]*\\s*,\\s*['\"]([^'\"]+)['\"].*\\)", "gm");
var calls = contents.match(re_dep_line);
if (calls != null) {
for (i = 0; i < calls.length; i++) {
// now we need the extension name out of this thing
if (calls[i].match(re_dep_line)) {
deps[deps.length] = RegExp.$1;
}
}
}
}
function find_config_w32(dirname)
{
if (!FSO.FolderExists(dirname)) {
return;
}
var f = FSO.GetFolder(dirname);
var fc = new Enumerator(f.SubFolders);
var c, i, ok, n;
var item = null;
c = dirname + "\\config.w32";
if (FSO.FileExists(c)) {
var dir_line = "configure_module_dirname = condense_path(FSO.GetParentFolderName('"
+ c.replace(new RegExp('(["\\\\])', "g"), '\\$1') + "'));\r\n";
var contents = file_get_contents(c);
var deps = new Array();
get_module_dep(contents);
item = new Module_Item(n, c, dir_line, deps, contents);
MODULES.Add(n, item);
}
for (; !fc.atEnd(); fc.moveNext()) {
/* check if we already picked up a module with the same dirname;
* if we have, don't include it here */
n = FSO.GetFileName(fc.item());
if (n == '.svn' || n == 'tests' || n == '.git') {
continue;
}
c = FSO.BuildPath(fc.item(), "config.w32");
if (FSO.FileExists(c)) {
var dir_line = "configure_module_dirname = condense_path(FSO.GetParentFolderName('"
+ c.replace(new RegExp('(["\\\\])', "g"), '\\$1') + "'));\r\n";
var contents = file_get_contents(c);
var deps = new Array();
get_module_dep(contents);
item = new Module_Item(n, c, dir_line, deps, contents);
MODULES.Add(n, item);
}
}
}
function emit_module(item)
{
return item.dir_line + item.content;
}
function emit_dep_modules(module_names)
{
var i, mod_name, j;
var output = "";
var item = null;
for (i in module_names) {
mod_name = module_names[i];
if (MODULES.Exists(mod_name)) {
item = MODULES.Item(mod_name);
MODULES.Remove(mod_name);
if (item.deps.length) {
output += emit_dep_modules(item.deps);
}
output += emit_module(item);
}
}
return output;
}
function gen_modules()
{
var module_names = (new VBArray(MODULES.Keys())).toArray();
var i, mod_name, j;
var item;
var output = "";
// first, look for modules with empty deps; emit those first
for (i in module_names) {
STDOUT.WriteLine("module ... " + module_names);
mod_name = module_names[i];
item = MODULES.Item(mod_name);
if (item.deps.length == 0) {
MODULES.Remove(mod_name);
output += emit_module(item);
}
}
// now we are left with modules that have dependencies on other modules
module_names = (new VBArray(MODULES.Keys())).toArray();
output += emit_dep_modules(module_names);
return output;
}
// Process buildconf arguments
function buildconf_process_args()
{
args = WScript.Arguments;
for (i = 0; i < args.length; i++) {
arg = args(i);
// If it is --foo=bar, split on the equals sign
arg = arg.split("=", 2);
argname = arg[0];
if (arg.length > 1) {
argval = arg[1];
} else {
argval = null;
}
if (argname == '--clean' && argval != null) {
STDOUT.WriteLine("Cleaning...");
return 0;
}
if (argname == '--help') {
STDOUT.WriteLine("Usage: phpize [--clean|--help|--version|-v]");
return 0;
}
return 1;
}
}
if (buildconf_process_args() == 0) {
WScript.Quit(3);
}
STDOUT.WriteLine("Rebuilding configure.js");
STDOUT.WriteLine(PHP_DIR);
// Write the head of the configure script
C.WriteLine("/* This file automatically generated from script/confutils.js */");
C.WriteLine("var MODE_PHPIZE = true;");
C.WriteLine("var PHP_DIR = " + '"' + PHP_DIR.replace(new RegExp('(["\\\\])', "g"), '\\$1') + '"');
C.Write(file_get_contents(PHP_DIR + "/script/confutils.js"));
C.Write(file_get_contents(PHP_DIR + "/script/config.phpize.js"));
// If project files were requested, pull in the code to generate them
if (DSP == true) {
C.WriteLine('PHP_DSP="yes"');
C.WriteBlankLines(1);
C.Write(file_get_contents(PHP_DIR + "win32/build/projectgen.js"));
} else {
C.WriteLine('PHP_DSP="no"');
C.WriteBlankLines(1);
}
// Pull in code from sapi and extensions
modules = file_get_contents(PHP_DIR + "/script/config.w32.phpize.in");
C.WriteLine("ARG_ENABLE('debug', 'Compile with debugging symbols', \"no\");");
find_config_w32(".");
// Now generate contents of module based on MODULES, chasing dependencies
// to ensure that dependent modules are emitted first
modules += gen_modules();
// Look for ARG_ENABLE or ARG_WITH calls
re = new RegExp("(ARG_(ENABLE|WITH)\([^;]+\);)", "gm");
calls = modules.match(re);
for (i = 0; i < calls.length; i++) {
item = calls[i];
C.WriteLine("try {");
C.WriteLine(item);
C.WriteLine("} catch (e) {");
C.WriteLine('\tSTDOUT.WriteLine("problem: " + e);');
C.WriteLine("}");
}
C.WriteBlankLines(1);
C.WriteLine("conf_process_args();");
C.WriteBlankLines(1);
C.Write(file_get_contents(PHP_DIR + "/script/config.w32.phpize.in"));
// Comment out the calls from their original positions
modules = modules.replace(re, "/* $1 */");
C.Write(modules);
C.WriteBlankLines(1);
C.Write(file_get_contents(PHP_DIR + "\\script\\configure.tail"));
B.WriteLine("@echo off");
B.WriteLine("cscript /nologo configure.js %*");

View File

@ -1,5 +1,5 @@
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\PHP-5.1.0-dev]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\PHP-5.3.5-dev]
"TypesSupported"=dword:00000007
"EventMessageFile"="C:\\php5\\php5ts.dll"
"EventMessageFile"="g:\\test\\php53install\\php5ts.dll"