记一次失败的Mac10.15覆盖编译PHP
由于一些众所周知的原因,macos历届版本在内置的php环境中均没有完整的gd库支持(freetype)
一般在使用macos做开发时,要么另外配置一套php的执行环境,要么重新编译来修复默认版本的问题。
当然,现在比较流行的docker也是一种解决方案。
另外配置环境,在macos10.15之前,brew安装的方式比较方便。
最近由于使用macbook临时做flutter开发和编译工作,需要升级系统和xcode才能支持,被迫升级了10.15,之后便开始了折腾之路。
brew依然在,但是执行
brew install php@7.3
之后提示的
让我心凉了一半,也不知道是老家这网络问题,还是真的用不了,安装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后编译通过了