Windows에서 번역(translation)하기¶
RPython은 Windows 2000부터 시작하는 Windows 플랫폼에서 지원됩니다. 다음 텍스트는 PyPy를 예시로 사용하여, RPython으로 작성된 인터프리터를 번역(translation)하는 방법에 대한 몇 가지 힌트를 제공합니다.
pypy-c를 빌드하려면 작동하는 python 환경과 C 컴파일러가 필요합니다. CPython 2.6이나 2.7로 번역(translation)하는 것도 가능하지만, 아키텍처에 따라 실행하는 데 2~3배 정도 더 오래 걸리기 때문에 권장하는 방법은 아닙니다. 그러니 our downloads로 이동하여 최신 안정 버전을 받으십시오.
컴파일러로는 Microsoft Visual Studio가 선호되지만, gcc의 mingw32 포트로도 성공했다는 보고가 있습니다.
어떤 컴파일러를 사용하고 어떻게 찾을 것인가?¶
Windows에서 Python용으로 무언가를 빌드할 때 처음 맞닥뜨리는 걸림돌은 컴파일러, 헤더, 라이브러리의 경로를 어떻게 찾아내느냐입니다. MSVC 컴파일러 도구는 독립형 빌드 도구부터 완전한 Visual Studio IDE 설치판까지 여러 버전을 설치할 수 있습니다. 이러한 사용 사례마다 컴파일러가 서로 다른 위치에 놓이며, 그 배치는 시간이 지나면서 계속 바뀝니다.
stdlib에 위치한 distutils패키지는 이 탐색 코드를 넣기에 자연스러운 곳이지만, 파이썬 버전에 의해 고정되어 있습니다. pip으로 설치 가능한 setuptools는 새로운 도구에 맞춰 더 빠르게 움직일 수 있습니다. 따라서 PyPy를 빌드한 후 가장 먼저 일어나는 일은 pip을 설치하고 setuptools를 다운로드한 다음, stdlib에서 사용되는 cffi 모듈을 빌드하는 것입니다. PyPy에는 닭과 달걀 문제가 있습니다: 무언가를 컴파일하려면 setuptools가 필요하지만, setuptools를 얻으려면 _ssl을 필요로 하는 pip이 필요하고, _ssl은 컴파일되어야 합니다. 따라서 PyPy는 rpython/tools/setuptools_msvc.py에 msvc.py의 사본을 포함시켜 배포합니다.
PyPy는 찾을 수 있는 가장 최신 MSVC 컴파일러로 컴파일하는 것을 선호하는데, 이는 사용 중인 exe를 컴파일하는 데 사용된 컴파일러로 컴파일하려는 CPython의 방침과는 다른 점입니다.
Visual Studio를 사용한 PyPy 번역(translation)¶
저희는 일반적으로 Visual Studio 2019, MSVC160을 사용하여 PyPy의 변환을 테스트합니다. 다른 구성도 동작할 수 있습니다. 최소한 Visual Studio 2012를 사용해야 합니다.
변환 스크립트가 컴파일러에 필요한 환경 변수를 알아서 설정하므로, 변환 전에 vcvars를 실행할 필요는 없습니다. 이 스크립트들은 찾을 수 있는 가장 최신 Visual Studio 컴파일러를 선택합니다. 또한 대상 아키텍처(32비트, 64비트)가 자동으로 선택됩니다. 32비트 빌드는 32비트 Python으로만 빌드할 수 있으며, 그 반대도 마찬가지입니다. 기본적으로 인터프리터는 Multi-threaded DLL(/MD) 런타임 환경을 사용하여 빌드됩니다.
다른 컴파일러(mingw 또는 다른 버전의 MSVC)를 사용하도록 이 탐지 방법을 재정의하려면다음과 같이 하십시오:
- 필요에 따라 PATH 및 기타 환경 변수를 설정합니다
- 사용할 컴파일러 실행 파일을 지정하려면 CC 환경 변수를 설정하십시오. 다른 버전의 MSVC라면 SET CC=cl.exe를 사용하십시오.
참고: RPython 번역기(translator)는 특수한 64비트 파이썬이 필요합니다, 아래를 참조하세요
Python과 C 컴파일러만 있으면 PyPy를 빌드할 수 있지만, 서드파티 라이브러리에 의존하는 일부 모듈은 빠지게 됩니다. 아래에서 이를 가져오고 빌드하는 방법을 확인하십시오.
더 많은 정보는 비윈도우 안내를 참고하십시오. 특히 변환은 RAM을 많이 소모한다는 점에 유의하십시오. 표준 변환에는 약 4GB가 필요하므로 특별한 준비가 필요하거나, 다음 방법을 사용하여 변환 속도를 늦추는 대신 메모리 사용량을 줄일 수 있습니다.:
set PYPY_GC_MAX_DELTA=200MB
pypy --jit loop_longevity=300 ../../rpython/bin/rpython -Ojit targetpypystandalone
set PYPY_GC_MAX_DELTA=
# This is done as part of translation
PYTHONPATH=../.. ./pypy-c ../../lib_pypy/pypy_tools/build_cffi_imports.py
대규모 빌드를 위한 Windows 준비¶
일반적으로 32비트 프로그램은 Windows에서 메모리가 2GB로 제한됩니다. Windows 64비트에서는 이 제한을 거의 4GB까지 늘리는 것이 가능합니다.
다음을 실행해야 합니다:
<path-to-visual>\vc\vcvars.bat
editbin /largeaddressaware translator.exe
여기서 translator.exe는 번역(translation)에 사용할 pypy.exe 또는 cpython.exe입니다. 이 작업은 PyPy 변환 과정에서 기본적으로 수행되므로, 별다른 조치 없이도 잘 동작할 것입니다.
외부 패키지 설치¶
PyPy 내부에는 Windows용 빌드 의존성의 바이너리 컴파일 버전을 담고 있는 mercurial repository가 있습니다. rpython 설정 단계의 일환으로, 이 의존성들을 사용하기 위한 환경 변수가 설정됩니다. 이 저장소에는 복제 방법을 설명하는 README 파일과, 지원되는 각 플랫폼에 대한 브랜치가 있습니다. 여러분의 플랫폼과 PyPy 버전에 맞는 브랜치를 체크아웃하려면 get_externals.py 유틸리티를 실행할 수 있습니다. 이 단계를 놓치면 cannot open include file: 'ffi.h'와 같은 오류가 발생합니다.
mingw 컴파일러 사용하기¶
–cc=mingw32 옵션을 사용하여 mingw 컴파일러로 RPython 프로그램을 컴파일할 수 있습니다. gcc.exe가 PATH에 있어야 합니다. -cc 플래그가 “ming”으로 시작하지 않으면, 유효한 gcc 파생 컴파일러의 이름이어야 합니다. 예를 들어 64비트 대상을 만드는 64비트 컴파일러의 경우 x86_64-w64-mingw32-gcc입니다.
mingw 디렉터리 계층 구조에 없는 로컬 설치 패키지의 헤더 파일, lib 또는 dll, dll을 각각 가리키도록 CPATH, LIBRARY_PATH, PATH 환경 변수를 설정해야 할 것입니다.
mingw 컴파일러를 위한 libffi¶
_rawffi (및 ctypes) 모듈을 활성화하려면 mingw 버전의 libffi를 컴파일해야 합니다. 다음은 이를 수행하는 한 가지 방법으로, win64 또는 win32용으로 빌드를 시도할 수 있게 해줍니다:
mingw32 build나 mingw64 build를 다운로드하여 압축을 풀어, 예를 들어 c:mingw에 넣습니다
cygwin을 사용하지 않는다면, make, autoconf 도구 및 기타 유용한 것들을 제공하는 msys가 필요합니다.
- msys for mingw를 다운로드하여 압축을 해제합니다. 예를 들어 c:msys에 압축을 해제합니다.
- c:msysetcfstab 파일을 편집하여 c:mingw를 마운트합니다
libffi source files를 다운로드하고 압축을 해제한 뒤, 기본 디렉터리에 압축을 푸십시오.
c:msysmsys.bat 또는 cygwin 셸을 실행하십시오. 셸 도구가 포함된 셸 프롬프트이므로 더 편안하게 느껴질 것입니다.
쉘 안에서 libffi 디렉터리로 cd한 후 다음을 실행합니다:
sh ./configure make cp .libs/libffi-5.dll <somewhere on the PATH>
dll을 찾을 수 없고 libtool이 “정의되지 않은 심볼은 허용되지 않습니다(undefined symbols not allowed)”라는 경고를 표시했다면, 최상위 디렉터리에 있는 libffi Makefile을 수정해야 합니다. libffi_la_LDFLAGS 정의에 -no-undefined 플래그를 추가합니다.
win64로 실험해보고 싶다면, 플래그와 함께 configure를 실행해야 합니다:
sh ./configure --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32
mingw64 다운로드에 따라 이와 비슷한 것이 될 수 있습니다.
mingw 컴파일러로 PyPy 해킹하기¶
PyPy를 해킹한다는 것은 테스트를 실행한다는 것을 의미하므로, (번역(translation)과 달리) 해킹할 때 mingw 컴파일러를 지정할 방법이 필요합니다. 2012년 3월 기준으로, –cc는 pytest.py의 유효한 옵션이 아닙니다. 하지만 환경 변수 CC를 컴파일러 실행 파일로 설정하면, 테스트에서 이를 사용합니다.
완전한 64비트 변환을 위해 무엇이 빠져 있는가¶
이는 이 주제에 대한 오래된 링크를 위한 자리표시자입니다. 저희는 64비트 번역(translation) 문제를 해결했으며, 64비트 윈도우용 나이틀리 빌드도 있습니다.