まえおき
Xcodeを過信してたらRubyから苦情もらった(docker-sync動かないorz) - https://qiita.com/CeMoReOn/items/9abb837727af5594fc0f
っていうタイムリーな記事があったので、これは rbenvとかhomebrew経由でRuby入れないとダメなのかなー・・・と思っていたけど、
Mac付属のRubyでも一応動いたのでメモっとく。
ちなみに、次のMacバージョンからそもそもRubyが付属しなくなるという噂 もあるので、この記事の賞味期限はきっとかなり短いだろう。
OSをアップデートした直後
$ docker-sync-stack start
-bash: /usr/local/bin/docker-sync-stack: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: bad interpreter: No such file or directory
前評判のとおり、こんなかんじのエラーは出る。
$ which ruby
/usr/bin/ruby
$ ls -l /usr/bin/ruby
-r-xr-xr-x 1 root wheel 36624 9 30 05:28 /usr/bin/ruby
Rubyのバイナリ自体はある。
$ ls /System/Library/Frameworks/Ruby.framework/
Resources/ Ruby Versions/
$ ls /System/Library/Frameworks/Ruby.framework/Versions/2.6/
Resources/ Ruby _CodeSignature/ usr/
このあたりで、「あー、Ruby 2.3じゃなくなったのね」と察しがつく。
docker-syncを入れ直す
$ sudo gem uninstall docker-sync
$ sudo gem install docker-sync
$ docker-sync-stack start
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/include/ruby.h
You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.
エラーの種類が変わった。
エラー文言でぐぐると
xcode-select --install
とか xcodebuild ...
みたいなコマンド叩くといいみたいなのが出てくるが、環境によっては多分それでは無理っぽい。(自分の場合はうまくいかなかった)
Xcode 11にする
これは実際に関係あるのかどうかわからないが、
とりあえず xcode-select --install
→ xcodebuild ...
を叩くだけではXcode11にはならない。
なので、App StoreからXcode 11を落としてくる。
ついでに、AppleのDeveloper向けサイトからコマンドラインツールも落としてくる。
11になったことを確認。
そもそものエラーの出どころを見てみる
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/include/ruby.h
You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.
これはそもそもdocker-syncに関係のないエラーだ。ということで、エラーの出どころを見てみる。
topdir = File.dirname(File.dirname(__FILE__))
path = File.expand_path($0)
until (dir = File.dirname(path)) == path
if File.identical?(dir, topdir)
$extmk = true if %r"\A(?:ext|enc|tool|test)\z" =~ File.basename(path)
break
end
path = dir
end
$extmk ||= false
if not $extmk and File.exist?(($hdrdir = RbConfig::CONFIG["rubyhdrdir"]) + "/ruby/ruby.h")
$topdir = $hdrdir
$top_srcdir = $hdrdir
$arch_hdrdir = RbConfig::CONFIG["rubyarchhdrdir"]
elsif File.exist?(($hdrdir = ($top_srcdir ||= topdir) + "/include") + "/ruby.h")
$topdir ||= RbConfig::CONFIG["topdir"]
$arch_hdrdir = "$(extout)/include/$(arch)"
else
abort <<MESSAGE
mkmf.rb can't find header files for ruby at #{$hdrdir}/ruby.h
You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.
MESSAGE
end
RbConfig::CONFIG["rubyarchhdrdir"]
RbConfig::CONFIG["topdir"]
あたりがキモのようだ。
このキーワードでぐぐると
こんなページが出てきた。
$ ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0
ruby ruby.h universal-darwin19
お、ちゃんと ruby.h
あるじゃん?
ってことはいけるんじゃね?
あらためてdocker-syncしてみる
$ docker-sync start
ok Starting unison for sync panel-workspace-sync
あ、動いたw
まとめ
- docker-syncをインストールしなおす
- Xcode 11 + コマンドラインツール 11にする
で解決したのかなぁ・・・
(どこが解決ポイントだったのかは自分でもわかっていない)