[Python] 구성하기: CPython 빌드 완벽 가이드
1. 빌드 요구사항
기본 요구사항
CPython을 빌드하는 데 필요한 기능과 최소 버전:
- C11 컴파일러: 선택적 C11 기능은 필요하지 않음
- Windows: Microsoft Visual Studio 2017 이상
- IEEE 754 부동소수점: NaN 지원 포함
- 스레드 지원: 필수
선택적 모듈 의존성
| 모듈 | 라이브러리 | 최소 버전 |
|---|---|---|
| bz2 | libbz2 | . |
| hashlib (BLAKE2) | libb2 | . |
| ctypes | libffi | 3.3.0 권장 |
| lzma | liblzma | . |
| decimal | libmpdec | 2.5.0 |
| curses | libncurses/libncursesw | . |
| readline | libreadline/libedit | . |
| uuid | libuuid | . |
| ssl, hashlib | OpenSSL | 1.1.1 최소, 3.0.18 권장 |
| sqlite3 | SQLite | 3.15.2 |
| tkinter | Tcl/Tk | 8.5.12 |
| zlib | zlib | 1.1.4 권장 |
| compression.zstd | zstd | 1.4.5 |
전체 의존성 목록 및 설치 방법: devguide
도구 요구사항
- configure 스크립트 재생성: Autoconf 2.72 및 aclocal 1.16.5
2. 생성된 파일
빌드 의존성을 줄이기 위해 Python 소스 코드에는 여러 생성된 파일이 포함되어 있음.
재생성 명령
make regen-all
make regen-stdlib-module-names
make regen-limited-abi
make regen-configureMakefile.pre.in 파일에서 regen-* make 대상을 검색하여 상세 정보 확인 가능.
configure 스크립트 재생성
# 컨테이너 사용 (권장)
make regen-configure
# 로컬 실행
autoreconf -ivf -Werror주의: 생성된 파일은 정확한 autoconf-archive, aclocal, pkg-config 버전에 따라 변경될 수 있음.
3. 구성 옵션
옵션 확인
./configure --helpMisc/SpecialBuilds.txt도 참조.
4. 일반 옵션
--enable-loadable-sqlite-extensions
sqlite3 모듈에서 로드 가능한 확장 지원 (기본값: no).
# 사용 예시
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의 기본 시간대 검색 경로 선택.
기본값:
/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 성능 통계 수집 활성화.
사용 방법:
# 빌드 시 활성화
./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++ 전처리기 플래그.
예시:
CPPFLAGS="-I/usr/local/include" ./configure확장 모듈 빌드를 위해 CPPFLAGS와 LDFLAGS 모두 쉘 값을 포함해야 함.
BASECPPFLAGS
기본 전처리기 플래그.
버전 3.4에 추가
PY_CPPFLAGS
인터프리터 객체 파일 빌드를 위한 추가 전처리기 플래그.
기본값:
$(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
기본값:
$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)PY_CFLAGS_NODIST
기본값:
$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal버전 3.5에 추가
PY_STDMODULE_CFLAGS
인터프리터 객체 파일 빌드용 C 플래그.
기본값:
$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)버전 3.7에 추가
PY_CORE_CFLAGS
기본값:
$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE버전 3.2에 추가
PY_BUILTIN_MODULE_CFLAGS
표준 라이브러리 확장 모듈을 내장 모듈로 빌드하기 위한 컴파일러 플래그.
기본값:
$(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
링커 플래그.
예시:
LDFLAGS="-L/usr/local/lib" ./configureLIBS
Python 실행 파일 링크 시 전달할 링커 플래그.
예시: -lrt
LDSHARED
공유 라이브러리 빌드 명령.
기본값: @LDSHARED@ $(PY_LDFLAGS)
BLDSHARED
libpython 공유 라이브러리 빌드 명령.
기본값: @BLDSHARED@ $(PY_CORE_LDFLAGS)
PY_LDFLAGS
기본값:
$(CONFIGURE_LDFLAGS) $(LDFLAGS)PY_LDFLAGS_NODIST
기본값:
$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)버전 3.8에 추가
PY_CORE_LDFLAGS
인터프리터 객체 파일 빌드용 링커 플래그.
버전 3.8에 추가
6. 빌드 워크플로우
기본 빌드
# 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최적화 빌드
./configure \
--enable-optimizations \
--with-lto \
--prefix=/usr/local
make -j$(nproc)
sudo make install디버그 빌드
./configure \
--with-pydebug \
--prefix=/usr/local/debug
make -j$(nproc)공유 라이브러리 빌드
./configure \
--enable-shared \
--prefix=/usr/local
make -j$(nproc)
sudo make install
# LD_LIBRARY_PATH 설정
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH7. 실전 예시
예시 1: 개발 환경
./configure \
--with-pydebug \
--enable-pystats \
--prefix=$HOME/.local/python-dev
make -j$(nproc)
make install예시 2: 프로덕션 최적화
./configure \
--enable-optimizations \
--with-lto \
--enable-shared \
--prefix=/opt/python3
make -j$(nproc)
make test
sudo make install예시 3: 최소 빌드 (임베디드)
./configure \
--disable-ipv6 \
--without-pymalloc \
--disable-test-modules \
--prefix=/opt/python-minimal
make -j$(nproc)
sudo make install예시 4: 사용자 정의 의존성
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. 정리 명령
빌드 파일 정리
# 빌드 아티팩트 제거
make clean
# 구성 파일 포함 모든 파일 제거
make distclean
# Git에 알려지지 않은 모든 파일 제거 (주의!)
git clean -fdx⚠️ 주의: git clean -fdx는 커밋되지 않은 모든 작업을 삭제함.
9. 종합 정리
핵심 개념
| 개념 | 설명 |
|---|---|
| configure | 빌드 환경 설정 스크립트 |
| CFLAGS | 컴파일러 플래그 |
| LDFLAGS | 링커 플래그 |
| --enable-optimizations | 성능 최적화 활성화 |
| --with-pydebug | 디버그 빌드 |
| --enable-shared | 공유 라이브러리 빌드 |
빌드 체크리스트
✅ 빌드 전:
- 필요한 의존성 설치
- 컴파일러 버전 확인
- 빌드 옵션 결정
✅ 빌드 중:
- configure 실행
- make로 빌드
- make test로 테스트
✅ 빌드 후:
- make install로 설치
- 경로 설정 (공유 라이브러리 사용 시)
- 설치 확인
문제 해결
의존성 오류:
# 패키지 관리자로 설치
# Debian/Ubuntu
sudo apt-get build-dep python3
# Fedora/RHEL
sudo dnf builddep python3
# macOS
brew install openssl readline sqlite3 xz zlib링크 오류:
# 라이브러리 경로 확인
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
# 또는 ldconfig 업데이트
sudo ldconfig10. 고급 구성 옵션
10.1. 성능 관련 옵션
--enable-optimizations
PGO (Profile-Guided Optimization) 활성화.
./configure --enable-optimizations동작 방식:
- Python 빌드
- 테스트 스위트 실행하여 프로파일 수집
- 프로파일 데이터로 재컴파일
효과:
- 15-20% 성능 향상
- 빌드 시간 2-3배 증가
버전 3.6에 추가
--with-lto
LTO (Link Time Optimization) 활성화.
./configure --with-lto옵션:
- --with-lto=full: 전체 LTO (기본값)
- --with-lto=thin: Thin LTO (빠른 빌드)
효과:
- 5-10% 추가 성능 향상
- 링크 시간 증가
버전 3.6에 추가
--enable-bolt
BOLT (Binary Optimization and Layout Tool) 활성화.
./configure --enable-bolt요구사항:
- LLVM BOLT 도구 필요
- Linux x86-64만 지원
효과:
- 추가 5-10% 성능 향상
버전 3.12에 추가
10.2. 디버깅 옵션
--with-pydebug
디버그 빌드 활성화.
./configure --with-pydebug효과:
- Py_DEBUG 매크로 정의
- 추가 런타임 검사
- 디버그 심볼 포함
- 메모리 디버깅 활성화
- 성능 저하 (2-3배 느림)
--with-trace-refs
객체 참조 추적 활성화.
./configure --with-trace-refs효과:
- 모든 객체를 연결 리스트로 추적
- 메모리 누수 디버깅 용이
- 큰 메모리 오버헤드
--with-valgrind
Valgrind 지원 활성화.
./configure --with-valgrind효과:
- Valgrind 메모리 검사기 호환
- 거짓 양성 감소
--with-address-sanitizer
AddressSanitizer 활성화.
./configure --with-address-sanitizer효과:
- 메모리 오류 검출
- 버퍼 오버플로우, use-after-free 등
버전 3.6에 추가
--with-memory-sanitizer
MemorySanitizer 활성화.
./configure --with-memory-sanitizer효과:
- 초기화되지 않은 메모리 읽기 검출
버전 3.6에 추가
--with-undefined-behavior-sanitizer
UndefinedBehaviorSanitizer 활성화.
./configure --with-undefined-behavior-sanitizer효과:
- 정의되지 않은 동작 검출
버전 3.6에 추가
10.3. 메모리 관리 옵션
--without-pymalloc
Python 메모리 할당자 비활성화.
./configure --without-pymalloc효과:
- 시스템 malloc() 사용
- 메모리 디버거와 호환성 향상
- 성능 저하 가능
--with-mimalloc
mimalloc 메모리 할당자 사용.
./configure --with-mimalloc효과:
- Microsoft의 고성능 할당자
- 멀티스레드 성능 향상
버전 3.13에 추가
--without-doc-strings
docstring 비활성화.
./configure --without-doc-strings효과:
- 바이너리 크기 감소
- 메모리 사용량 감소
- help() 함수 사용 불가
10.4. 보안 옵션
--with-hash-algorithm=[fnv|siphash13|siphash24]
해시 알고리즘 선택.
./configure --with-hash-algorithm=siphash24옵션:
- fnv: 빠르지만 취약
- siphash13: 균형잡힌 선택
- siphash24: 가장 안전 (기본값)
버전 3.4에 추가
--with-ssl-default-suites=[python|openssl|STRING]
기본 SSL cipher suite 설정.
./configure --with-ssl-default-suites=python옵션:
- python: Python 권장 설정
- openssl: OpenSSL 기본값
- STRING: 사용자 정의
버전 3.7에 추가
10.5. 스레드 및 동시성 옵션
--disable-gil
GIL (Global Interpreter Lock) 비활성화.
./configure --disable-gil효과:
- 진정한 멀티스레드 가능
- 실험적 기능
- 일부 C 확장과 비호환 가능
버전 3.13에 추가
--with-pthreads
POSIX 스레드 사용 (기본값).
./configure --with-pthreads10.6. 모듈 관련 옵션
--with-system-expat
시스템 expat 라이브러리 사용.
./configure --with-system-expat효과:
- 번들 expat 대신 시스템 버전 사용
--with-system-libmpdec
시스템 libmpdec 사용.
./configure --with-system-libmpdec--without-ensurepip
ensurepip 모듈 비활성화.
./configure --without-ensurepip효과:
- pip 자동 설치 안 함
11. 플랫폼별 빌드
11.1. Linux
Ubuntu/Debian
# 의존성 설치
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 installFedora/RHEL
# 의존성 설치
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 install11.2. macOS
# 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 install11.3. Windows
Visual Studio 사용
# Visual Studio 2017 이상 필요
# PCbuild 디렉터리에서 빌드
cd PCbuild
build.bat -p x64 -c Release
# 또는 Visual Studio에서
devenv pcbuild.slnMSYS2 사용
# MSYS2 환경에서
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
./configure --prefix=/mingw64
make -j$(nproc)
make install11.4. 크로스 컴파일
Android
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
# 크로스 컴파일러 설정
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. 자동화 빌드 스크립트
#!/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. 다중 버전 빌드 스크립트
#!/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 - 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. 빌드 옵션별 성능 비교
#!/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))"
done13.2. 성능 테스트 결과 예시
| 빌드 옵션 | 빌드 시간 | 실행 성능 | 바이너리 크기 |
|---|---|---|---|
| 기본 | 5분 | 기준 | 15MB |
| --enable-optimizations | 25분 | +18% | 15MB |
| --with-lto | 35분 | +25% | 14MB |
| --with-lto --enable-bolt | 45분 | +32% | 14MB |
14. 트러블슈팅
14.1. 일반적인 문제
문제: SSL 모듈 빌드 실패
# 오류 메시지
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 모듈 없음
# 해결 방법 (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"문제: 공유 라이브러리를 찾을 수 없음
# 오류 메시지
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"문제: 테스트 실패
# 일부 테스트는 시스템 설정에 따라 실패할 수 있음
# 무시해도 되는 테스트
make test TESTOPTS="-x test_multiprocessing_fork -x test_subprocess"
# 또는 테스트 스킵
make install # 테스트 없이 설치14.2. 디버깅 도구
빌드 로그 저장
# 전체 빌드 로그 저장
./configure 2>&1 | tee configure.log
make 2>&1 | tee build.log상세 빌드 정보
# verbose 모드로 빌드
make VERBOSE=1컴파일러 명령 확인
# 실제 사용된 컴파일러 플래그 확인
make -n15. 종합 예시
프로덕션 최적화 빌드 (완전판)
#!/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 지원 확인
- 필수 모듈 확인
- 성능 벤치마크
- 문서화