jhpka's blog

[Python] 구성하기: CPython 빌드 완벽 가이드

Admin User

1. 빌드 요구사항

기본 요구사항

CPython을 빌드하는 데 필요한 기능과 최소 버전:

  • C11 컴파일러: 선택적 C11 기능은 필요하지 않음
  • Windows: Microsoft Visual Studio 2017 이상
  • IEEE 754 부동소수점: NaN 지원 포함
  • 스레드 지원: 필수

선택적 모듈 의존성

모듈라이브러리최소 버전
bz2libbz2.
hashlib (BLAKE2)libb2.
ctypeslibffi3.3.0 권장
lzmaliblzma.
decimallibmpdec2.5.0
curseslibncurses/libncursesw.
readlinelibreadline/libedit.
uuidlibuuid.
ssl, hashlibOpenSSL1.1.1 최소, 3.0.18 권장
sqlite3SQLite3.15.2
tkinterTcl/Tk8.5.12
zlibzlib1.1.4 권장
compression.zstdzstd1.4.5

전체 의존성 목록 및 설치 방법: devguide

도구 요구사항

  • configure 스크립트 재생성: Autoconf 2.72 및 aclocal 1.16.5

2. 생성된 파일

빌드 의존성을 줄이기 위해 Python 소스 코드에는 여러 생성된 파일이 포함되어 있음.

재생성 명령

bash
make regen-all
make regen-stdlib-module-names
make regen-limited-abi
make regen-configure

Makefile.pre.in 파일에서 regen-* make 대상을 검색하여 상세 정보 확인 가능.

configure 스크립트 재생성

bash
# 컨테이너 사용 (권장)
make regen-configure

# 로컬 실행
autoreconf -ivf -Werror

주의: 생성된 파일은 정확한 autoconf-archive, aclocal, pkg-config 버전에 따라 변경될 수 있음.


3. 구성 옵션

옵션 확인

bash
./configure --help

Misc/SpecialBuilds.txt도 참조.


4. 일반 옵션

--enable-loadable-sqlite-extensions

sqlite3 모듈에서 로드 가능한 확장 지원 (기본값: no).

python
# 사용 예시
import sqlite3
conn = sqlite3.connect(':memory:')
conn.enable_load_extension(True)

버전 3.6에 추가

--disable-ipv6

IPv6 지원 비활성화 (기본적으로 활성화됨).

--enable-big-digits=[15|30]

Python int 자릿수의 비트 크기 정의.

  • 기본값: 30비트
  • PYLONG_BITS_IN_DIGIT을 15 또는 30으로 정의
  • sys.int_info.bits_per_digit 참조

--with-suffix=SUFFIX

Python 실행 파일 접미사 설정.

기본 접미사:

  • Windows/macOS: .exe (python.exe)
  • Emscripten node: .js
  • Emscripten 브라우저: .html
  • WASI: .wasm
  • 기타 플랫폼: 빈 문자열 (python)

버전 3.11에서 변경: WASM 플랫폼 기본 접미사 추가

--with-tzpath=<경로>

zoneinfo.TZPATH의 기본 시간대 검색 경로 선택.

기본값:

text
/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo

버전 3.9에 추가

--without-decimal-contextvar

_decimal 확장 모듈을 스레드-로컬 컨텍스트로 빌드 (기본값은 코루틴-로컬).

버전 3.9에 추가

--with-dbmliborder=<백엔드 목록>

dbm 모듈의 db 백엔드 확인 순서 재정의.

유효한 값:

  • ndbm
  • gdbm
  • bdb

예시: --with-dbmliborder=gdbm:ndbm:bdb

--without-c-locale-coercion

UTF-8 기반 로케일로의 C 로케일 강제 변환 비활성화.

PY_COERCE_C_LOCALE 매크로를 정의하지 않음.

--with-platlibdir=DIRNAME

Python 라이브러리 디렉터리 이름 (기본값: lib).

  • Fedora/SuSE: 64비트 플랫폼에서 lib64 사용
  • sys.platlibdir 참조

버전 3.9에 추가

--with-wheel-pkg-dir=PATH

ensurepip 모듈에서 사용하는 wheel 패키지 디렉터리 (기본값: 없음).

사용 예시:

  • Fedora: /usr/share/python-wheels/

버전 3.10에 추가

--with-pkg-config=[check|yes|no]

빌드 의존성 감지를 위한 pkg-config 사용 여부.

  • check (기본값): pkg-config 선택 사항
  • yes: pkg-config 필수
  • no: pkg-config 사용 안 함

버전 3.11에 추가

--enable-pystats

내부 Python 성능 통계 수집 활성화.

사용 방법:

bash
# 빌드 시 활성화
./configure --enable-pystats

# 실행 시 활성화
python3 -X pystats
PYTHONSTATS=1 python3

효과:

  • -X pystats 명령줄 옵션 추가
  • PYTHONSTATS 환경 변수 추가
  • Py_STATS 매크로 정의
  • sys 모듈에 함수 추가:
    • sys._stats_on(): 통계 수집 활성화
    • sys._stats_off(): 통계 수집 비활성화
    • sys._stats_clear(): 통계 초기화

버전 3.11에 추가


5. 환경 변수

5.1. 전처리기 플래그

CONFIGURE_CPPFLAGS

./configure 스크립트에 전달된 CPPFLAGS 변수의 값.

버전 3.6에 추가

CPPFLAGS

C/C++ 전처리기 플래그.

예시:

bash
CPPFLAGS="-I/usr/local/include" ./configure

확장 모듈 빌드를 위해 CPPFLAGSLDFLAGS 모두 쉘 값을 포함해야 함.

BASECPPFLAGS

기본 전처리기 플래그.

버전 3.4에 추가

PY_CPPFLAGS

인터프리터 객체 파일 빌드를 위한 추가 전처리기 플래그.

기본값:

makefile
$(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)

버전 3.2에 추가


5.2. 컴파일러 플래그

CC

C 컴파일러 명령.

예시: gcc -pthread

CXX

C++ 컴파일러 명령.

예시: g++ -pthread

CFLAGS

C 컴파일러 플래그.

CFLAGS_NODIST

인터프리터 및 stdlib C 확장 빌드용 플래그.

주의사항:

  • -I 플래그 포함 금지 (사용자 플래그 우선순위 보장)
  • -Werror 같은 강화 플래그 포함 금지

버전 3.5에 추가

COMPILEALL_OPTS

make install 시 PYC 파일 빌드 옵션.

기본값: -j0

버전 3.12에 추가

EXTRA_CFLAGS

추가 C 컴파일러 플래그.

CONFIGURE_CFLAGS

./configure에 전달된 CFLAGS 값.

버전 3.2에 추가

BASECFLAGS

기본 컴파일러 플래그.

OPT

최적화 플래그.

CCSHARED

공유 라이브러리 빌드용 컴파일러 플래그.

예시: Linux/BSD에서 -fPIC

PY_CFLAGS

기본값:

makefile
$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)

PY_CFLAGS_NODIST

기본값:

makefile
$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal

버전 3.5에 추가

PY_STDMODULE_CFLAGS

인터프리터 객체 파일 빌드용 C 플래그.

기본값:

makefile
$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)

버전 3.7에 추가

PY_CORE_CFLAGS

기본값:

makefile
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE

버전 3.2에 추가

PY_BUILTIN_MODULE_CFLAGS

표준 라이브러리 확장 모듈을 내장 모듈로 빌드하기 위한 컴파일러 플래그.

기본값:

makefile
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN

버전 3.8에 추가


5.3. 링커 플래그

LINKCC

프로그램 빌드용 링커 명령.

기본값: $(PURIFY) $(CC)

CONFIGURE_LDFLAGS

./configure에 전달된 LDFLAGS 값.

버전 3.2에 추가

LDFLAGS_NODIST

설치 후 LDFLAGS에 포함되어서는 안 될 링커 플래그.

주의사항:

  • -L 플래그 포함 금지 (사용자 플래그 우선순위 보장)

버전 3.8에 추가

LDFLAGS

링커 플래그.

예시:

bash
LDFLAGS="-L/usr/local/lib" ./configure

LIBS

Python 실행 파일 링크 시 전달할 링커 플래그.

예시: -lrt

LDSHARED

공유 라이브러리 빌드 명령.

기본값: @LDSHARED@ $(PY_LDFLAGS)

BLDSHARED

libpython 공유 라이브러리 빌드 명령.

기본값: @BLDSHARED@ $(PY_CORE_LDFLAGS)

PY_LDFLAGS

기본값:

makefile
$(CONFIGURE_LDFLAGS) $(LDFLAGS)

PY_LDFLAGS_NODIST

기본값:

makefile
$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)

버전 3.8에 추가

PY_CORE_LDFLAGS

인터프리터 객체 파일 빌드용 링커 플래그.

버전 3.8에 추가


6. 빌드 워크플로우

기본 빌드

bash
# 1. 소스 다운로드
git clone https://github.com/python/cpython.git
cd cpython

# 2. 구성
./configure --prefix=/usr/local

# 3. 빌드
make -j$(nproc)

# 4. 테스트
make test

# 5. 설치
sudo make install

최적화 빌드

bash
./configure \
  --enable-optimizations \
  --with-lto \
  --prefix=/usr/local

make -j$(nproc)
sudo make install

디버그 빌드

bash
./configure \
  --with-pydebug \
  --prefix=/usr/local/debug

make -j$(nproc)

공유 라이브러리 빌드

bash
./configure \
  --enable-shared \
  --prefix=/usr/local

make -j$(nproc)
sudo make install

# LD_LIBRARY_PATH 설정
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

7. 실전 예시

예시 1: 개발 환경

bash
./configure \
  --with-pydebug \
  --enable-pystats \
  --prefix=$HOME/.local/python-dev

make -j$(nproc)
make install

예시 2: 프로덕션 최적화

bash
./configure \
  --enable-optimizations \
  --with-lto \
  --enable-shared \
  --prefix=/opt/python3

make -j$(nproc)
make test
sudo make install

예시 3: 최소 빌드 (임베디드)

bash
./configure \
  --disable-ipv6 \
  --without-pymalloc \
  --disable-test-modules \
  --prefix=/opt/python-minimal

make -j$(nproc)
sudo make install

예시 4: 사용자 정의 의존성

bash
export CPPFLAGS="-I/usr/local/include -I/opt/openssl/include"
export LDFLAGS="-L/usr/local/lib -L/opt/openssl/lib"

./configure \
  --with-openssl=/opt/openssl \
  --prefix=/usr/local

make -j$(nproc)

8. 정리 명령

빌드 파일 정리

bash
# 빌드 아티팩트 제거
make clean

# 구성 파일 포함 모든 파일 제거
make distclean

# Git에 알려지지 않은 모든 파일 제거 (주의!)
git clean -fdx

⚠️ 주의: git clean -fdx는 커밋되지 않은 모든 작업을 삭제함.


9. 종합 정리

핵심 개념

개념설명
configure빌드 환경 설정 스크립트
CFLAGS컴파일러 플래그
LDFLAGS링커 플래그
--enable-optimizations성능 최적화 활성화
--with-pydebug디버그 빌드
--enable-shared공유 라이브러리 빌드

빌드 체크리스트

✅ 빌드 전:

  1. 필요한 의존성 설치
  2. 컴파일러 버전 확인
  3. 빌드 옵션 결정

✅ 빌드 중:

  1. configure 실행
  2. make로 빌드
  3. make test로 테스트

✅ 빌드 후:

  1. make install로 설치
  2. 경로 설정 (공유 라이브러리 사용 시)
  3. 설치 확인

문제 해결

의존성 오류:

bash
# 패키지 관리자로 설치
# Debian/Ubuntu
sudo apt-get build-dep python3

# Fedora/RHEL
sudo dnf builddep python3

# macOS
brew install openssl readline sqlite3 xz zlib

링크 오류:

bash
# 라이브러리 경로 확인
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

# 또는 ldconfig 업데이트
sudo ldconfig

10. 고급 구성 옵션

10.1. 성능 관련 옵션

--enable-optimizations

PGO (Profile-Guided Optimization) 활성화.

bash
./configure --enable-optimizations

동작 방식:

  1. Python 빌드
  2. 테스트 스위트 실행하여 프로파일 수집
  3. 프로파일 데이터로 재컴파일

효과:

  • 15-20% 성능 향상
  • 빌드 시간 2-3배 증가

버전 3.6에 추가

--with-lto

LTO (Link Time Optimization) 활성화.

bash
./configure --with-lto

옵션:

  • --with-lto=full: 전체 LTO (기본값)
  • --with-lto=thin: Thin LTO (빠른 빌드)

효과:

  • 5-10% 추가 성능 향상
  • 링크 시간 증가

버전 3.6에 추가

--enable-bolt

BOLT (Binary Optimization and Layout Tool) 활성화.

bash
./configure --enable-bolt

요구사항:

  • LLVM BOLT 도구 필요
  • Linux x86-64만 지원

효과:

  • 추가 5-10% 성능 향상

버전 3.12에 추가


10.2. 디버깅 옵션

--with-pydebug

디버그 빌드 활성화.

bash
./configure --with-pydebug

효과:

  • Py_DEBUG 매크로 정의
  • 추가 런타임 검사
  • 디버그 심볼 포함
  • 메모리 디버깅 활성화
  • 성능 저하 (2-3배 느림)

--with-trace-refs

객체 참조 추적 활성화.

bash
./configure --with-trace-refs

효과:

  • 모든 객체를 연결 리스트로 추적
  • 메모리 누수 디버깅 용이
  • 큰 메모리 오버헤드

--with-valgrind

Valgrind 지원 활성화.

bash
./configure --with-valgrind

효과:

  • Valgrind 메모리 검사기 호환
  • 거짓 양성 감소

--with-address-sanitizer

AddressSanitizer 활성화.

bash
./configure --with-address-sanitizer

효과:

  • 메모리 오류 검출
  • 버퍼 오버플로우, use-after-free 등

버전 3.6에 추가

--with-memory-sanitizer

MemorySanitizer 활성화.

bash
./configure --with-memory-sanitizer

효과:

  • 초기화되지 않은 메모리 읽기 검출

버전 3.6에 추가

--with-undefined-behavior-sanitizer

UndefinedBehaviorSanitizer 활성화.

bash
./configure --with-undefined-behavior-sanitizer

효과:

  • 정의되지 않은 동작 검출

버전 3.6에 추가


10.3. 메모리 관리 옵션

--without-pymalloc

Python 메모리 할당자 비활성화.

bash
./configure --without-pymalloc

효과:

  • 시스템 malloc() 사용
  • 메모리 디버거와 호환성 향상
  • 성능 저하 가능

--with-mimalloc

mimalloc 메모리 할당자 사용.

bash
./configure --with-mimalloc

효과:

  • Microsoft의 고성능 할당자
  • 멀티스레드 성능 향상

버전 3.13에 추가

--without-doc-strings

docstring 비활성화.

bash
./configure --without-doc-strings

효과:

  • 바이너리 크기 감소
  • 메모리 사용량 감소
  • help() 함수 사용 불가

10.4. 보안 옵션

--with-hash-algorithm=[fnv|siphash13|siphash24]

해시 알고리즘 선택.

bash
./configure --with-hash-algorithm=siphash24

옵션:

  • fnv: 빠르지만 취약
  • siphash13: 균형잡힌 선택
  • siphash24: 가장 안전 (기본값)

버전 3.4에 추가

--with-ssl-default-suites=[python|openssl|STRING]

기본 SSL cipher suite 설정.

bash
./configure --with-ssl-default-suites=python

옵션:

  • python: Python 권장 설정
  • openssl: OpenSSL 기본값
  • STRING: 사용자 정의

버전 3.7에 추가


10.5. 스레드 및 동시성 옵션

--disable-gil

GIL (Global Interpreter Lock) 비활성화.

bash
./configure --disable-gil

효과:

  • 진정한 멀티스레드 가능
  • 실험적 기능
  • 일부 C 확장과 비호환 가능

버전 3.13에 추가

--with-pthreads

POSIX 스레드 사용 (기본값).

bash
./configure --with-pthreads

10.6. 모듈 관련 옵션

--with-system-expat

시스템 expat 라이브러리 사용.

bash
./configure --with-system-expat

효과:

  • 번들 expat 대신 시스템 버전 사용

--with-system-libmpdec

시스템 libmpdec 사용.

bash
./configure --with-system-libmpdec

--without-ensurepip

ensurepip 모듈 비활성화.

bash
./configure --without-ensurepip

효과:

  • pip 자동 설치 안 함

11. 플랫폼별 빌드

11.1. Linux

Ubuntu/Debian

bash
# 의존성 설치
sudo apt-get update
sudo apt-get install -y \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    libffi-dev \
    liblzma-dev

# 빌드
./configure --enable-optimizations --prefix=/usr/local
make -j$(nproc)
sudo make install

Fedora/RHEL

bash
# 의존성 설치
sudo dnf groupinstall "Development Tools"
sudo dnf install \
    openssl-devel \
    bzip2-devel \
    libffi-devel \
    zlib-devel \
    readline-devel \
    sqlite-devel \
    xz-devel

# 빌드
./configure --enable-optimizations --prefix=/usr/local
make -j$(nproc)
sudo make install

11.2. macOS

bash
# Homebrew로 의존성 설치
brew install \
    openssl@3 \
    readline \
    sqlite3 \
    xz \
    zlib \
    tcl-tk

# 환경 변수 설정
export CPPFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix readline)/include"
export LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib"

# 빌드
./configure \
    --enable-optimizations \
    --with-openssl=$(brew --prefix openssl) \
    --prefix=/usr/local

make -j$(sysctl -n hw.ncpu)
sudo make install

11.3. Windows

Visual Studio 사용

powershell
# Visual Studio 2017 이상 필요
# PCbuild 디렉터리에서 빌드

cd PCbuild
build.bat -p x64 -c Release

# 또는 Visual Studio에서
devenv pcbuild.sln

MSYS2 사용

bash
# MSYS2 환경에서
pacman -S --needed base-devel mingw-w64-x86_64-toolchain

./configure --prefix=/mingw64
make -j$(nproc)
make install

11.4. 크로스 컴파일

Android

bash
export NDK=/path/to/android-ndk
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

./configure \
    --host=aarch64-linux-android \
    --build=x86_64-linux-gnu \
    --with-build-python=$(which python3) \
    CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang \
    CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++ \
    --prefix=/opt/python-android

make -j$(nproc)

Raspberry Pi

bash
# 크로스 컴파일러 설정
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++

./configure \
    --host=arm-linux-gnueabihf \
    --build=x86_64-linux-gnu \
    --with-build-python=$(which python3) \
    --prefix=/opt/python-rpi

make -j$(nproc)

12. 빌드 스크립트 예시

12.1. 자동화 빌드 스크립트

bash
#!/bin/bash
# build-python.sh - Python 자동 빌드 스크립트

set -e  # 오류 시 중단

# 설정
PYTHON_VERSION="3.13.0"
PREFIX="/opt/python-${PYTHON_VERSION}"
JOBS=$(nproc)

# 색상 정의
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

log() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

error() {
    echo -e "${RED}[ERROR]${NC} $1"
    exit 1
}

warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

# 의존성 확인
log "의존성 확인 중..."
if ! command -v gcc &> /dev/null; then
    error "gcc가 설치되어 있지 않습니다."
fi

# 소스 다운로드
log "Python ${PYTHON_VERSION} 다운로드 중..."
if [ ! -f "Python-${PYTHON_VERSION}.tar.xz" ]; then
    wget "https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz"
fi

# 압축 해제
log "압축 해제 중..."
tar -xf "Python-${PYTHON_VERSION}.tar.xz"
cd "Python-${PYTHON_VERSION}"

# 구성
log "구성 중..."
./configure \
    --enable-optimizations \
    --with-lto \
    --enable-shared \
    --prefix="${PREFIX}" \
    LDFLAGS="-Wl,-rpath,${PREFIX}/lib"

# 빌드
log "빌드 중... (${JOBS} 작업)"
make -j${JOBS}

# 테스트
log "테스트 중..."
if ! make test; then
    warn "일부 테스트가 실패했습니다."
fi

# 설치
log "설치 중..."
sudo make install

# 심볼릭 링크 생성
log "심볼릭 링크 생성 중..."
sudo ln -sf "${PREFIX}/bin/python3" /usr/local/bin/python3
sudo ln -sf "${PREFIX}/bin/pip3" /usr/local/bin/pip3

# 확인
log "설치 확인 중..."
"${PREFIX}/bin/python3" --version

log "빌드 완료!"
log "Python 위치: ${PREFIX}"

12.2. 다중 버전 빌드 스크립트

bash
#!/bin/bash
# build-multiple-pythons.sh - 여러 Python 버전 빌드

set -e

VERSIONS=("3.11.10" "3.12.7" "3.13.0")
BASE_PREFIX="/opt/python"

for VERSION in "${VERSIONS[@]}"; do
    echo "===================================="
    echo "Python ${VERSION} 빌드 시작"
    echo "===================================="
    
    MAJOR_MINOR=$(echo ${VERSION} | cut -d. -f1,2)
    PREFIX="${BASE_PREFIX}/${MAJOR_MINOR}"
    
    # 다운로드
    wget -nc "https://www.python.org/ftp/python/${VERSION}/Python-${VERSION}.tar.xz"
    
    # 빌드
    tar -xf "Python-${VERSION}.tar.xz"
    cd "Python-${VERSION}"
    
    ./configure \
        --enable-optimizations \
        --prefix="${PREFIX}"
    
    make -j$(nproc)
    sudo make install
    
    cd ..
    rm -rf "Python-${VERSION}"
    
    echo "Python ${VERSION} 빌드 완료: ${PREFIX}"
done

echo "모든 빌드 완료!"

12.3. Docker 빌드

dockerfile
# Dockerfile - Python 빌드 이미지

FROM ubuntu:22.04

ENV PYTHON_VERSION=3.13.0
ENV PREFIX=/usr/local

# 의존성 설치
RUN apt-get update && apt-get install -y \
    build-essential \
    wget \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    libffi-dev \
    liblzma-dev \
    && rm -rf /var/lib/apt/lists/*

# Python 다운로드 및 빌드
WORKDIR /tmp
RUN wget "https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz" \
    && tar -xf "Python-${PYTHON_VERSION}.tar.xz" \
    && cd "Python-${PYTHON_VERSION}" \
    && ./configure \
        --enable-optimizations \
        --with-lto \
        --prefix=${PREFIX} \
    && make -j$(nproc) \
    && make install \
    && cd .. \
    && rm -rf "Python-${PYTHON_VERSION}" "Python-${PYTHON_VERSION}.tar.xz"

# pip 업그레이드
RUN pip3 install --upgrade pip

WORKDIR /app
CMD ["python3"]

13. 성능 벤치마크

13.1. 빌드 옵션별 성능 비교

bash
#!/bin/bash
# benchmark-builds.sh - 빌드 옵션별 성능 비교

VERSIONS=(
    "default"
    "optimizations"
    "optimizations-lto"
    "optimizations-lto-bolt"
)

for VERSION in "${VERSIONS[@]}"; do
    case $VERSION in
        "default")
            OPTS=""
            ;;
        "optimizations")
            OPTS="--enable-optimizations"
            ;;
        "optimizations-lto")
            OPTS="--enable-optimizations --with-lto"
            ;;
        "optimizations-lto-bolt")
            OPTS="--enable-optimizations --with-lto --enable-bolt"
            ;;
    esac
    
    echo "빌드: ${VERSION}"
    ./configure ${OPTS} --prefix="/tmp/python-${VERSION}"
    make -j$(nproc)
    make install
    
    # 벤치마크 실행
    echo "벤치마크 실행: ${VERSION}"
    /tmp/python-${VERSION}/bin/python3 -m pyperf timeit "'-'.join(str(n) for n in range(100))"
done

13.2. 성능 테스트 결과 예시

빌드 옵션빌드 시간실행 성능바이너리 크기
기본5분기준15MB
--enable-optimizations25분+18%15MB
--with-lto35분+25%14MB
--with-lto --enable-bolt45분+32%14MB

14. 트러블슈팅

14.1. 일반적인 문제

문제: SSL 모듈 빌드 실패

bash
# 오류 메시지
Could not build the ssl module!
Python requires an OpenSSL 1.1.1 or newer

# 해결 방법
export CPPFLAGS="-I/usr/local/openssl/include"
export LDFLAGS="-L/usr/local/openssl/lib"
./configure --with-openssl=/usr/local/openssl

문제: tkinter 모듈 없음

bash
# 해결 방법 (Ubuntu/Debian)
sudo apt-get install tk-dev

# 해결 방법 (macOS)
brew install tcl-tk
export CPPFLAGS="-I$(brew --prefix tcl-tk)/include"
export LDFLAGS="-L$(brew --prefix tcl-tk)/lib"

문제: 공유 라이브러리를 찾을 수 없음

bash
# 오류 메시지
error while loading shared libraries: libpython3.13.so.1.0

# 해결 방법 1: LD_LIBRARY_PATH 설정
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

# 해결 방법 2: ldconfig 업데이트
echo "/usr/local/lib" | sudo tee -a /etc/ld.so.conf.d/python3.conf
sudo ldconfig

# 해결 방법 3: rpath 사용
./configure --enable-shared LDFLAGS="-Wl,-rpath,/usr/local/lib"

문제: 테스트 실패

bash
# 일부 테스트는 시스템 설정에 따라 실패할 수 있음
# 무시해도 되는 테스트
make test TESTOPTS="-x test_multiprocessing_fork -x test_subprocess"

# 또는 테스트 스킵
make install  # 테스트 없이 설치

14.2. 디버깅 도구

빌드 로그 저장

bash
# 전체 빌드 로그 저장
./configure 2>&1 | tee configure.log
make 2>&1 | tee build.log

상세 빌드 정보

bash
# verbose 모드로 빌드
make VERBOSE=1

컴파일러 명령 확인

bash
# 실제 사용된 컴파일러 플래그 확인
make -n

15. 종합 예시

프로덕션 최적화 빌드 (완전판)

bash
#!/bin/bash
# production-build.sh - 프로덕션용 최적화 빌드

set -e

# 설정
PYTHON_VERSION="3.13.0"
PREFIX="/opt/python3"
JOBS=$(nproc)

# 1. 의존성 설치 (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install -y \
    build-essential \
    wget \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    libffi-dev \
    liblzma-dev \
    libncurses5-dev \
    tk-dev \
    uuid-dev \
    llvm

# 2. 소스 다운로드
wget "https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz"
tar -xf "Python-${PYTHON_VERSION}.tar.xz"
cd "Python-${PYTHON_VERSION}"

# 3. 구성 (모든 최적화 활성화)
./configure \
    --enable-optimizations \
    --with-lto \
    --enable-shared \
    --enable-ipv6 \
    --with-system-expat \
    --with-system-libmpdec \
    --enable-loadable-sqlite-extensions \
    --with-ssl-default-suites=python \
    --prefix="${PREFIX}" \
    LDFLAGS="-Wl,-rpath,${PREFIX}/lib" \
    CFLAGS="-march=native -mtune=native"

# 4. 빌드
make -j${JOBS}

# 5. 테스트 (선택적)
make test TESTOPTS="-j${JOBS}"

# 6. 설치
sudo make install

# 7. pip 업그레이드
"${PREFIX}/bin/pip3" install --upgrade pip setuptools wheel

# 8. 심볼릭 링크
sudo ln -sf "${PREFIX}/bin/python3" /usr/local/bin/python3
sudo ln -sf "${PREFIX}/bin/pip3" /usr/local/bin/pip3

# 9. 확인
"${PREFIX}/bin/python3" --version
"${PREFIX}/bin/python3" -c "import ssl; print(ssl.OPENSSL_VERSION)"

echo "빌드 완료: ${PREFIX}"

16. 최종 체크리스트

빌드 전

  • 시스템 요구사항 확인
  • 의존성 설치 확인
  • 디스크 공간 확인 (최소 1GB)
  • 빌드 옵션 결정

빌드 중

  • configure 오류 없음
  • make 성공
  • 경고 메시지 확인

빌드 후

  • 테스트 실행
  • 설치 확인
  • 경로 설정
  • 권한 확인

프로덕션 배포

  • 최적화 활성화 확인
  • SSL 지원 확인
  • 필수 모듈 확인
  • 성능 벤치마크
  • 문서화
댓글을 불러오는 중...