From aea6771d1993cc6ea75e3dd75cfc54fb268dfaf0 Mon Sep 17 00:00:00 2001 From: Pierre Joye Date: Mon, 13 Dec 2010 18:43:10 +0000 Subject: [PATCH] - 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 :) --- ext/date/config.w32 | 2 + ext/dom/config.w32 | 1 + ext/ereg/config.w32 | 3 +- ext/filter/config.w32 | 1 + ext/gd/config.w32 | 2 + ext/hash/config.w32 | 7 +- ext/iconv/config.w32 | 1 + ext/libxml/config.w32 | 1 + ext/mbstring/config.w32 | 3 + ext/mysqli/config.w32 | 2 + ext/mysqlnd/config.w32 | 1 + ext/pcre/config.w32 | 1 + ext/pdo/config.w32 | 1 + ext/session/config.w32 | 1 + ext/sockets/config.w32 | 1 + ext/spl/config.w32 | 1 + ext/sqlite3/config.w32 | 1 + ext/standard/config.w32 | 3 +- ext/xml/config.w32 | 1 + ext/zip/php_zip.c | 2 - win32/build/Makefile | 20 +- win32/build/Makefile.phpize | 38 ++++ win32/build/buildconf.js | 1 + win32/build/config.w32 | 7 +- win32/build/config.w32.phpize.in | 340 +++++++++++++++++++++++++++++++ win32/build/configure.tail | 2 +- win32/build/confutils.js | 210 +++++++++++++++---- win32/build/phpize.bat | 6 + win32/build/phpize.js.in | 262 ++++++++++++++++++++++++ win32/syslog.reg | 4 +- 30 files changed, 876 insertions(+), 50 deletions(-) create mode 100644 win32/build/Makefile.phpize create mode 100644 win32/build/config.w32.phpize.in create mode 100644 win32/build/phpize.bat create mode 100644 win32/build/phpize.js.in diff --git a/ext/date/config.w32 b/ext/date/config.w32 index 368ddef97a..85b0e6519b 100755 --- a/ext/date/config.w32 +++ b/ext/date/config.w32 @@ -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(); diff --git a/ext/dom/config.w32 b/ext/dom/config.w32 index 8fba39336a..cbe15af1ab 100644 --- a/ext/dom/config.w32 +++ b/ext/dom/config.w32 @@ -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" diff --git a/ext/ereg/config.w32 b/ext/ereg/config.w32 index 59cdb04685..d4b06747df 100644 --- a/ext/ereg/config.w32 +++ b/ext/ereg/config.w32 @@ -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'); -} \ No newline at end of file + PHP_INSTALL_HEADERS("ext/ereg", "php_ereg.h php_regex.h regex/"); +} diff --git a/ext/filter/config.w32 b/ext/filter/config.w32 index 083555a4c7..b74f3a2fd0 100644 --- a/ext/filter/config.w32 +++ b/ext/filter/config.w32 @@ -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"); } diff --git a/ext/gd/config.w32 b/ext/gd/config.w32 index 340424b6bf..8f1c13f610 100644 --- a/ext/gd/config.w32 +++ b/ext/gd/config.w32 @@ -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"); } diff --git a/ext/hash/config.w32 b/ext/hash/config.w32 index a880a4b0cc..6a2fcff18f 100644 --- a/ext/hash/config.w32 +++ b/ext/hash/config.w32 @@ -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"); } diff --git a/ext/iconv/config.w32 b/ext/iconv/config.w32 index 7bc649e2ad..00ab272423 100644 --- a/ext/iconv/config.w32 +++ b/ext/iconv/config.w32 @@ -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"; diff --git a/ext/libxml/config.w32 b/ext/libxml/config.w32 index 7c9988f7e9..92144f9ad0 100644 --- a/ext/libxml/config.w32 +++ b/ext/libxml/config.w32 @@ -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" diff --git a/ext/mbstring/config.w32 b/ext/mbstring/config.w32 index 2fdd9d3514..ae0972f62a 100644 --- a/ext/mbstring/config.w32 +++ b/ext/mbstring/config.w32 @@ -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"); } } diff --git a/ext/mysqli/config.w32 b/ext/mysqli/config.w32 index 8ea72a06db..ab3321ae44 100644 --- a/ext/mysqli/config.w32 +++ b/ext/mysqli/config.w32 @@ -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" diff --git a/ext/mysqlnd/config.w32 b/ext/mysqlnd/config.w32 index ba0ebd90ad..4a32cbcb9d 100644 --- a/ext/mysqlnd/config.w32 +++ b/ext/mysqlnd/config.w32 @@ -25,5 +25,6 @@ if (PHP_MYSQLND != "no") { { AC_DEFINE("MYSQLND_COMPRESSION_ENABLED", 1, "Compression support"); } + PHP_INSTALL_HEADERS("", "ext/mysqlnd"); } } diff --git a/ext/pcre/config.w32 b/ext/pcre/config.w32 index 05b3abcd1a..5d6fa90594 100644 --- a/ext/pcre/config.w32 +++ b/ext/pcre/config.w32 @@ -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/"); diff --git a/ext/pdo/config.w32 b/ext/pdo/config.w32 index 9fb3801981..c85f2e55e4 100755 --- a/ext/pdo/config.w32 +++ b/ext/pdo/config.w32 @@ -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"); } diff --git a/ext/session/config.w32 b/ext/session/config.w32 index 8225dc53d6..27114f11d3 100644 --- a/ext/session/config.w32 +++ b/ext/session/config.w32 @@ -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"); } diff --git a/ext/sockets/config.w32 b/ext/sockets/config.w32 index 1672f85b15..8b63381900 100644 --- a/ext/sockets/config.w32 +++ b/ext/sockets/config.w32 @@ -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"); } diff --git a/ext/spl/config.w32 b/ext/spl/config.w32 index e594b0eb48..77cbd20346 100644 --- a/ext/spl/config.w32 +++ b/ext/spl/config.w32 @@ -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"); diff --git a/ext/sqlite3/config.w32 b/ext/sqlite3/config.w32 index 4d9dca40ae..01e4625fed 100644 --- a/ext/sqlite3/config.w32 +++ b/ext/sqlite3/config.w32 @@ -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"); } diff --git a/ext/standard/config.w32 b/ext/standard/config.w32 index 70b250137a..d14b859e9d 100644 --- a/ext/standard/config.w32 +++ b/ext/standard/config.w32 @@ -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"); diff --git a/ext/xml/config.w32 b/ext/xml/config.w32 index ed0352701b..c0bdfd56ef 100644 --- a/ext/xml/config.w32 +++ b/ext/xml/config.w32 @@ -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" diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 1b42c94457..38a0b5b5b8 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -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); diff --git a/win32/build/Makefile b/win32/build/Makefile index 1377342991..203b03850d 100644 --- a/win32/build/Makefile +++ b/win32/build/Makefile @@ -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) - - diff --git a/win32/build/Makefile.phpize b/win32/build/Makefile.phpize new file mode 100644 index 0000000000..17cfc90fbd --- /dev/null +++ b/win32/build/Makefile.phpize @@ -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 + diff --git a/win32/build/buildconf.js b/win32/build/buildconf.js index d26b4c7403..b4194ad203 100644 --- a/win32/build/buildconf.js +++ b/win32/build/buildconf.js @@ -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 diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 4b29cd925b..99cb09c7cb 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -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? */ diff --git a/win32/build/config.w32.phpize.in b/win32/build/config.w32.phpize.in new file mode 100644 index 0000000000..d5b71c964e --- /dev/null +++ b/win32/build/config.w32.phpize.in @@ -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); diff --git a/win32/build/configure.tail b/win32/build/configure.tail index 1977abb807..70625a43d4 100644 --- a/win32/build/configure.tail +++ b/win32/build/configure.tail @@ -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."); } diff --git a/win32/build/confutils.js b/win32/build/confutils.js index ed3f2424f9..a3bde86af4 100644 --- a/win32/build/confutils.js +++ b/win32/build/confutils.js @@ -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'); +} diff --git a/win32/build/phpize.bat b/win32/build/phpize.bat new file mode 100644 index 0000000000..c8840d3544 --- /dev/null +++ b/win32/build/phpize.bat @@ -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= diff --git a/win32/build/phpize.js.in b/win32/build/phpize.js.in new file mode 100644 index 0000000000..92b5da55c9 --- /dev/null +++ b/win32/build/phpize.js.in @@ -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 | + +----------------------------------------------------------------------+ +*/ + +/* $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 %*"); diff --git a/win32/syslog.reg b/win32/syslog.reg index 2baa88e366..0de1dd7f3c 100644 --- a/win32/syslog.reg +++ b/win32/syslog.reg @@ -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" -- 2.40.0