简短版本
为什么这个未修改的代码来自官方 PHP 5.6.18 版本:
--SKIPIF--
<?php
if (phpversion() < "5.3.0") { die('SKIP php version so lower.'); }
if (!extension_loaded('openssl')) { die('ext/openssl required'); }
if(substr(PHP_OS, 0, 3) != 'WIN' ) {
die('skip windows only test');
}
?>
。不会导致我在 Arch Linux 上构建 PHP 软件包时跳过仅限 Windows 的测试?
长版本
我正在尝试使用官方 Arch 构建系统中的 PKGBUILD 构建 PHP5.6.18。这是我所做的:
-
git clone git://projects.archlinux.org/svntogit/packages.git
- 我浏览了 php 包的 git 历史记录,并将此提交确定为最佳起点 - 基本上是 uprev 到 PHP7 之前的最后一次提交。所以,我cd到
packages
,并git checkout
提交ID。 - 我像这样更新了PKGBUILD:
- 设置
pkgver=5.6.18
- 设置
pkgrel=1
- 将第一个 md5sum 设置为
'177ba962557795866ae331ad4ad99bba'
- 设置
- 设置干净的 chroot 用于构建(这将测试失败从 2-3 减少到 1)
- 构建 php:
makechrootpkg -c -r $CHROOT
(在包含PKGBUILD
文件的目录中。
构建工作正常,但我得到以下测试失败:
Number of tests : 6651 6180
Tests skipped : 471 ( 7.1%) --------
Tests warned : 1 ( 0.0%) ( 0.0%)
Tests failed : 1 ( 0.0%) ( 0.0%)
Expected fail : 9 ( 0.1%) ( 0.1%)
Tests passed : 6169 ( 92.8%) ( 99.8%)
---------------------------------------------------------------------
Time taken : 45 seconds
...
FAILED TEST SUMMARY
---------------------------------------------------------------------
mixed stream_socket_enable_crypto(resource $stream , bool $enable [, int $crypto_type [, resource $session_stream
]] ) ; [ext/standard/tests/streams/stream_socket_enable_crypto-win32.phpt]
=====================================================================
=====================================================================
WARNED TEST SUMMARY
---------------------------------------------------------------------
Bug #70172 - Use After Free Vulnerability in unserialize() [ext/standard/tests/serialize/bug70172.phpt] (warn: XFA
IL section but test passes)
=====================================================================
好的,所以win32
在文件名中已经看起来很可疑,并且查看文件内容确实表明应该在 Linux 上跳过测试:
--TEST--
mixed stream_socket_enable_crypto(resource $stream , bool $enable [, int $crypto_type [, resource $session_stream ]] ) ;
...
--SKIPIF--
<?php
if (phpversion() < "5.3.0") { die('SKIP php version so lower.'); }
if (!extension_loaded('openssl')) { die('ext/openssl required'); }
if(substr(PHP_OS, 0, 3) != 'WIN' ) {
die('skip windows only test');
}
?>
请注意PHP_OS
相关的检查。所以,我在想,也许PHP_OS以某种方式获得了错误的值。所以,我:
- 手动进入构建 chroot:
arch-nspawn $CHROOT/$USER/
- 添加
echo substr(PHP_OS, 0, 3)
到该测试的开头(就在--FILE--
部分中的<?php
下方,以及实际的stream_socket_enable_crypto-win32.php
文件中) - 使用同一目录中的
stream_socket_enable_crypto-win32.sh
脚本重新运行它,我确实看到了预期的Lin
输出。
为什么不跳过此测试?我真的很困惑。如何解决此问题?
作为一种解决方法,现在我只删除PKGBUILD
文件的prepare()
部分中的测试:
prepare() {
cd ${srcdir}/${pkgbase}-${pkgver}
# ....
# add this line:
rm ./ext/standard/tests/streams/stream_socket_enable_crypto-win32.phpt
}
如果 M01 能让我们知道他编辑的 PKGBUILD 文件的名称,这样我也可以看看,那就太好了。
但在此之前,只需打开此文件:
/usr/src/php/ext/standard/tests/streams/stream_socket_enable_crypto-win32.phpt
并找到如上所示的这一行。
只需注释掉这一行,如果有人仍在运行 php 5.3,无论如何他们都应该被涂上柏油和羽化,哈哈。
//commented out by dave due to bug and should be skipped
//if (phpversion() < "5.3.0") { die('SKIP php version so lower.'); }