params
shimookaさんのトコで紹介があったので、少し試してみようかと思ったのですが。。。
% cd /usr/local/src % gzip -dc ./php-4.4.7.tar.gz | gtar xf - % cd ./php-4.4.7/ext % gzip -dc ../../params-1.0.tgz | gtar xf - % mv ./params-1.0 ./params % cd ../ % rm ./configure % ./buildconf --force % ./configure --disable-all --enable-params % make ext/params/php_params.o: In function `zif_params_parse': /usr/local/src/php-4.4.7/ext/params/php_params.c:131: undefined reference to `STR_EMPTY_ALLOC' collect2: ld returned 1 exit status make: *** [sapi/cgi/php] Error 1
「STR_EMPTY_ALLOC」って何ですか。。。_| ̄|○
そろそろサポート終了になるような環境で試すなよ、という事ですか。
でもね。「PHP Version: PHP 4.0.0 or newer」って書いてあったんです。ぐすん。
このまま終わるのも悔しかったので、ちょっとだけ深追い(現実逃避とも言う)。ハマってる証拠ですね。
5.2.5を対象に「STR_EMPTY_ALLOC」の定義を確認してみました。
% grep -rn STR_EMPTY_ALLOC /usr/local/src/php-5.2.5 /usr/local/src/php-5.2.5/ext/sybase_ct/php_sybase_ct.c:464: SybCtG(server_message) = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/sybase_ct/php_sybase_ct.c:1338: result->fields[i].column_source = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/standard/reg.c:462: pattern = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/standard/reg.c:474: replace = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/standard/reg.c:486: string = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/standard/html.c:1143: return STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/standard/math.c:760: return STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/standard/math.c:787: return STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/standard/math.c:798: return STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/wddx/wddx.c:707: Z_STRVAL_P(ent.data) = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/wddx/wddx.c:717: Z_STRVAL_P(ent.data) = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/sqlite/sess_sqlite.c:118: *val = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/sybase/php_sybase_db.c:289: php_sybase_module.server_message = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/sybase/php_sybase_db.c:883: result->fields[i].column_source = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/session/session.c:1205: REGISTER_STRINGL_CONSTANT("SID", STR_EMPTY_ALLOC(), 0, 0); /usr/local/src/php-5.2.5/ext/session/session.c:1561: old = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/session/mod_files.c:370: *val = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/pcre/php_pcre.c:1173: /* FIXME: This might need to be changed to STR_EMPTY_ALLOC(). Check if this zval could be dtor()'ed somehow */ /usr/local/src/php-5.2.5/ext/mssql/php_mssql.c:1101: result->fields[i].column_source = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/pgsql/pgsql.c:1684: return STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/odbc/php_odbc.c:1428: Z_STRVAL_P(tmp) = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/odbc/php_odbc.c:1434: Z_STRVAL_P(tmp) = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/odbc/php_odbc.c:1587: Z_STRVAL_P(tmp) = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/ext/odbc/php_odbc.c:1593: Z_STRVAL_P(tmp) = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/sapi/isapi/php5isapi.c:375: return STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/Zend/zend_API.h:480: (z)->value.str.val = STR_EMPTY_ALLOC(); \ /usr/local/src/php-5.2.5/Zend/zend_operators.c:543: op->value.str.val = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/Zend/zend_operators.c:553: op->value.str.val = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/Zend/zend_alloc.h:124:#define safe_estrdup(ptr) ((ptr)?(estrdup(ptr)):STR_EMPTY_ALLOC()) /usr/local/src/php-5.2.5/Zend/zend_alloc.h:125:#define safe_estrndup(ptr, len) ((ptr)?(estrndup((ptr), (len))):STR_EMPTY_ALLOC()) /usr/local/src/php-5.2.5/Zend/zend_execute.c:187: ptr->value.str.val = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/Zend/zend.c:205: expr_copy->value.str.val = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/Zend/zend.c:213: expr_copy->value.str.val = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/Zend/zend.c:254: expr_copy->value.str.val = STR_EMPTY_ALLOC(); /usr/local/src/php-5.2.5/Zend/zend.h:498:#define STR_EMPTY_ALLOC() estrndup("", sizeof("")-1)
最後の行に注目。なる程ねぇ。
「STR_EMPTY_ALLOC」の定義がいつから入ったのか調べてみましたが、5.1.0からのようです(5.0.5・5.1.0<1・2・3>)。
params側で(丁度良い感じに)バージョンを判定している箇所があったので、その位置に埋め込んでみました。
--- params-1.0,orig/php_params.c 2007-11-13 20:46:00.000000000 +0900 +++ params-1.0/php_params.c 2007-11-16 17:46:53.000000000 +0900 @@ -61,6 +61,7 @@ # define PHP_PARAMS_INT_CAST (int)(zend_uintptr_t) #else # define PHP_PARAMS_INT_CAST (ulong) +# define STR_EMPTY_ALLOC() estrndup("", sizeof("")-1) #endif static inline int php_params_get_args(int *pargc, zval ***pargv TSRMLS_DC)
このパッチを適用する事でビルド&実行できるようになりました。わーい。
4.4.7、5.0.4、5.1.0、5.1.1、5.2.3、5.2.5で確認済みです。適用してもらうのも微妙だけど、一応報告だけはしておこうかな。。。
ただ、shimookaさんも仰っているようにグレイトな用途が思いつかない。。。(w