본문으로 건너뛰기

[CPython] 64-bit ARM 커널에서 32-bit ARM Android의 sysconfig ABI 감지 수정

PR 링크: python/cpython#146539 상태: Merged | 변경: +7 / -0

들어가며

Android 기기 중 32-bit ARM 앱을 64-bit ARM 커널 위에서 실행하는 경우가 있습니다. 이런 환경에서 os.uname().machinearmv7l이 아닌 armv8l을 반환합니다. CPython의 sysconfig.get_platform()은 이 값을 Android ABI 이름으로 매핑하는데, armv8l에 대한 매핑이 누락되어 KeyError가 발생했습니다.

핵심 코드 분석

Before:

machine = {
    "x86_64": "x86_64",
    "i686": "x86",
    "aarch64": "arm64_v8a",
    "armv7l": "armeabi_v7a",
}[machine]

After:

# When Python is running on 32-bit ARM Android on a 64-bit ARM kernel,
# 'os.uname().machine' is 'armv8l'. Such devices run the same userspace
# code as 'armv7l' devices.
machine = {
    "x86_64": "x86_64",
    "i686": "x86",
    "aarch64": "arm64_v8a",
    "armv7l": "armeabi_v7a",
    "armv8l": "armeabi_v7a",
}[machine]

armv8l -> armeabi_v7a 매핑을 추가합니다. 32-bit ARM 사용자 공간 코드는 커널이 64-bit이든 32-bit이든 동일하므로, armv8larmv7l은 같은 ABI를 사용합니다.

테스트에서도 동일한 매핑이 추가되었습니다:

# test_sysconfig.py
'armv8l': 'armeabi_v7a',

# ext_suffix 테스트
"armv8l": "arm-linux-androideabi",

왜 이게 좋은가

  • 실제 하드웨어 다양성 대응: 64-bit 커널에서 32-bit 앱을 실행하는 것은 Android에서 흔한 구성입니다. 단 7줄 추가로 이 전체 환경을 지원합니다.
  • Wheel 호환성: sysconfig의 platform 문자열은 pip가 wheel 파일을 선택할 때 사용됩니다. 이 수정 없이는 armv8l 기기에서 올바른 wheel을 설치할 수 없었습니다.
  • 명확한 주석: 왜 armv8larmeabi_v7a와 같은지를 주석으로 설명하여 미래의 개발자가 의문을 갖지 않도록 합니다.

정리

작지만 영향력 있는 수정입니다. 특정 Android 하드웨어 구성에서 Python 패키지 설치가 완전히 실패하던 문제를 단 한 줄의 dict 항목 추가로 해결합니다. Edge case를 다루는 좋은 사례입니다.

참고 자료


이 포스트는 AI가 작성하였으며, 사실과 다를 수 있습니다. 정확한 정보는 원본 PR을 참고해 주세요.

댓글

관련 포스트

PR Analysis 의 다른글