Intro

开始使用M1的新苹果本有一段时间了,原本想着可以为open source做点贡献。 就好像曾经为字幕组做贡献一样。(当然,我做的字幕组是合法的无偿字幕组) 不过看起来并不是一帆风顺,M1本身在系统层面上(目前系统版本是11.2.1)仍旧是死机频繁发生(相对比之前的macbook), 并不是一个稳定的系统。开源方面对M1的对应从2020年夏天苹果开始announce起,就一直在为M1的ARM CPU做着工作。

下面这个列表就是homebrew对于M1 ARM CPU对应的列表,这个列表在实时的更新。
https://github.com/Homebrew/brew/issues/7857

当然很多很基础的工作还没有完成。比如由于M1对应的GCC默认是CLANG,导致NEOVIM无法在M1上面进行编译。 (https://github.com/Homebrew/brew/issues/7857#issuecomment-687068494)

当然语言的编译器方面的支持一直都走在了前面,譬如nodejs的v8(仅支持ver15以后) https://www.reddit.com/r/apple/comments/jyfg4m/nodejs_running_native_on_apple_silicon_m1_mac_mini/
https://github.com/nodejs/node/blob/master/BUILDING.md#platform-list
https://github.com/nodejs/build/issues/2474
https://github.com/nodejs/build/issues/2474#issuecomment-753786552

由于苹果的bug频出,我目前体验到的就是firefox和苹果底层的不兼容,经常会内存溢出,而导致系统重启。 众所周知firefox用rust来写,只有内存占用过度,很难出现内存溢出的情况。所以这个锅,firefox也真的很难背。

而bug频出的结果就是更新频繁,每次更新都要动辄好几个G,而比较让人抓狂的一点就是,每次更新之后,可能由于是较大更新的缘故, 每次git都会挂掉 = =||| 然后我就要敲下面重新安装cli版本的xcode来解决问题。

xcode-select --install

Jekyll

不得不说整个ruby社区都非常的活跃。 在mac框架下,homebrew俨然成为了标配。虽然有macport这个竞争者的存在,但是macport在M1上面连安装都办不到,它还要许多的sudo权限,最后删除的时候也是费尽周折还要按照官网上面的方式去手动删除。 不得不让我想起了我曾经用过的一个国产开源mail系统,仅限ubuntu才能安装,手动编译安装完之后没办法卸载。我去github找他的源代码,上面有个issue里面有人提问如何删除,可以提供脚本吗? 原作者回道:这个装的东西比较多,还是不要删了吧。 我只好把整个系统都卸载掉才做到了完美卸载。

我这个blog使用jekyll写的,所以我要先在M1上面把jekyll的环境配置好。

先用gem来装一下bundler和jekyll

gem install bundler jekyll

然后敲一下jekyll好了

$ jekyll
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': dlopen(/Library/Ruby/Gems/2.6.0/gems/ffi-1.14.2/lib/ffi_c.bundle, 0x0009): missing compatible arch in /Library/Ruby/Gems/2.6.0/gems/ffi-1.14.2/lib/ffi_c.bundle - /Library/Ruby/Gems/2.6.0/gems/ffi-1.14.2/lib/ffi_c.bundle (LoadError)

似乎跑不起来,我gem重装一下看看。

$ gem update

Parsing documentation for libxml-ruby-3.2.1
Before reporting this, could you check that the file you're documenting
has proper syntax:

  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -c ext/libxml/extconf.rb

RDoc is not a full Ruby parser and will fail when fed invalid ruby programs.

The internal error was:

        (NoMethodError) undefined method `[]' for nil:NilClass

ERROR:  While executing gem ... (NoMethodError)
    undefined method `[]' for nil:NilClass

怎么gem也好像坏了,感觉是M1原生的ruby的哪里起了冲突。我用brew装一下好了

$ brew update

/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': dlopen(/Library/Ruby/Gems/2.6.0/gems/date-3.1.1/lib/date_core.bundle, 0x0009): missing compatible arch in /Library/Ruby/Gems/2.6.0/gems/date-3.1.1/lib/date_core.bundle - /Library/Ruby/Gems/2.6.0/gems/date-3.1.1/lib/date_core.bundle (LoadError)
Failed during: /opt/homebrew/bin/brew update --force --quiet

算了我试试ruby好了,结果ruby也坏了(编译器是好的)

$ ruby -v 
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.arm64e-darwin20]
$ irb -v
	 1: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/specification.rb:1449:in `block in activate_dependencies'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/dependency.rb:313:in `to_specs': Could not find 'io-console' (~> 0.5) - did find: [io-console-0.4.7] (Gem::MissingSpecVersionError)
Checked in 'GEM_PATH=/Users/candy/.gem/ruby/2.6.0:/Library/Ruby/Gems/2.6.0:/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/gems/2.6.0', execute `gem env` for more information

Fix

我方了,在网上随便查了下,看到有这样的解决方案,的确是我预估的一样,起了冲突 删掉几个gem装的包就可以了

https://github.com/Homebrew/discussions/discussions/716

$ sudo /usr/bin/gem uninstall date etc io-console bigdecimal

果然brew就被修好了

$ brew 
Example usage:
  brew search [TEXT|/REGEX/]
  brew info [FORMULA...]
  brew install FORMULA...
  brew update
  brew upgrade [FORMULA...]
  brew uninstall FORMULA...
  brew list [FORMULA...]

那这样的话,只好把ruby升级,然后完全用新的ruby来做了。 先看看homebrew支不支持新的ruby,支持的话就不用从源代码来编译了。

https://github.com/Homebrew/brew/issues/7857

看起来是支持的,而且是Tier1的支持。 那就简单了

$ brew install ruby

安装成功后会给出提示信息,所以在.zshrc里面,过一下环境变量,让新的ruby优先于原本的ruby

export PATH=/opt/homebrew/opt/ruby/bin:$PATH:/opt/homebrew/bin

确认一下jekyll的位置,所有的东西都重装

$ which gem                        
/opt/homebrew/opt/ruby/bin/gem
$ which jekyll                     
/usr/local/bin/jekyll
$ sudo /usr/bin/gem uninstall bundler jekyll     
Removing jekyll
Successfully uninstalled jekyll-4.2.0
Successfully uninstalled bundler-2.2.9
$ gem install bundler jekyll

jekyll和bundler装好了,问题是jekyll又找不到了,醉了

$ jekyll
zsh: command not found: jekyll

看看bundler在哪里

$ which bundler  
/opt/homebrew/opt/ruby/bin/bundler

bundler就没问题

只好用搜索大法查找一下了

$ tree /opt/homebrew | grep jekyll    
│       │       │   ├── jekyll

$ find /opt/homebrew -name "jekyll" 
/opt/homebrew/lib/ruby/gems/3.0.0/bin/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/doc/jekyll-4.2.0/ri/lib/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/gems/jekyll-watch-2.2.1/lib/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/gems/jekyll-sass-converter-2.1.0/lib/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/gems/jekyll-4.2.0/rubocop/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/gems/jekyll-4.2.0/lib/jekyll
/opt/homebrew/lib/ruby/gems/3.0.0/gems/jekyll-4.2.0/exe/jekyll

再把.zshrc里面的环境变量改一下

export PATH=/opt/homebrew/lib/ruby/gems/3.0.0/bin:/opt/homebrew/opt/ruby/bin:$PATH:/opt/homebrew/bin

大功告成。最后把Gemfile.lock删掉,因为里面有些旧的版本号是不支持M1的,然后

$ bundler install

End

用了brew的ruby就是很舒服,安装gem不用再一直使用sudu权限了。也不知道gem是怎么配置的,如何就自己找了个对的位置。


creativ common license