PEP 229 – Distutils를 사용한 Python 빌드
- Author:
- A.M. Kuchling <amk at amk.ca>
- Status:
- Final
- Type:
- Standards Track
- Created:
- 16-Nov-2000
- Python-Version:
- 2.1
- Post-History:
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
소개
Modules/Setup 메커니즘에는 몇 가지 결함이 있습니다:
- 사용 가능한 모든 모듈을 얻으려면
Modules/Setup의 일부를 주석 해제해야 한다는 것을 사람들이 기억하고 있어야 합니다. Setup을 새 버전의 Python으로 옮기는 작업은 번거롭습니다. 새 모듈이 추가되었기 때문에 이전 버전을 그대로 복사할 수 없고, 두 버전을 맞춰 조정해야 합니다.- 사용자는
zlib같은 필요한 라이브러리가 어디에 설치되어 있는지 직접 알아내야 합니다.
제안
Python과 함께 제공되는 모듈을 빌드하는 데 Distutils를 사용합니다.
변경 사항은 여러 부분으로 나눌 수 있습니다:
- Distutils가 모듈을 빌드하려면 몇몇 Python 모듈이 필요합니다. 현재로서는 최소 목록이
posix,_sre,string이라고 생각합니다.이 모듈들은 Distutils를 사용하기 전에 빌드되어 있어야 하므로, 단순히
Modules/Makefile에 고정으로 지정되어 자동으로 빌드될 것입니다. - 시스템에 설치된 라이브러리를 확인하고 가능한 한 많은 모듈을 컴파일하는 최상위 setup.py 스크립트를 작성할 것입니다.
Modules/Setup은 유지되며 그 안의 설정은setup.py의 일반적인 동작을 재정의하므로, 버그가 있는 것으로 알려진 모듈을 비활성화하거나 특정 컴파일 또는 링커 플래그를 지정할 수 있습니다. 그러나setup.py가 올바르게 동작하는 일반적인 경우에는Setup의 모든 내용이 주석 처리된 상태로 남아 있을 것입니다. 더 이상Setup을 자동으로 생성하는 것이 없으므로 나머지Setup.*파일들은 불필요해집니다.
이 패치는 Python 2.1에 체크인되었으며, 이후 수정되었습니다.
구현
SourceForge의 패치 #102588에 제안된 패치가 들어 있습니다. 현재 이 패치는 패치를 되돌리기 쉽도록 보수적인 방식을 취하여 가능한 한 적은 파일만 변경하려고 합니다. 예를 들어, 기존 빌드 메커니즘을 뜯어내려는 시도는 하지 않습니다. 이러한 단순화 작업은 패치가 유지될 것이 확실해지는 베타 주기 후반까지 미루거나, Python 2.2까지 미룰 수 있습니다.
이 패치는 다음과 같은 변경을 수행합니다:
- distutils/sysconfig에 몇 가지 필요한 변경을 가합니다(이 변경들은 별도로 체크인될 것입니다)
- 최상위
Makefile.in에서 “sharedmods” 타깃은 단순히"./python setup.py build"를 실행하고, “sharedinstall”은"./python setup.py install"을 실행합니다. “clobber” 타깃은 Distutils가 출력을 저장하는build/하위 디렉터리도 삭제합니다. Modules/Setup.config.in에는gc모듈과thread모듈에 대한 항목만 들어 있습니다.readline,curses,db모듈은 이제setup.py가 처리할 일이므로 제거되었습니다.- 이제
Modules/Setup.dist에는_sre,posix,strop세 모듈에 대한 항목만 들어 있습니다. configure스크립트는setup.cfg.in으로부터setup.cfg를 빌드합니다. 이는 두 가지 이유로 필요합니다. 하위 디렉터리에서의 빌드가 동작하도록 하기 위해서, 그리고 구성된 설치 접두사를 얻기 위해서입니다.- 소스 트리의 최상위 디렉터리에
setup.py를 추가합니다.setup.py는 가장 복잡하지는 않지만 이 퍼즐에서 가장 큰 조각입니다.setup.py에는BuildExt클래스의 서브클래스가 들어 있으며, 이 서브클래스는detect_modules()메서드로 확장됩니다. 이 메서드는 모듈을 언제 컴파일할 수 있는지 파악하고 해당 모듈을 ‘exts’ 리스트에 추가하는 작업을 수행합니다.
미해결 문제
Makefile을 직접 뜯어고치지 않고도 하드와이어된 모듈 3개를 비활성화할 수 있게 해야 합니까? [답변: 아닙니다.]
Distutils는 항상 모듈을 공유 라이브러리로 컴파일합니다. 이 모듈들을 최종 Python 바이너리에 정적으로 컴파일하는 것은 어떻게 지원합니까?
[답변: 아직 아무도 구현하지 않았지만, Distutils로 Python 바이너리를 빌드하는 것은 가능할 것입니다. 언젠가는 해야 할 일이지만, 최상위 Makefile.pre.in을 손보는 것으로도 충분하므로 시급한 우선순위는 아닙니다.]
Copyright
This document has been placed in the public domain.