记一次失败的Mac10.15覆盖编译PHP

由于一些众所周知的原因,macos历届版本在内置的php环境中均没有完整的gd库支持(freetype)

一般在使用macos做开发时,要么另外配置一套php的执行环境,要么重新编译来修复默认版本的问题。

当然,现在比较流行的docker也是一种解决方案。

另外配置环境,在macos10.15之前,brew安装的方式比较方便。

最近由于使用macbook临时做flutter开发和编译工作,需要升级系统和xcode才能支持,被迫升级了10.15,之后便开始了折腾之路。

brew依然在,但是执行

brew install php@7.3

之后提示的

1583819608742629.png

让我心凉了一半,也不知道是老家这网络问题,还是真的用不了,安装httpd依赖时一直提示curl的404错误下载不上

只能放弃这个办法了。

下面是一次失败的覆盖编译之路,细节就不再写了,只列一下步骤和问题。

解决方案来自覆盖编译MacOS10.15-1内置PHP-7.3.9

1.

先修改系统的文件权限,否则无法链接出include目录和编译安装写入

注:Mac Big Sur(11.01)版本无效
重启电脑,按住Cmd+R 进入恢复模式
打开命令行,输入 csrutil disable
重启电脑,命令行输入 sudo mount -uw / (用于打开系统目录的写入权限,重新后失效)
将include目录做一个链接
sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/ /usr

2.

由于个人比较习惯apache的模块方式(伪静态配置方便),需要先编译安装一个httpd 来使用它的apxs

还有apr, apr-util (httpd依赖), freetype (php-gd依赖,折腾就是为的这个)

依次 下载源码编译安装,编译httpd时注意加上 --enable-so选项.

3.

安装开发需要的工具等

brew install autoconf

4.

当前php7.3最新版本是7.3.15,首先在官网下载源码,解压到某个目录

然后就是按照系统原来的编译参数重新做编译操作

我这里加上 --enable-sokets参数时,会提示php源码中的sokets相关文件的代码语法错误,也没精力搞明白原因了,暂时去掉该选项


make install时要加上sudo ,会把对应文件安装到系统级别的目录中,来覆盖自带的那个版本。

带 --with-apxs2=<编译的httpd目录>/bin/apxs时编译完成会把 libphp7.so也编译出来,找到文件位置,把该文件修改到系统默认的httpd配置里

这样cli和httpd中的php版本就一致了。


5.

由于网络不理想,过程中反反复复折腾了也有一天多

当php -v 和php -m 还有phpinfo() 显示的输出都符合预期,本以为就大功告成了。

进系统测试报了个

Call to undefined function glob

这一刻,真的想摔电脑了。

检测了一下,file_get_contents等函数均不支持了(部分文件系统函数支持)。

这还怎么TMD用啊!


等回去网络好点了再折腾重新编译吧。


docker走起!


2020.4 后记:重新编译安装了libiconv后编译通过了