Windows에서 변환하기¶
RPython은 Windows 2000부터 Windows 플랫폼에서 지원됩니다. 다음 글에서는 PyPy를 예로 들어 RPython으로 작성된 인터프리터를 변환하는 방법에 관한 몇 가지 도움말을 제공합니다.
pypy-c를 빌드하려면 제대로 동작하는 Python 환경과 C 컴파일러가 필요합니다. CPython 2.6이나 2.7로도 변환할 수 있지만, 실행 시간이 훨씬 오래 걸리므로(아키텍처에 따라 두세 배) 권장하는 방법은 아닙니다. 그러니 our downloads로 가서 최신 안정 버전을 받으십시오.
컴파일러로는 Microsoft Visual Studio를 권장하지만, gcc의 mingw32 포트로도 성공했다는 보고가 있습니다.
어떤 컴파일러를 사용해야 하며, 어떻게 찾을 수 있습니까?¶
Windows에서 Python용으로 무언가를 빌드할 때 처음 부딪히는 걸림돌은 컴파일러, 헤더, 라이브러리의 경로를 어떻게 찾아내느냐입니다. MSVC 컴파일러 도구는 독립 실행형 빌드 도구부터 완전한 Visual Studio IDE 설치에 이르기까지 여러 버전을 설치할 수 있습니다. 이러한 사용 사례마다 컴파일러가 서로 다른 위치에 설치되며, 그 배치도 수시로 바뀝니다.
표준 라이브러리에 위치한 distutils 패키지는 이 탐색 코드를 넣기에 자연스러운 곳이지만, Python 버전에 따라 고정되어 있습니다. pip으로 설치할 수 있는 setuptools는 새 도구에 맞춰 더 빠르게 바뀔 수 있습니다. 따라서 PyPy를 빌드한 후 가장 먼저 일어나는 일은 pip를 설치하고 setuptools를 내려받는 것이며, 그런 다음 표준 라이브러리에서 사용되는 CFFI 모듈을 빌드합니다. PyPy에는 닭이 먼저냐 달걀이 먼저냐 하는 문제가 있습니다. 무언가를 컴파일하려면 setuptools가 필요한데, setuptools를 얻으려면 _ssl을 필요로 하는 pip이 필요하고, _ssl은 컴파일해야 합니다. 그래서 PyPy는 msvc.py의 사본을 rpython/tools/setuptools_msvc.py에 벤더링하여 포함합니다.
PyPy는 찾을 수 있는 가장 최신 MSVC 컴파일러로 컴파일하는 것을 선호합니다. 이는 현재 사용 중인 exe를 컴파일할 때 쓰인 컴파일러로 컴파일하려는 CPython의 방식과는 다릅니다.
Visual Studio로 PyPy 변환하기¶
저희는 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 변환기에는 특수한 64비트 Python이 필요합니다. 아래를 참조하십시오.
pypy를 빌드하는 데 필요한 것은 Python과 C 컴파일러뿐이지만, 이렇게 빌드하면 서드파티 라이브러리에 의존하는 일부 모듈이 빠지게 됩니다. 이러한 라이브러리를 구하고 빌드하는 방법은 아래를 참고하십시오.
자세한 내용은 Windows 이외 환경용 안내를 참고하십시오. 특히 변환에는 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 준비¶
일반적으로 Windows에서 32비트 프로그램이 사용할 수 있는 메모리는 2GB로 제한됩니다. 64비트 Windows에서는 이 제한을 4GB 가까이까지 늘릴 수 있습니다.
다음을 실행해야 합니다:
<path-to-visual>\vc\vcvars.bat
editbin /largeaddressaware translator.exe
여기서 translator.exe는 변환에 사용할 pypy.exe 또는 cpython.exe입니다. 이 작업은 PyPy 변환 중에 기본으로 수행되므로 별다른 조치 없이도 그대로 동작할 것입니다.
외부 패키지 설치하기¶
저희는 Windows용 빌드 의존성의 바이너리 컴파일 버전을 보관하기 위해 pypy 내부의 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 디렉터리 계층 안에 있지 않다면, CPATH, LIBRARY_PATH, PATH 환경 변수를 각각 해당 패키지의 헤더 파일, lib 또는 dll, 그리고 dll이 있는 위치로 설정하는 것이 좋습니다.
mingw 컴파일러용 libffi¶
_rawffi(및 ctypes) 모듈을 활성화하려면 mingw 버전의 libffi를 컴파일해야 합니다. 다음은 이를 위한 한 가지 방법이며, 이 방법으로 win64 또는 win32용 빌드를 시도할 수 있습니다:
mingw32 build 또는 mingw64 build를 내려받아 c:mingw 같은 곳에 압축을 푸십시오
cygwin을 사용하지 않는다면 make, autoconf 도구와 그 밖의 유용한 도구를 제공하는 msys가 필요합니다.
- msys for mingw를 내려받은 다음 c:msys 같은 곳에 압축을 푸십시오.
- c:mingw를 마운트하려면 c:msysetcfstab 파일을 편집하십시오.
libffi source files를 다운로드하여 압축을 풀고, 기본 디렉터리에 추출하십시오.
c:msysmsys.bat 또는 cygwin 셸을 실행하십시오. 셸 도구가 갖춰진 셸 프롬프트이므로 작업하기가 한결 편할 것입니다.
셸 안에서 cd로 libffi 디렉터리로 이동한 뒤 다음을 실행하십시오:
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를 해킹하려면 테스트를 실행해야 하므로, (변환할 때와 달리) 해킹할 때 mingw 컴파일러를 지정할 방법이 필요합니다. 2012년 3월 현재, –cc는 pytest.py에서 유효한 옵션이 아닙니다. 하지만 환경 변수 CC를 컴파일러 실행 파일(exe)로 설정하면 테스트에서 그 컴파일러를 사용합니다.
완전한 64비트 변환에 부족한 것¶
이 문서는 이 주제를 가리키던 예전 링크를 위해 남겨 둔 자리 표시용 문서입니다. 저희는 64비트 변환 문제를 해결했으며, 64비트 Windows용 나이틀리 빌드도 제공됩니다.