M1 Mac에서 오래된 Ruby (2.3.0)를 rbenv로 설치하려고하면 빠졌습니다.

M1 Mac에서 오래된 Ruby (2.3.0)를 rbenv로 설치하려고하면 빠졌습니다.

2022-10-03 last update

7 minutes reading 루비 openssl M1
새롭게 M1 Mac을 구입했으므로, 과거의 프로젝트등에서 사용하고 있는 Ruby를 인스톨 하려고 하면, 생각 밖 빠져 버렸습니다.

전제로 rbenv에 설치입니다. (rvm은 같은 문제가 나올지 모르겠지만 나올 것 같은 느낌이었습니다)

정상적으로 설치하려고하면



다음과 같이 오류가 발생했습니다.
rbenv install 2.3.0
Downloading openssl-1.0.2u.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/ecd0c6ffb493dd06707d38b14bb4d8c2288bb7033735606569d8f90f89669d16
Installing openssl-1.0.2u...

BUILD FAILED (macOS 12.0.1 using ruby-build 20211109)

Inspect or clean up the working tree at /var/folders/5w/3gb4_24j54g14xnxsn0_czph0000gn/T/ruby-build.20211116154747.22853.vSq0Kf
Results logged to /var/folders/5w/3gb4_24j54g14xnxsn0_czph0000gn/T/ruby-build.20211116154747.22853.log

Last 10 log lines:
      _dgram_write in libcrypto.a(bss_dgram.o)
      _RAND_query_egd_bytes in libcrypto.a(rand_egd.o)
      ...
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[4]: *** [link_a.darwin] Error 1
make[3]: *** [do_darwin-shared] Error 2
make[2]: *** [libcrypto.1.0.0.dylib] Error 2
make[1]: *** [shared] Error 2
make: *** [build_crypto] Error 1

M1 mac에 설치된 OpenSSL은 1.1이고 2.3 미만은 1.0의 OpenSSL이 필요합니다.

이제 OpenSSL 1.0을 설치합시다.



하지만 평소에는 설치할 수 없기 때문에



이미 brew-core에서는 OpenSSL1.0이 사라지고 있다는 것으로,
이 issue를 참고로
다음 명령으로 설치를 시도했지만 빌드에서 오류
brew install rbenv/tap/[email protected]

==> Downloading https://www.openssl.org/source/openssl-1.0.2t.tar.gz
Already downloaded: /Users/nakahiro/Library/Caches/Homebrew/downloads/5d2da6a9ed1a20ef9d1b1418d79aa674cf5577b70ca1ce436fdaadfa04f0429c--openssl-1.0.2t.tar.gz
==> Installing [email protected] from rbenv/tap
==> perl ./Configure --prefix=/opt/homebrew/Cellar/[email protected]/1.0.2t --openssldir=/opt/homebrew/etc/openssl no-ssl2 no-ssl3 no-zlib shared enable-cms darwin64-x86_64-cc enable-e
==> make depend
==> make
Last 15 lines from /Users/nakahiro/Library/Logs/Homebrew/[email protected]/03.make:
 ^
x86_64cpuid.s:273:10: error: unknown token in expression
 cmpq $0,%rax
         ^
x86_64cpuid.s:273:10: error: invalid operand
 cmpq $0,%rax
         ^
x86_64cpuid.s:274:9: error: unknown token in expression
 cmoveq %rcx,%rax
        ^
x86_64cpuid.s:274:9: error: invalid operand
 cmoveq %rcx,%rax
        ^
make[1]: *** [x86_64cpuid.o] Error 1
make: *** [build_crypto] Error 1

If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):
  https://github.com/rbenv/homebrew-tap/issues

아무래도 이 인스톨 방법에서는 M1 Mac에는 대응하고 있지 않은 것 같다.

M1 Mac에서 OpenSSL1.0을 설치하려면



고맙게도 여기에 해결책을 올렸다.
curl https://raw.githubusercontent.com/rbenv/homebrew-tap/e472b7861b49cc082d1db0f66f265368da107589/Formula/openssl%401.0.rb -o [email protected]

brew install ./[email protected]

rm -rf ./[email protected]
brew install ./[email protected]

Error: Failed to load cask: ./[email protected]
Cask '[email protected]' is unreadable: wrong constant name #<Class:0x000000010ebd9930>
Warning: Treating ./[email protected] as a formula.
==> Downloading https://www.openssl.org/source/openssl-1.0.2u.tar.gz
######################################################################## 100.0%
==> Patching
==> perl ./Configure --prefix=/opt/homebrew/Cellar/[email protected]/1.0.2u --openssldir=/opt/homebrew/etc/openssl no-ssl2 no-ssl3 no-zlib shared enable-cms darwin64-arm64-cc enable-ec
==> make depend
==> make
==> make test
==> make install MANDIR=/opt/homebrew/Cellar/[email protected]/1.0.2u/share/man MANSUFFIX=ssl
==> Caveats
A CA file has been bootstrapped using certificates from the SystemRoots
keychain. To add additional certificates (e.g. the certificates added in
the System keychain), place .pem files in
  /opt/homebrew/etc/openssl/certs

안전하게 OpenSSL 1.0을 설치할 수 있습니다.

마침내 M1 Mac에 Ruby 2.3.0 설치



다시 이쪽을 참고로 다음 명령으로 설치 시도
RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix [email protected])" rbenv install 2.3.0

이제 마침내 Ruby 2.3.0을 설치할 수 있습니다.
그러나 오류
RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix o[email protected])" rbenv install 2.3.1

Downloading ruby-2.3.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.bz2
Installing ruby-2.3.1...

WARNING: ruby-2.3.1 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.

ruby-build: using readline from homebrew

BUILD FAILED (macOS 12.0.1 using ruby-build 20211109)

Inspect or clean up the working tree at /var/folders/5w/3gb4_24j54g14xnxsn0_czph0000gn/T/ruby-build.20211116163007.87317.fPCEfh
Results logged to /var/folders/5w/3gb4_24j54g14xnxsn0_czph0000gn/T/ruby-build.20211116163007.87317.log

Last 10 log lines:
date_core.c:8422:37: note: expanded from macro 'f_getlocal'
#define f_getlocal(x) rb_funcall(x, rb_intern("getlocal"), 0)
                                    ^~~~~~~~~~~~~~~~~~~~~
../.././include/ruby/ruby.h:1737:51: note: expanded from macro 'rb_intern'
        __extension__ (CONST_ID_CACHE((ID), (str))) : \
                                                  ^
494 warnings generated.
454 warnings generated.
linking shared-object date_core.bundle
make: *** [build-ext] Error 2

상당히 좌절할 것 같습니다만, 마음을 없애고 노력합시다.

ffi 주위에 실패하고 그런 로그가 있었다.



로그 파일을 봐! 그렇기 때문에 로그를 보았을 때, 그러한 로그가있었습니다.
14: error: implicit declaration of function 'ffi_prep_closure' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
#define ID2SYM(x) RB_ID2SYM(x)
date_core.c:3739:

이것을 바탕으로 살펴보면 이 기사 찾기

이쪽도 M1 Mac만의 문제로,
RUBY_CFLAGS=-DUSE_FFI_CLOSURE_ALLOC rbenv install x.x.x

그렇게 할 수 있습니다.

그래서 궁극적으로 이렇게되었습니다.
RUBY_CFLAGS=-DUSE_FFI_CLOSURE_ALLOC RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix [email protected])" rbenv install 2.3.0

Installed ruby-2.3.0 to /Users/nakahiro/.rbenv/versions/2.3.0

안전하게 설치할 수있었습니다.

결과, 이렇게하면 괜찮습니다.



M1 Mac에서 2.3.6? 미만을 설치하는 경우는 다음과 같이 실행하면 괜찮을 것 같습니다.
% curl https://raw.githubusercontent.com/rbenv/homebrew-tap/e472b7861b49cc082d1db0f66f265368da107589/Formula/openssl%401.0.rb -o [email protected]

% brew install ./[email protected]
==  ここまでは最初だけ

% RUBY_CFLAGS=-DUSE_FFI_CLOSURE_ALLOC RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix [email protected])" rbenv install 2.3.0