kjdev / php-ext-zstd

Zstd Extension for PHP
MIT License
201 stars 27 forks source link

config.w32 compile failed on 0.12.1 #51

Closed nono303 closed 1 year ago

nono303 commented 1 year ago

Hi @kjdev, Thanks for 0.12.1! config.w32 change (https://github.com/kjdev/php-ext-zstd/commit/65c431a15561b7c2cc761410d4767601290ca83a) failed on compile as PHP_DIR is undefined. Here is my quick working patch which correspond to a standard use of CHECK_HEADER_ADD_INCLUDE using PHP_ZSTD

diff --git "a/config.w32" "b/config.w32"
index 17922bf..c54c9ed 100644
--- "a/config.w32"
+++ "b/config.w32"
@@ -1,7 +1,7 @@
 ARG_ENABLE("zstd", "zstd support", "yes");

 if (PHP_ZSTD != "no") {
-  if (CHECK_HEADER_ADD_INCLUDE("ext/apcu/apc_serializer.h", "CFLAGS_ZSTD", PHP_DIR + "\\include")) {
+  if (CHECK_HEADER_ADD_INCLUDE("ext/apcu/apc_serializer.h", "CFLAGS_ZSTD", PHP_ZSTD)) {
     AC_DEFINE("HAVE_APCU_SUPPORT", 1, "APCu support");
   }
kjdev commented 1 year ago

How about a change like this.

--- a/config.w32
+++ b/config.w32
@@ -1,7 +1,7 @@
 ARG_ENABLE("zstd", "zstd support", "yes");

 if (PHP_ZSTD != "no") {
-  if (CHECK_HEADER_ADD_INCLUDE("ext/apcu/apc_serializer.h", "CFLAGS_ZSTD", PHP_DIR + "\\include")) {
+  if (CHECK_HEADER_ADD_INCLUDE("ext/apcu/apc_serializer.h", "CFLAGS_ZSTD", PHP_DIR + "\\include;" + PHP_ZSTD)) {
     AC_DEFINE("HAVE_APCU_SUPPORT", 1, "APCu support");
   }
nono303 commented 1 year ago

PHP_DIR is still not set and never used in config.w32 for all extensions. Maybe you are thinking about PHP_PHP_BUILD (ex. https://github.com/php/php-src/blob/master/ext/gd/config.w32) that will work

--- a/config.w32
+++ b/config.w32
@@ -1,7 +1,7 @@
 ARG_ENABLE("zstd", "zstd support", "yes");

 if (PHP_ZSTD != "no") {
-  if (CHECK_HEADER_ADD_INCLUDE("ext/apcu/apc_serializer.h", "CFLAGS_ZSTD", PHP_DIR + "\\include")) {
+  if (CHECK_HEADER_ADD_INCLUDE("ext/apcu/apc_serializer.h", "CFLAGS_ZSTD", PHP_PHP_BUILD + "\\include;" + PHP_ZSTD)) {
     AC_DEFINE("HAVE_APCU_SUPPORT", 1, "APCu support");
   }
kjdev commented 1 year ago

I tried to specify the path where the header might be.

--- a/config.w32
+++ b/config.w32
@@ -1,7 +1,7 @@
 ARG_ENABLE("zstd", "zstd support", "yes");

 if (PHP_ZSTD != "no") {
-  if (CHECK_HEADER_ADD_INCLUDE("ext/apcu/apc_serializer.h", "CFLAGS_ZSTD", PHP_DIR + "\\include")) {
+  if (CHECK_HEADER_ADD_INCLUDE("ext/apcu/apc_serializer.h", "CFLAGS_ZSTD", ".;" + PHP_DIR + "\\include;" + PHP_PHP_BUILD + "\\include;" + PHP_EXTRA_INCLUDES + ";" + PHP_ZSTD)) {
     AC_DEFINE("HAVE_APCU_SUPPORT", 1, "APCu support");
   }

I wonder if PHP_DIR is set when you run phpize.

https://github.com/php/php-src/blob/master/win32/build/phpize.js.in#L25

phpize.js.in:var PHP_DIR=FSO.GetParentFolderName(WScript.ScriptFullName).replace(re,"");

PHP_PHP_BUILD seemed to specify dependent libraries needed at build time, so I didn't specify it.

https://github.com/php/php-src/blob/master/ext/gd/config.w32#L11 External libraries such as freetype2 instead of PHP's extension header

by specifying options. https://github.com/php/php-src/blob/master/.github/scripts/windows/build_task.bat

set DEPS_DIR=%PHP_BUILD_CACHE_BASE_DIR%\deps-%BRANCH%-%PHP_SDK_VS%-%PHP_SDK_ARCH%
..
--with-php-build=%DEPS_DIR% ^
nono303 commented 1 year ago

On an standard Windows compilation environment, usage of PHP_DIR throw an error

C:\sdk\src\php-sdk\phpmaster\vs17\x64\php-src\configure.js(6371, 3) Erreur d'exécution Microsoft JScript: 'PHP_DIR' est indéfini

I didin't go deep into how and were var are set during configure but just see how config.w32 is wrtitten for php-src extensions: it use PHP_PHP_BUILD and not PHP_DIR.

/cygdrive/c/sdk/src/php-src/ext
$ grep --color=auto --include=\*.w32 -Rine PHP_DIR

/cygdrive/c/sdk/src/php-src/ext
$ grep --color=auto --include=\*.w32 -Rine PHP_PHP_BUILD
curl/config.w32:7:      var f = PHP_PHP_BUILD + "/include/curl/curlver.h";
curl/config.w32:10:             var m = reg.exec(file_get_contents(PHP_PHP_BUILD + "/include/curl/curlver.h"));
dba/config.w32:27:                      CHECK_HEADER_ADD_INCLUDE("depot.h", "CFLAGS_DBA", PHP_DBA + ";" + PHP_PHP_BUILD + "\\include\\qdbm")) {
dom/config.w32:8:               CHECK_HEADER_ADD_INCLUDE("libxml/parser.h", "CFLAGS_DOM", PHP_PHP_BUILD + "\\include\\libxml2")
enchant/config.w32:6:   if (CHECK_HEADER_ADD_INCLUDE("enchant.h", "CFLAGS_ENCHANT", PHP_ENCHANT+ ";" + PHP_PHP_BUILD + "\\include\\enchant") &&
enchant/config.w32:7:                   CHECK_HEADER_ADD_INCLUDE("glib.h", "CFLAGS_ENCHANT", PHP_ENCHANT+ ";" + PHP_PHP_BUILD + "\\include\\glib-2.0")) {
ffi/config.w32:4:       if (CHECK_HEADER_ADD_INCLUDE("ffi.h", "CFLAGS_FFI", PHP_FFI+ ";" + PHP_PHP_BUILD + "\\include") &&
ffi/config.w32:15:              if (GREP_HEADER("ffitarget.h", "FFI_VECTORCALL_PARTIAL", PHP_PHP_BUILD + "\\include")) {
gd/config.w32:7:                CHECK_HEADER_ADD_INCLUDE("gd.h",                "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include") &&
gd/config.w32:8:                CHECK_HEADER_ADD_INCLUDE("gdfontg.h",           "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include") &&
gd/config.w32:9:                CHECK_HEADER_ADD_INCLUDE("gdfontl.h",           "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include") &&
gd/config.w32:10:               CHECK_HEADER_ADD_INCLUDE("gdfontmb.h",          "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include") &&
gd/config.w32:11:               CHECK_HEADER_ADD_INCLUDE("gdfonts.h",           "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include") &&
gd/config.w32:12:               CHECK_HEADER_ADD_INCLUDE("gdfontt.h",           "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include") &&
gd/config.w32:13:               CHECK_HEADER_ADD_INCLUDE("gd_errors.h",         "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include") &&
gmp/config.w32:7:               CHECK_HEADER_ADD_INCLUDE("gmp.h", "CFLAGS_GMP", PHP_GMP +  ";" + PHP_PHP_BUILD + "\\include\\mpir")) {
ldap/config.w32:7:      if (CHECK_HEADER_ADD_INCLUDE("ldap.h", "CFLAGS_LDAP", PHP_PHP_BUILD + "\\include\\openldap;" + PHP_PHP_BUILD + "\\openldap\\include;" + PHP_LDAP) &&
ldap/config.w32:8:                      CHECK_HEADER_ADD_INCLUDE("lber.h", "CFLAGS_LDAP", PHP_PHP_BUILD + "\\include\\openldap;" + PHP_PHP_BUILD + "\\openldap\\include;" + PHP_LDAP) &&
libxml/config.w32:10:                   CHECK_HEADER_ADD_INCLUDE("libxml/parser.h", "CFLAGS_LIBXML", PHP_PHP_BUILD + "\\include\\libxml2") &&
libxml/config.w32:11:                   CHECK_HEADER_ADD_INCLUDE("libxml/tree.h", "CFLAGS_LIBXML", PHP_PHP_BUILD + "\\include\\libxml2") &&
mbstring/config.w32:8:  if (CHECK_HEADER_ADD_INCLUDE("mbstring.h", "CFLAGS_MBSTRING", PHP_MBSTRING + ";" + PHP_PHP_BUILD + "\\include")) {
oci8/config.w32:42:     oci8_11g_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient_11;"
oci8/config.w32:43:     oci8_11g_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient_11;";
oci8/config.w32:77:     oci8_12c_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient_12;"
oci8/config.w32:78:     oci8_12c_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient_12;";
oci8/config.w32:111:    oci8_19_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient_19;"
oci8/config.w32:112:    oci8_19_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient_19;";
pdo_firebird/config.w32:7:      if ((CHECK_LIB("fbclient_ms.lib", "pdo_firebird", PHP_PHP_BUILD + "\\interbase\\lib_ms;" + PHP_PDO_FIREBIRD)
pdo_firebird/config.w32:8:                      || CHECK_LIB("gds32_ms.lib", "pdo_firebird", PHP_PHP_BUILD + "\\interbase\\lib_ms;" + PHP_PDO_FIREBIRD)
pdo_firebird/config.w32:10:                             PHP_PHP_BUILD + "\\include\\interbase;" + PHP_PHP_BUILD + "\\interbase\\include;" + PHP_PDO_FIREBIRD)
pdo_mysql/config.w32:15:                                        PHP_PHP_BUILD + "\\include\\mysql;" +
pdo_oci/config.w32:10:          PHP_PHP_BUILD + "\\instantclient10_*\\sdk",
pdo_oci/config.w32:11:          PHP_PHP_BUILD + "\\oci92"
pdo_oci/config.w32:24:  pdo_oci_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient;"
pdo_oci/config.w32:25:  pdo_oci_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient;";
pdo_pgsql/config.w32:7:                 CHECK_HEADER_ADD_INCLUDE("libpq-fe.h", "CFLAGS_PDO_PGSQL", PHP_PDO_PGSQL + "\\include;" + PHP_PHP_BUILD + "\\include\\pgsql;" + PHP_PHP_BUILD + "\\include\\libpq;")) {
pgsql/config.w32:7:             CHECK_HEADER_ADD_INCLUDE("libpq-fe.h", "CFLAGS_PGSQL", PHP_PGSQL + "\\include;" + PHP_PHP_BUILD + "\\include\\pgsql;" + PHP_PHP_BUILD + "\\include\\libpq;" + PHP_PGSQL)) {
pspell/config.w32:7:    if (CHECK_HEADER_ADD_INCLUDE("pspell.h", "CFLAGS_PSPELL", PHP_PHP_BUILD + "\\include\\pspell;" + PHP_PSPELL) &&
simplexml/config.w32:8:         CHECK_HEADER_ADD_INCLUDE("libxml/tree.h", "CFLAGS_SIMPLEXML", PHP_PHP_BUILD + "\\include\\libxml2")
snmp/config.w32:6:      if (CHECK_HEADER_ADD_INCLUDE("snmp.h", "CFLAGS_SNMP", PHP_PHP_BUILD + "\\include\\net-snmp;" + PHP_SNMP) &&
soap/config.w32:8:              CHECK_HEADER_ADD_INCLUDE("libxml/parser.h", "CFLAGS_SOAP", PHP_PHP_BUILD + "\\include\\libxml2") &&
soap/config.w32:9:              CHECK_HEADER_ADD_INCLUDE("libxml/tree.h", "CFLAGS_SOAP", PHP_PHP_BUILD + "\\include\\libxml2")
standard/config.w32:8:          if (!CHECK_FUNC_IN_HEADER("argon2.h", "argon2id_hash_raw", PHP_PHP_BUILD + "\\include", "CFLAGS")) {
xml/config.w32:8:               CHECK_HEADER_ADD_INCLUDE("libxml/parser.h", "CFLAGS_XML", PHP_PHP_BUILD + "\\include\\libxml2") &&
xml/config.w32:9:               CHECK_HEADER_ADD_INCLUDE("libxml/tree.h", "CFLAGS_XML", PHP_PHP_BUILD + "\\include\\libxml2")
xmlreader/config.w32:7: CHECK_HEADER_ADD_INCLUDE("libxml/parser.h", "CFLAGS_XMLREADER", PHP_PHP_BUILD + "\\include\\libxml2") &&
xmlreader/config.w32:8: CHECK_HEADER_ADD_INCLUDE("libxml/tree.h", "CFLAGS_XMLREADER", PHP_PHP_BUILD + "\\include\\libxml2")
xmlwriter/config.w32:6: if (CHECK_HEADER_ADD_INCLUDE('libxml/xmlwriter.h', 'CFLAGS_XMLWRITER', PHP_XMLWRITER + ";" + PHP_PHP_BUILD + "\\include\\libxml2")) {
xsl/config.w32:9:       && CHECK_HEADER_ADD_INCLUDE("libxml/tree.h", "CFLAGS_XSL", PHP_PHP_BUILD + "\\include\\libxml2")
zip/config.w32:6:       if (CHECK_HEADER_ADD_INCLUDE("zip.h", "CFLAGS_ZIP", PHP_PHP_BUILD + "\\include;" + PHP_EXTRA_INCLUDES) &&
zip/config.w32:7:               CHECK_HEADER_ADD_INCLUDE("zipconf.h", "CFLAGS_ZIP", PHP_PHP_BUILD + "\\lib\\libzip\\include;" + PHP_EXTRA_LIBS + "\\libzip\\include;" + PHP_ZIP) &&
kjdev commented 1 year ago

I'm not going to fix it because it's not a problem in the build of the extension using phpize

I wonder if the following is a php-src extension that does something similar

standard/config.w32:CHECK_HEADER_ADD_INCLUDE("timelib_config.h", "CFLAGS_STANDARD", "ext/date/lib");

Checking for the presence of another extension's header.

nono303 commented 1 year ago

I'm not going to fix it because it's not a problem in the build of the extension using phpize

Understand for linux build (config.m4) but could you give me your phpize command line on Windows? Because as far as I know, phpize doesn't exist for Windows and buildconf must be use instead (what I'm do and what is failing) cf. https://blog.benoitblanchon.fr/build-php-extension-on-windows/ /

kjdev commented 1 year ago

In ci we build as follows.

https://github.com/kjdev/php-ext-zstd/blob/master/.github/workflows/build.ps1

$task = New-Item 'task.bat' -Force
Add-Content $task 'call phpize 2>&1'
Add-Content $task "call configure --with-php-build=C:\php\deps --enable-$env:PHP_EXT --enable-debug-pack 2>&1"
Add-Content $task 'nmake /nologo 2>&1'
Add-Content $task 'exit %errorlevel%'
& "C:\php\php-sdk-$env:BIN_SDK_VER\phpsdk-$env:VC-$env:ARCH.bat" -t $task

I don't remember where the reference was.

dixyes commented 1 year ago

link #52