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

참고:

  이 문서는
  https://setuptools.readthedocs.io/en/latest/setuptools.html 의
  "setuptools" 설명서가 현재 여기에 포함된 모든 관련 정보를 독립적으로
  다루기 전까지만 보존됩니다.

종종, 배포판을 빌드하는데 필요한 모든 것을 *사전에* 작성하는 것은 불가
능합니다: 사용자나 시스템에서 정보를 얻어야 계속 진행할 수 있습니다.
그 정보가 매우 간단하다면 ---예를 들어, 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" 옵션은 가독성을 위해 여러 줄에 나누어 공백으로 구분된 문자
열일 뿐임에 유의하십시오.

더 보기:

  "파이썬 모듈 설치"의 구성 파일 문법
     구성 파일에 대한 자세한 내용은 시스템 관리자용 설명서에 있습니다.

-[ 각주 ]-

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