R-Blogger블로그·해설한국어2024-01-17
R-universe, Apple Silicon(M1/M2/M3)용 MacOS ARM64 바이너리 빌드
R‑universe가 이제 macOS arm64 바이너리를 제공합니다 R‑universe는 이제 모든 R 패키지에 대해 macOS arm64(Apple Silicon) 바이너리를 제공합니다. 이를 통해 M1/M2/M3와 같은 Apple Silicon 하드웨어를 사용하는 macOS 사용자들은 컴파일 없이 최신 빌드의 R 패키지를 바로 설치할 수 있게 되었습니다. 예시로, 다음 명령어를 사용해 arrow 패키지를 설치할 수 있습니다. install.packages('arrow', repos = c('https://apache.r-universe.dev', 'https://cloud.r-project.org')) R‑universe는 arm64 바이너리를 위해 크로스 컴파일을 사용하지만, 패키지 개발자와 R 사용자에게 큰 차이는 없습니다. C/C++/Fortran/Rust 코드가 포함된 패키지도 모두 지원합니다. 크로스 컴파일이 필요한 이유 GitHub Actions가 현재 OSS 프로젝트를 위한 arm64 러너를 제공하지 않기 때문에, arm64 바이너리는 macOS Intel 러너에서 크로스 컴파일됩니다. 크로스 빌드 환경은 원래 arm64 머신과 동일하게 설정되어 대부분의 R 패키지가 수정 없이도 동작합니다. 버그가 있는 configure 스크립트를 가진 일부 패키지만이 수정을 필요로 할 수 있습니다. R‑universe 워크플로우는 컴파일 코드가 포함된 패키지(예: C/C++/Fortran/Rust)일 때만 arm64 바이너리를 빌드합니다. 컴파일 코드가 없는 패키지는 디자인상 포터블이며, Intel용으로 빌드된 바이너리를 x86_64와 arm64 크랜과 유사한 저장소에서 모두 제공합니다. CRAN과 마찬가지로, r‑universe 패키지 홈페이지에는 r‑4.3‑x86_64와 r‑4.3‑arm64 바이너리 링크가 표시됩니다. 컴파일 코드가 없는 패키지는 r‑4.3‑any 바이너리를 사용합니다. 빌드 로그를 보려면, 링크 옆에 있는 작은 사과 아이콘을 클릭하거나, /buildlog 단축 링크를 이용하세요. 예를 들어 https://apache.r-universe.dev/arrow/buildlog은 최신 arrow 빌드 로그로 안내합니다. 이 페이지에서 r-release-macos 작업을 확장한 뒤 “Cross Compile for MacOS ARM64” 섹션을 보면 arm64 빌드 로그를 확인할 수 있습니다. 이 섹션이 비활성화된 경우, 해당 패키지에 컴파일 코드가 없으므로 크로스 컴파일이 생략되었음을 의미합니다. 크로스 컴파일 세부사항 크로스 컴파일은 다음과 같은 핵심 구성 요소를 사용합니다. macOS Xcode 툴체인을 사용해 -arch arm64 플래그를 전달하여 C/C++ 코드를 크로스 컴파일합니다. CRAN에서 제공하는 유니버설 gfortran 12.2 버전을 이용해 Fortran 코드를 -arch arm64 플래그와 함께 크로스 컴파일합니다. CRAN이 사용한 동일한 시스템 라이브러리 컬렉션이 빌드 환경에 사전 설치됩니다. configure 스크립트를 갖는 R 패키지는 --configure-args="--build=x86_64-apple-darwin20 --host=aarch64-apple-darwin20" 옵션으로 빌드됩니다. 이 플래그는 autoconf 스크립트에 필요하며, 다른 패키지에서도 사용할 수 있습니다. r‑universe macos‑cross 워크플로우는 arm64를 타깃으로 하도록 PATH에 몇 가지 쉘 쉐임을 추가하고, uname 또는 arch 명령을 호출하는 패키지를 돕습니다. 크레이트 쉐임을 사용해 cargo의 기본 빌드 타깃을 aarch64-apple-darwin로 오버라이드하고, 빌드 후 출력을 예상 경로에 복사합니다. 패키지는 -undefined dynamic_lookup 플래그 없이 엄격한 링크 설정으로 빌드됩니다. 이 설정을 통해 거의 모든 R 패키지는 일반 arm64 하드웨어와 동일한 방식으로 크로스 환경에서 빌드될 수 있습니다. 패키지가 작동하지 않을 경우, 도움을 받으려면 이슈를 열어 주시기 바랍니다. 유니버설 바이너리 일부 R 패키지는 크기나 복잡성 때문에 빌드 시에 바로 컴파일된 바이너리를 다운로드합니다. 이러한 라이브러리는 유니버설 바이너리 형태로 배포하는 것이 가장 안전합니다. 유니버설 바이너리는 x86_64와 arm64 라이브러리를 모두 포함하므로, 다운로드 스크립트가 빌드 타깃에 대한 추측 없이 동일한 라이브러리를 사용할 수 있습니다. 유니버설 바이너리 생성을 위해, libfoo.a의 x86_64와 arm64 버전이 있다면 lipo를 이용해 두 파일을 합칠 수 있습니다. lipo -create x86_64/libfoo.a arm64/libfoo.a -output universal/libfoo.a 이 새 libfoo.a는 Intel이든 arm이든 빌드할 때 사용될 수 있습니다. 도움이 필요하시면 언제든 연락해 주세요.
원문 URL
전체 글은 원문 페이지에서 이어서 읽을 수 있습니다.
- 작성자
- R-Blogger
- 출처
- R-Blogger
- 플랫폼
- R-Blogger
- 분류
- 블로그·해설
- 언어
- 한국어
- 발행일
- 2024-01-17