# 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.mod1`와 `pkg.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에 의해 완전히 지원되기 전까지는 달성되지 않을 것입니다.