DEV/잡다한 개발 일지

M1 MacOS Ventura ruby build failed error (Feat. XCode 14)

jobchae 2023. 1. 18. 00:33

이 글이 도움이 될 만한 경우

해당 경우가 아니면 다른 글을 찾는게 더 빠를지도 모릅니다.

1. 최근 MacOS Ventura 업데이트 후 ruby 가 이상해졌다. (XCode도 14로 업데이트 했다.)
2. 터미널에 gem 이나 ruby 관련 명령어를 입력 시 architecture 문제가 뜬다 (주로 arm64 나 x86_64)

들어가며

2022년에 MacOS ventura 가 릴리즈 되었다. "OS 는 최신이지 ~ "

릴리즈 기능 중 스테이지 매니저가 신선해서 바로 써보려고 OS 업데이트를 진행했다.

하지 말았어야 해

띠용 (?)

어느날부터 터미널을 키면 상단에 어마 무시한 에러가 뜨곤 했다. 

고치는 도중이라 원래는 더 많았다 ;;

저렇게 gem pristine 을 하라는 글이 수도없이 떴다. 대충 ruby가 뭔가 꼬였구나 직감했다. 

하지만 gem pristine 을 하려니까 두번째처럼 reinstall ruby 메시지를 뱉었다.

생코에 질문도 처음 남겼다 ㅜ..

처음 오류를 마주치자 마자 구글링을 했지만 크게 도움이 될만 한 글이나 Issue가 보이지 않았다.

그렇게 몇달 간 이 오류를 무시하다가 오늘 React Native 프로젝트 생성 시 Cocoapods 가 제대로 동작하지 않는 걸 발견하고 큰 맘 먹고 구글링 사투 끝에 해결한 방법을 공유해보려 한다.

원인 찾기

제일 먼저 ruby-build issue를 검색했다. 

2020년 12월 글이라 읽어보기만 했다.

주로 이런류의 해결법이 다인데 나에게 전혀 도움되지 않았으니 같은 상황이시라면 해보지 말고 넘어갑시다. 

아래쪽으로 내리면 x86_64와 arm64 아키텍처 충돌이라는 내용이 있는데 혹시나 하고 터미널로 돌아와서 오류를 정독해보았다.

아주 친절하게 오류에서 강조 표시를 해둔 부분이 있었다.

have 'x86_64', need 'arm64' 

나는 m1 맥북이 처음 나왔던 시절 쯤 구매를 해서 그때 상태 그대로 로제타로 터미널을 열고, intel 에 맞는 homebrew 를 쓰고 있기에,  ruby, gem 도 x_86_64 에 맞춰져 있는게 원인인 듯 싶었다.

터미널에 uname -m 을 입력해보시면 x86_64 인지 arm64인지 나온다. 아마도 로제타를 통해 연다면 x86_64 일것이다.

터미널에 아래 명령어 입력 시 brew 위치가 나오는데, 해당 위치면 구버전이니 새로 갈자!

$ which brew
/usr/local/bin/brew

 

해결해보자 - arm64

맥북 파인더에서 [응용 프로그램] -> [iTerm] 우클릭 -> [정보 가져오기] -> [Rosetta를 사용하여 열기] 체크 해제

이러고 iTerm 종료 후 재시작하면 arm64 로 변경될 것이다.

 

이제 기존 x86_64 homebrew 를 삭제하고 arm64 아키텍쳐에 맞는 최신 버전을 설치해보자

 

삭제 명령어를 입력하자

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"

터미널에 brew 를 입력해서 command not found 가 나올때까지 계속 반복해서 삭제하면 된다.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

다시 설치해주면 최신 homebrew 가 설치된다. 중간에 엔터나 비밀번호를 입력해야하니 잘 보고 있으면 된다.

이렇게 위치가 바뀌면 성공

험난한 최신 버전 ruby 설치

여기서부터가 고역이었다.

사실 ruby 설치법은 간단하다. brew 로 몇가지 다운 후 rbenv 라는 루비 환경을 관리하는 툴을 통해 바로 install 해주면 된다.

하지만, 인터넷에 나온 간단한 방법으로 설치 시 온갖 버전을 설치해봐도 아래와 같이 BUILD FAILED 에러에 마주쳤다.

뭔가 문제가 있다고 생각해 ruby-build issue를 서치해보았다.

여기서 그 해답을 얻을 수 있었다.

https://bugs.ruby-lang.org/issues/18912

 

Bug #18912: Build failure with Xcode 14 and macOS 13 (Ventura) Beta - Ruby master - Ruby Issue Tracking System

Bug #18912 완료됨 Build failure with Xcode 14 and macOS 13 (Ventura) Beta hsbt (Hiroshi SHIBATA)이(가) 6달 전에 추가함. 2달 전에 수정됨. 설명 TL;DR: We fixed this issue at Ruby 2.7-3.1 and master branch. But the stable versions are not r

bugs.ruby-lang.org

요약하자면, Xcode14 에서 루비를 빌드할 수 없고, Xcode14라면 Xcode13으로 다운그레이드 해야한다. 

그러나 Mac OS Ventura는 무조건 Xcode14 를 사용해야하기에 이 점은 루비측에서 수정 중이다.

 We fixed this issue at Ruby 2.7-3.1 and master branch. But the stable versions are not released yet.
Option 1: We strongly recommend to not upgrade Xcode 14 and its toolchains for macOS 12(Monterey) users. If you already update Xcode 14, you remove them with sudo rm -rf /Library/Developer/CommandLineTools and install Xcode 13.x or toolchains from https://developer.apple.com/download/allOption 2: macOS 13 (Ventura) couldn't install Xcode13. We should add --without=+,bigdecimal --enable-shared to the configure option.

결국 나는 Ventura 에다가 Xcode14 였기에 루비 버그로 인해 설치가 안되는 것이었다. 

그래도 아직 정식 릴리즈는 아니지만 3.2.0 버전에서 해당 이슈가 해결되었다는 토론을 발견했다!

https://github.com/rbenv/ruby-build/discussions/2127

 

Apple Intel macOS Ventura 13.1(M1): unable to install ruby 2.7.7, 3.1.3, 3.2.0, 3.0.5 · Discussion #2127 · rbenv/ruby-build

Help me.... plz help me... i tried install ruby 100times for create git blog by local. but ❯ rbenv install 2.7.7 To follow progress, use 'tail -f /var/folders/_q/0v9yhl5j1wz64t17fwvzljsw0000gn/...

github.com

3.2.0 버전을 설치하기 위해 ruby-build 에서 제공하는 install environment 를 제대로 구성해야한다.

https://github.com/rbenv/ruby-build/wiki#suggested-build-environment

 

GitHub - rbenv/ruby-build: Compile and install Ruby

Compile and install Ruby. Contribute to rbenv/ruby-build development by creating an account on GitHub.

github.com

brew install openssl@3 readline libyaml gmp
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@3)"

ruby v3 부터는 openssl3를 사용하는데 명시적으로 옵션 지정을 해줘야하는 것 같다. 

brew install rust

중요한건 v3.2.0 설치를 위해선 rust 를 homebrew로 미리 설치해줘야한다. 

rbenv install 3.2.0

~/.zshrc 파일에는 homebrew 설정, rbenv 설정, openssl 설정을 추가해주었다.

변경 후 source ~/.zshrc 하는 것 잊지 맙시다!

export PATH="/opt/honebrew/bin:$PATH"
export PATH="/opt/homebrew/sbin:$PATH"

# rbenv
export RBENV_ROOT=/opt/homebrew/opt/rbenv
export PATH=$RBENV_ROOT/bin:$PATH
eval "$(rbenv init -)"

# openssl
export LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include"
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@3)"

환경 구성을 마치고 rbenv 를 통해 3.2.0을 install 해보았다.

드디어

아무런 오류 없이 정상적으로 Installed 됐다는 메시지가 뜬다!

rbenv global 3.2.0

지금 설치한 3.2.0을 사용할 ruby 로 선택해주자

이렇게 M1, Ventura, XCode14 최신 환경에서 ruby 버전과 아키텍쳐가 정상적으로 호환되지 않아 발생하는 문제를 해결해보았다.

과연 내 터미널은 정상적으로 돌아왔을까?

열심히 꾸며놓은 colorls 가 정상적으로 동작하고, 터미널 새 창을 열어도 더 이상 ruby 오류가 발생하지 않았다.