m1 Mac에서 Unknown host CPU architecture: arm64가 뜬다면...

2023. 1. 9. 15:05Programming/Android

반응형

#잡설
m1 칩셋이 출시된지도 어언 1년이 지났지만 아직까지 호환성 관련된 이슈들이 가끔씩 튀어나올대마다 한숨이 나올때가 있다. 대부분의 툴들은 시간이 지났기때문인지 재설치하면 크게 문제되는 경우도 많지만, Android NDK라면 얘기가 또 다르다. 특히 이런류의 문제는 NDK에 가서 직접 코드를 수정해놓고 한참을 멍때리다가 뭔가 문제가 생겼을 때, NDK를 지우고 재설치하면 문제가 다시 튀어나오기때문에 더욱 환장할 노릇이다. 아무튼 오늘은 m1 mac에서 Android NDK를 처음 설치했을 때, 갑자기 arm64 아키텍쳐가 뭔지 모른다며 Unknown host CPU architecture: arm64 에러를 해결하는 방법에 대해 알아보자.

#원인

/Users/{Username}/Library/Android/sdk/ndk/{NdkVersion}/

위의 경로를 찾아가서 ndk-build를 Vim같은 편집기로 열어보자. 그러면 아래와 같은 내용을 볼 수 있다.

#!/bin/sh
DIR="$(cd "$(dirname "$0")" && pwd)"
$DIR/build/ndk-build "$@"

대충 훑어보면 현재 디렉토리/build/ndk-build에 인자값을 넘겨주고 실행하겠다는 얘기다. 오잉? 그렇다면 ndk-build가 대체 뭐길래 Unknown host CPU architecture: arm64라는 에러를 출력하는걸까? ./build/ndk-build를 열어보면 다음과 같은 구문을 찾아볼 수 있다.

136 HOST_ARCH=$(uname -m)
137 case $HOST_ARCH in
138     i?86) HOST_ARCH=x86;;
139     x86_64|amd64) HOST_ARCH=x86_64;;
140     *) echo "ERROR: Unknown host CPU architecture: $HOST_ARCH"
141        exit 1
142 esac
143 log "HOST_ARCH=$HOST_ARCH"
144

그렇다. 이 스크립트는 빌드를 진행하는 HOST의 아키텍쳐를 보고 분기를 태워주는 녀석인데, 몹시 성가시게도 32bits x86 아키텍쳐와 64bits x86 아키텍쳐만 지원한다. m1 mac에서 uname -m을 입력하면 arm64라는 값이 출력되는 걸 볼 수 있는데, 이 스크립트는 arm64 아키텍쳐에 대한 처리가 되어있지 않으니까 Unknown host CPU architecture: arm64라는 에러가 뜨는 것이다. 오오 통제라... 다행히 Rosetta2를 사용해서 이를 해결할 수 있다. arch x86_64 uname -m을 입력해보면, 이전과는 달리 x86_64라는 값이 출력되는 걸 볼 수 있다. 즉, build/ndk-build를 실행하는 구문 앞에 단순히 arch x86_64를 넣어주기만 하면, build/ndk-build에서 uname -m을 입력했을 때 arm64 대신 x86_64가 출력되기 때문에 문제가 발생하지 않는다는 얘기다.

#해결
ndk-build를 다음과 같이 수정해주도록 하자.

#!/bin/sh
DIR="$(cd "$(dirname "$0")" && pwd)"
arch -x86_64 /bin/bash $DIR/build/ndk-build "$@"

이렇게 수정하면 build/ndk-build를 실행할 때 uname -m의 실행 결과가 arm64가 아닌 x86_64가 나오므로, 더 이상 Unknown host CPU architecture: arm64라는 에러문이 출력되지 않는다.

반응형