728x90

간만에 Swift 환경으로 넘어오니 묵혀있던 애플 M1 환경에서의 에러 공습이 시작되었습니다. cocoapod 설치까지는 잘 진행되었으나 필요한 의존성을 Podfile에 기술하고 설치하는 작업에서 문제가 생겼습니다. 설치하고자 한 의존성은 Alamofire 였습니다. 

# Podfile
target 'ch6' do
  use_frameworks!
  pod 'Alamofire', '~> 5.4'
end

 

에러 메세지도 한번 보고나서 트러블 슈팅을 진행해 보겠습니다. M1 을 쓰기 전이었다면 다른 케이스를 먼저 의심했겠지만, M1을 쓰기 시작한 후부터 이런 단순한 작업에서 에러가 발생하면 일단 M1 환경 문제로 보는 습관이 생겼습니다 ㅎㅎ

% pod install
Analyzing dependencies
/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi/library.rb:275: [BUG] Bus Error at 0x00000001012d4000
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.arm64e-darwin20]

-- Crash Report log information --------------------------------------------
   See Crash Report log file under the one of following:
     * ~/Library/Logs/DiagnosticReports
     * /Library/Logs/DiagnosticReports
   for more details.
Don't forget to include the above Crash Report log file in bug reports.

-- Control frame information -----------------------------------------------
c:0049 p:---- s:0307 e:000306 CFUNC  :attach
c:0048 p:0258 s:0301 e:000300 METHOD /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi/library.rb:275
c:0047 p:0050 s:0281 e:000280 CLASS  /Library/Ruby/Gems/2.6.0/gems/ethon-0.14.0/lib/ethon/libc.rb:17
...
..
..
...
  653 /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi/autopointer.rb
  654 /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi/variadic.rb
  655 /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi/enum.rb
  656 /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi/version.rb
  657 /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi/ffi.rb
  658 /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi.rb

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: https://www.ruby-lang.org/bugreport.html

[IMPORTANT]
Don't forget to include the Crash Report log file under
DiagnosticReports directory in bug reports.

zsh: abort      pod install

 

이제 정답을 찾기 위해 열심히 구글링을 했고 두가지 정도의 방법을 찾았습니다.

방법#1. cocoapod 를 실행하는 터미널을 Rosetta 로 실행하기

M1 에서 호환성 문제를 해결하기 위해 가장 먼저 사용해 볼 수 있는 것이 Rosetta 입니다. iTerm 을 터미널 클라이언트로 쓰고 있기 때문에 "파인더 > 응용프로그램"에서 iTerm을 찾아 속성에서 Rosetta 를 켜주면 됩니다. 

 

이제 동작중인 터미널을 종료하고 pod install 을 다시 수행해봅니다. 하지만 여전히 에러가 발생합니다. 

% pod install
Analyzing dependencies

[!] Automatically assigning platform `iOS` with version `15.0` on target `ch6` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
Traceback (most recent call last):
	45: from /usr/local/bin/pod:23:in `<main>'
	44: from /usr/local/bin/pod:23:in `load'
	43: from /Library/Ruby/Gems/2.6.0/gems/cocoapods-1.11.2/bin/pod:55:in `<top (required)>'
	42: from /Library/Ruby/Gems/2.6.0/gems/cocoapods-1.11.2/lib/cocoapods/command.rb:52:in `run'
	41: from /Library/Ruby/Gems/2.6.0/gems/claide-1.0.3/lib/claide/command.rb:334:in `run'
    ...
    ..
    ..
    ...
    	 1: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/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.15.3/lib/ffi_c.bundle, 9): no suitable image found.  Did find: (LoadError)
	/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi_c.bundle: mach-o, but wrong architecture
	/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi_c.bundle: mach-o, but wrong architecture - /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi_c.bundle
	36: from /usr/local/bin/pod:23:in `<main>'
	35: from /usr/local/bin/pod:23:in `load'
    ...
    ..
    ..
    ...
    	 3: from /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi.rb:2:in `<top (required)>'
	 2: from /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi.rb:5:in `rescue in <top (required)>'
	 1: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/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.15.3/lib/ffi_c.bundle, 9): no suitable image found.  Did find: (LoadError)
	/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi_c.bundle: mach-o, but wrong architecture
	/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi_c.bundle: mach-o, but wrong architecture - /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi_c.bundle

 

에러 메세지를 참고하여 ffi에 문제가 있다는 것을 확인하고 재설치를 진행해 봅니다. 이후 다시 pod install 을 수행하면 문제가 해결된다고 합니다. 제 경우는 아쉽게도...

% sudo gem install ffi
% pod install

 

 

방법#2. Ruby FFI 라이브러리 업데이트 후 재설치

에러 메세지에 아키텍쳐 관련한 내용이 계속 나오는 것에 착안하여 사람들이 올려둔 방법중 아키텍쳐 관련된 것들을 사용해 보았습니다. ffi를 설치할 때 아키텍쳐를 x86_64 로 지정하여 설치하는 방식입니다. (M1은 arm 기반이라 arch 명령을 수행해보면 arm64 라고 나옵니다)

% sudo arch -x86_64 gem install ffi
Password:
Fetching ffi-1.15.4.gem
Building native extensions. This could take a while...
Successfully installed ffi-1.15.4
Parsing documentation for ffi-1.15.4
Installing ri documentation for ffi-1.15.4
Done installing documentation for ffi after 9 seconds
1 gem installed

 

설치만 하면 pod install 이 동작할까요? 아닙니다. 그냥 pod install 명령을 사용하면 아키텍쳐가 arm64 로 인식되기 때문에 여전히 아키텍쳐 관련한 호환성 문제가 발생합니다. 대신 명령 앞에 아키텍쳐를 지정해서 실행해 보도록 하겠습니다. 

% arch -x86_64 pod install
Analyzing dependencies
Downloading dependencies
Installing Alamofire (5.4.4)
Generating Pods project
Integrating client project
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

 

잘 되는군요. :-)

728x90

+ Recent posts