首页 > 其他分享 >Osx10.14升级watchman踩坑记

Osx10.14升级watchman踩坑记

时间:2022-12-19 21:31:29浏览次数:67  
标签:__ 坑记 fs watchman 编译 版本 brew Osx10.14

背景

使用 ​​watchman​​ 检测文件变化通知非常的好用, 但有些时候会出现 watchman 占用内存和 CPU 特别疯狂, 通过 ​​watch-del​​ 也无济与事, 由于 watchman 的版本 2021.09.13 比较老, 于是就想着升级一下版本.

正常来说, 在 mac 下使用 ​​brew upgrade​​ 升级非常的简单, 但是我的 OS 系统版本比较老, 一直使用的是 10.14 的 Mojave ( 之前也升级过 Bigsur, 后面因为休眠问题又退回了) . 众所周知, 官方已经不维护这个系统版本了, 所以 brew 上安装和更新软件也特别麻烦, 不能使用 bottle 安装已编译好的二进制, 必须要自己编译安装, 不光编译时间是个问题, 而且编译失败的概率也很高.

趁着周末的时间, 于是就准备通过 brew upgrade 升级 watchman, 但是杯具也是从这里开始了.

升级 watchman

  • 首先更新 brew 的 formula 仓库, 把相关软件的版本和依赖数据库更新.
brew update
  • 更新 watchman
brew upgrade watchman

# output
==> Would upgrade 1 outdated package:
watchman 2021.09.13.00 -> 2022.12.12.00
==> Would install xx dependencies for watchman:
folly 2021.09.13.00 -> 2022.12.12.00 edencommon 2022.12.12.00 fizz 2021.09.13.00 -> 2022.12.12.00 wangle 2021.09.13.00 -> 2022.12.12.00 fbthrift 2021.09.13.00 -> 2022.12.12.00 fb303 2022.12.12.00

...

结果就是漫长的等待, 一堆一堆的依赖软件编译和安装, 包含 rust 和 llvm 这些大型软件, 结果整整编译了半天才编译完这些大型软件, 到最后编译 folly 时候居然失败了.

"std::__1::__fs::filesystem::path::__filename() const", referenced from:

std::__1::__fs::filesystem::path::operator/=[abi:v15006](std::__1::__fs::filesystem::path const&) in AsyncBase.cpp.o

"std::__1::__fs::filesystem::path::__root_directory() const", referenced from:

std::__1::__fs::filesystem::path::operator/=[abi:v15006](std::__1::__fs::filesystem::path const&) in AsyncBase.cpp.o

"std::__1::__fs::filesystem::path::lexically_normal() const", referenced from: folly::fs::lexically_normal_fn::operator()(std::__1::__fs::filesystem::path const&) const in Filesystem.cpp.o

"std::__1::__fs::filesystem::__read_symlink(std::__1::__fs::filesystem::path const&, std::__1::error_code*)", referenced from: folly::AsyncBaseOp::fd2name(int) in AsyncBase.cpp.o

通过分析 debug 的编译日志, 编译应该都是成功的, 但在最后链接的时候失败了. 通过查询相关的资料得知, filesystem 相关的函数是定义在 <filesystem.h> 头文件中的, 这个头文件在 Xocde 11.x 版本有定义, 但是系统的支持应该是在 10.15 的版本才能支持. 而我的 Xocde 版本确实是 11.3.1, 所以在编译时没出错, 但在链接的阶段失败了 .

# 查看当前的 xocde 版本
➜ xcodebuild -version

# output
Xcode 11.3.1
Build version 11C505

尝试方案

基于其它版本的 folly 编译

既然 2022.12.12.00 版本编译安装失败, 那就尝试指定其它的版本编译, 可以通过 ​​https://formulae.brew.sh/​​ 找到 folly 其它版本的 formula 文件. 具体步骤如下:

Osx10.14升级watchman踩坑记_homebrew

把指定版本 ​​watchman.rb​​ 下载后, 通过 brew 指定 rb 文件编译.

brew install -s -v -d watchman.rb

但是不幸的是, 还是编译错误. 换了多个版本折腾了半天, 还是会出现各种各样的编译错误, 没法了, 这条路是行不通了.

还原版本也不容易

既然无法成功更新 watchman 版本, 那打算接着使用原始的版本吧, 但问题又是一堆一堆的, 不让人安心了.

但当我执行 watchman 命令, 系统居然提示找不到这个命令了. 查看 ​​/usr/local/bin/​​ 目录, 确实没有 watchman 的链接文件了, 应该是执行 brew upgrade 时, 会取消掉原来版本的链接.
那就通过 ​​brew link​​ 重新链接吧.

brew link watchman

重新链接后命令是回来了, 但是执行后系统会提示如下错误:

➜  Cellar watchman -h

# output
dyld: Library not loaded: /usr/local/opt/glog/lib/libglog.0.dylib
Referenced from: /usr/local/bin/watchman
Reason: image not found
[1] 11397 abort watchman -h

应该是之前更新依赖时, 把依赖库的版本升级了, 而原来版本的 watchman 无法找到老版本的依赖库了. 但当时更新了那么多的依赖库, 谁也不知道哪些库会不兼容, 看来只能走一步算一步, 人肉把出错的依赖库链接一个一个还原了.

# 查询链接的版本
➜ ls -l /usr/local/opt/ | grep glog
lrwxr-xr-x 20 guoxiangxun 19 Dec 16:13 glog -> ../Cellar/glog/0.6.0

# 删除连接版本
➜ cd /usr/local/opt
➜ rm glog

# 重新连接版本
➜ ln -s ../Cellar/glog/0.5.0 glog

其它还包含依赖库 llvm, fmt, icu4c, boost 等, 全部都要重新连接到原始版本. 如:

ln  -s ../Cellar/llvm/13.0.1_1 llvm
ln -s ../Cellar/fmt/8.1.1_1 fmt
ln -s ../Cellar/icu4c/70.1 icu4c
ln -s ../Cellar/boost/1.78.0_1 boost

最终 watchman 版本终于还原成功, 能正常执行了. 但问题应该还没有结束, 后面看其它软件有哪些升级的依赖还需要还原吧, 因为 watchman 依赖库太多了. 可以通过 ​​brew deps​​ 看看, 具体的就不列出来了.

➜ brew deps --tree --installed watchman

# output
watchman
├── boost
│ ├── icu4c
│ ├── xz
│ └── zstd
│ ├── lz4
│ └── xz
├── edencommon
│ ├── folly
│ │ ├── boost
│ │ │ ├── icu4c
│ │ │ ├── xz
│ │ │ └── zstd
│ │ │ ├── lz4
│ │ │ └── xz
│ │ ├── double-conversion
│ │ ├── fmt

... more and more
... more and more

总结

针对系统不维护的系统版本, 尽量还是不要通过 brew upgrade 升级吧, 花费的编译时间长不说, 而且编译问题也是一堆一堆的, 到最后还原版本也不容易, 最好的方式还是升级系统或者将就着使用吧.

实在要更新的话, 先要先看下要更新软件所依赖的库的数量再决定, 如果要更新的依赖库太多的话, 风险可能更大. 可以 upgrade 时加上​​-n​​ 参数测试下, 更新时把相关的日志记录下来, 究竟更新了哪些库的哪些版本, 以便于搞不定时还原.

References

标签:__,坑记,fs,watchman,编译,版本,brew,Osx10.14
From: https://blog.51cto.com/u_1312487/5953876

相关文章

  • ceph - Nautilus 踩坑记
    RGW编译rgw_file_marker时报错错误信息同BUILD_ERROR.txt.解决方法:合入nautilus:test/ceph_test_librgw_file*:Removeduplicatenames#43491这个PR。......
  • Taro踩坑记之React-Native环境教程
    Taro踩坑记之React-Native环境教程LaxusJ关注0.9892019.07.2722:56:55字数424阅读10,841当前环境TaroCLI1.3.10environmentinfo:System:OS:macOS10.14.......
  • Hexo+NexT8.1+Waline踩坑记录
    说明:由于NexT8.1.0移除了对valine的内置支持,转而使用waline。在配置的过程中踩的一些坑。1.waline官方网址https://waline.js.org/2.注册LeanCloudLeanCloud地址:ht......
  • 踩坑记录:Redis的lettuce连接池不生效
    踩坑记录:Redis的lettuce连接池不生效一、lettuce客户端lettuce客户端Lettuce和Jedis的都是连接RedisServer的客户端程序。Jedis在实现上是直连redisserver,多线程环......
  • nvm node版本管理工具踩坑记录
    nvm 安装包下载地址:https://github.com/coreybutler/nvm-windows/releases  下载后双击安装注意事项 1、如果已经安装过nodejs请先卸载2、如果计算机属性环境......
  • Rsync报错踩坑记录(一):一次小疏忽引发的麻烦及新手会遇到的三种常见报错原因
    Rsync报错踩坑记录(一)1.三种常见报错原因之一:防火墙问题造成该报错的原因是:客户端和服务端防火墙未放行873端口具体会出现如下错误提示:rsync:failedtoconnectto......
  • 基于winds10 安装docker 踩坑记录
    1.官方下载https://www.docker.com/2.根据提示安装并重庆计算机3.双击运行 报 DockerDesktopisshuttingdown提示 计算机c:盘 AppData\Roaming\Docker “D......
  • PaddleOCR 2.6 编译详细步骤 + 踩坑记录(C++ GPU版)
    导读本文主要介绍PaddleOCRv2.6C++GPU版的编译详细步骤与踩坑记录,方便大家快速上手。(公众号:OpenCV与AI深度学习)PaddleOCR2.6  8月24日PaddleOCR更新了2.6版本,下面......
  • python multiprocessing使用容易遇到的坑记录随笔
    python因为有GIL(GlobalInterpreterLock)锁的问题,所以在计算密集型程序中,推荐使用multiprocessing多进程编程。在使用multiprocessing创建子进程时,很容易遇到一个不易发现......
  • C# luainterface luanet踩坑记录
      //C#调用dll传递c回调函数模板格式//LuaInterface.LuaDLL;using LuaInterface;publicpartialclassxxx{//......//C#默认情况下委托都是......