3. 설치 구성 파일 작성하기

종종, 배포판을 빌드하는데 필요한 모든 것을 사전에 작성하는 것은 불가능합니다: 사용자나 시스템에서 정보를 얻어야 계속 진행할 수 있습니다. 그 정보가 매우 간단하다면 —예를 들어, C 헤더 파일이나 라이브러리를 검색할 디렉터리 목록— 사용자가 편집할 수 있는 구성 파일 setup.cfg를 제공하는 것은 저렴하고 쉬운 방법입니다. 구성 파일을 사용하면 모든 명령 옵션에 대한 기본값을 제공할 수도 있습니다. 이 옵션은 설치하는 사람이 명령 줄이나 구성 파일을 편집해서 재정의하도록 할 수 있습니다.

설치 구성 파일은 설치 스크립트(이상적으로는, 설치하는 사람에게 불투명한 1)와 설치 스크립트에 대한 명령 줄(여러분의 제어를 벗어나고 전적으로 설치하는 사람에 달려 있습니다) 사이의 유용한 중간 지대입니다. 사실, setup.cfg(와 대상 시스템에 있는 다른 모든 Distutils 구성 파일)는 설치 스크립트의 내용 뒤에, 하지만 명령 줄 앞에서 처리됩니다. 이것은 몇 가지 유용한 결과를 줍니다:

  • 설치하는 사람은 setup.cfg를 편집하여 여러분이 setup.py에 넣은 것을 재정의할 수 있습니다.

  • 여러분은 setup.py에서 쉽게 설정할 수 없는 옵션에 대해 비표준 기본값을 제공할 수 있습니다

  • 설치하는 사람은 setup.py에 대한 명령 줄 옵션을 사용하여 setup.cfg의 모든 것을 재정의할 수 있습니다

구성 파일의 기본 문법은 간단합니다:

[command]
option=value
...

여기서 command는 Distutils 명령 (예를 들어, build_py, install) 중 하나이며, option은 명령이 지원하는 옵션 중 하나입니다. 각 명령에 대해 임의의 수의 옵션을 제공할 수 있으며, 임의의 수의 명령 섹션을 파일에 포함할 수 있습니다. '#' 문자에서 줄의 끝까지 확장되는 주석과 마찬가지로 공백 줄은 무시됩니다. 긴 옵션 값은 단순히 이어지는 줄을 들여쓰기하는 것으로 여러 줄로 나눌 수 있습니다.

범용 --help 옵션을 사용하여 특정 명령이 지원하는 옵션 목록을 찾을 수 있습니다, 예를 들어

$ python setup.py --help build_ext
[...]
Options for 'build_ext' command:
  --build-lib (-b)     directory for compiled extension modules
  --build-temp (-t)    directory for temporary files (build by-products)
  --inplace (-i)       ignore build-lib and put compiled extensions into the
                       source directory alongside your pure Python modules
  --include-dirs (-I)  list of directories to search for header files
  --define (-D)        C preprocessor macros to define
  --undef (-U)         C preprocessor macros to undefine
  --swig-opts          list of SWIG command line options
[...]

명령 줄에서 --foo-bar로 입력되는 옵션은 구성 파일에서 foo_bar로 표시해야 함에 유의하십시오.

예를 들어, 여러분의 확장을 “제자리(in-place)”에 빌드하려고 한다고 합시다 — 즉, 확장 pkg.ext이 있고, 컴파일된 확장 파일(유닉스에서 ext.so이라고 합시다)이 여러분의 순수 파이썬 모듈 pkg.mod1pkg.mod2과 같은 소스 디렉터리에 들어가기를 원합니다. 이렇게 하려면 항상 명령 줄에서 --inplace 옵션을 사용할 수 있습니다:

python setup.py build_ext --inplace

그러나 이렇게 하려면 항상 build_ext 명령을 명시적으로 지정하고, --inplace를 제공하는 것을 기억해야 합니다. 더 쉬운 방법은 이 배포판의 설정 파일인 setup.cfg에 인코딩하여, 이 옵션을 “설정하고 잊어버리는” 것입니다:

[build_ext]
inplace=1

이것은 build_ext를 명시적으로 지정했는지와 관계없이, 이 모듈 배포의 모든 빌드에 영향을 미칩니다. 소스 배포판에 setup.cfg를 포함 시키면, 최종 사용자 빌드에도 영향을 미칩니다 — 항상 제자리에서 확장을 빌드하면 모듈 배포 설치를 망가뜨릴 수 있으므로, 이 옵션의 경우는 나쁜 생각일 수 있습니다. 그러나 어떤 특별한 경우에는, 설치 디렉터리에 모듈이 바로 빌드되기 때문에 유용한 기능이라고 상상할 수 있습니다. (설치 디렉터리에 빌드 될 것으로 기대하는 확장을 배포하는 것은 거의 항상 나쁜 생각입니다.)

다른 예: 어떤 명령은 실행마다 변경되지는 않는 많은 옵션을 사용합니다; 예를 들어, bdist_rpm은 RPM 배포를 만들기 위해 “spec” 파일을 생성하는 데 필요한 모든 것을 알아야 합니다. 이 정보 중 일부는 설치 스크립트에서 오고, 일부는 Distutils가 자동으로 생성합니다 (가령 설치된 파일 목록). 그러나 그중 일부는 bdist_rpm에 대한 옵션으로 제공되어야 하는데, 실행 때마다 명령 줄에서 수행하는 것은 매우 따분합니다. 그래서, 여기 Distutils 자체의 setup.cfg에서 발췌한 내용이 있습니다:

[bdist_rpm]
release = 1
packager = Greg Ward <gward@python.net>
doc_files = CHANGES.txt
            README.txt
            USAGE.txt
            doc/
            examples/

doc_files 옵션은 가독성을 위해 여러 줄에 나누어 공백으로 구분된 문자열일 뿐임에 유의하십시오.

더 보기

“파이썬 모듈 설치”의 Syntax of config files

구성 파일에 대한 자세한 내용은 시스템 관리자용 설명서에 있습니다.

각주

1

이 이상은 아마도 자동 구성이 Distutils에 의해 완전히 지원되기 전까지는 달성되지 않을 것입니다.