Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

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:


Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

소개

Modules/Setup 메커니즘에는 다음과 같은 결함이 있습니다:

  • 가능한 모든 모듈을 얻으려면 Modules/Setup의 일부 항목을 주석 해제해야 한다는 것을 사람들이 기억하고 있어야 합니다.
  • Setup을 새 버전의 Python으로 옮기는 작업은 지루합니다. 새 모듈이 추가되었기 때문에 이전 버전을 그대로 복사할 수 없고, 두 버전을 조율해야 합니다.
  • 사용자는 zlib과 같이 필요한 라이브러리가 어디에 설치되어 있는지 직접 알아내야 합니다.

제안

Python에 포함된 모듈을 빌드하는 데 Distutils를 사용합니다.

변경 사항은 여러 부분으로 나눌 수 있습니다:

  1. Distutils가 모듈을 빌드할 수 있으려면 일부 Python 모듈이 필요합니다. 현재 제가 알기로 최소 목록은 posix, _sre, string입니다.

    이 모듈들은 Distutils를 사용하기 전에 빌드되어 있어야 하므로, 단순히 Modules/Makefile에 고정 지정되어 자동으로 빌드됩니다.

  2. 시스템에 설치된 라이브러리를 확인하고 가능한 한 많은 모듈을 컴파일하는 최상위 setup.py 스크립트가 작성될 것입니다.
  3. 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에는 gcthread 모듈에 대한 항목만 있으며, readline, curses, db 모듈은 이제 setup.py가 처리할 몫이므로 제거되었습니다.
  • Modules/Setup.dist에는 이제 _sre, posix, strop 세 모듈에 대한 항목만 있습니다.
  • configure 스크립트는 setup.cfg.in으로부터 setup.cfg를 빌드합니다. 이는 두 가지 이유로 필요합니다: 하위 디렉터리에서의 빌드가 동작하게 하기 위함과, 구성된 설치 접두사를 얻기 위함입니다.
  • 소스 트리의 최상위 디렉터리에 setup.py를 추가합니다. setup.py는 이 퍼즐에서 가장 큰 조각이지만, 가장 복잡한 것은 아닙니다. setup.pyBuildExt 클래스의 서브클래스를 포함하며, 모듈을 언제 컴파일할 수 있는지 파악하고 ‘exts’ 리스트에 추가하는 작업을 수행하는 detect_modules() 메서드로 이를 확장합니다.

미해결 이슈

Makefile들을 수동으로 손대지 않고도 하드코딩된 3개의 모듈을 비활성화할 수 있게 만들 필요가 있습니까? [답변: 아닙니다.]

Distutils는 항상 모듈을 공유 라이브러리로 컴파일합니다. 이를 결과로 나오는 Python 바이너리에 정적으로 컴파일하는 것을 어떻게 지원합니까?

[답변: Distutils로 Python 바이너리를 빌드하는 것은 가능할 것으로 보이지만, 아직 아무도 구현하지 않았습니다. 이는 언젠가는 이루어져야 하지만, 최상위 Makefile.pre.in을 손보는 것으로 충분하므로 시급한 우선순위는 아닙니다.]