소스 컴파일이 필요한 이유
리눅스에서 소프트웨어 설치 방법은 크게 두 가지입니다.
- 패키지 설치 (apt, yum 등)
→ 빠르고 안정적이지만 버전과 기능이 배포판 저장소에 종속됨 - 소스 코드 직접 컴파일 (./configure → make → make install)
→ 최신 버전 사용 가능, 기능/성능 최적화 가능
소스 컴파일이 특히 필요한 경우
- 저장소에 원하는 버전이 없음
- 특정 기능/모듈을 켜거나 끄고 싶음
- 성능 최적화(CPU 최적화, 불필요 기능 제거)가 필요
- 보안 패치나 버그 수정이 공식 패키지에 반영되기 전 적용
📊 패키지 설치 vs 소스 설치 비교
| 구분 | 패키지 설치 | 소스 설치 |
| 속도 | 빠름 | 느림 (빌드 과정 필요) |
| 버전 | 배포판 저장소에 한정 | 최신 버전 직접 사용 가능 |
| 기능 | 기본 설정에 종속 | 필요 기능만 선택 가능 |
| 의존성 | 자동 해결 | 수동 해결 필요 |
| 보안 업데이트 | 자동 반영 | 직접 적용 필요 |
| 최적화 | 제한적 | 자유롭게 최적화 가능 |
| 삭제/관리 | 패키지 매니저로 간단 | 수동 관리 필요 |
./configure — 환경 탐지 & Makefile 생성
동작 원리
- 시스템 환경(CPU, OS, 라이브러리, 헤더 파일 위치)을 자동 감지
- 감지된 환경과 사용자가 지정한 옵션을 바탕으로 Makefile 생성
- 이때 지정하는 --prefix는 설치 위치를 의미하며, Makefile이 생성되는 위치는 항상 현재 소스 디렉터리
주요 옵션 설명
| 옵션 | 의미 | 예시 |
| --prefix=DIR | 설치 경로 지정 (기본 /usr/local) | --prefix=/opt/myapp |
| --exec-prefix=DIR | 실행파일만 별도 경로 지정 | --exec-prefix=/usr |
| --bindir=DIR | 실행파일 설치 경로 | --bindir=/usr/local/bin |
| --sbindir=DIR | 시스템 실행파일 경로 | --sbindir=/usr/local/sbin |
| --libdir=DIR | 라이브러리 경로 | --libdir=/usr/local/lib64 |
| --includedir=DIR | 헤더 파일 경로 | --includedir=/usr/local/include |
| --sysconfdir=DIR | 설정 파일 경로 | --sysconfdir=/etc |
| --datadir=DIR | 데이터 파일 경로 | --datadir=/usr/share |
| --enable-FEATURE | 기능 활성화 | --enable-ssl |
| --disable-FEATURE | 기능 비활성화 | --disable-shared |
| --with-PACKAGE=ARG | 패키지/라이브러리 경로 지정 | --with-openssl=/usr/local/ssl |
| --without-PACKAGE | 패키지 사용 안 함 | --without-zlib |
| 환경변수 CFLAGS | C 컴파일러 옵션 지정 | CFLAGS="-O2 -march=native" |
| 환경변수 LDFLAGS | 링커 옵션 지정 | LDFLAGS="-L/usr/local/lib" |
make — 컴파일
make는 Makefile 내용을 읽어 필요한 빌드 작업을 수행합니다.
| 명령 | 설명 |
| make | 기본 빌드 수행 |
| make -jN | N개의 병렬 작업 실행 |
| make clean | 빌드 산출물 삭제 |
| make distclean | 빌드 산출물 + 설정 파일 삭제 |
| make check | 빌드 후 테스트 실행 |
make install — 설치
- ./configure --prefix에 지정된 경로에 파일을 복사
- 일반적으로 루트 권한 필요
- 설치 경로 구조:
- prefix/bin → 실행 파일
- prefix/sbin → 시스템 실행 파일
- prefix/lib → 라이브러리
- prefix/include → 헤더 파일
- prefix/etc → 설정 파일
설치 후 검증
hash -r
which <prog>
<prog> --version
- PATH, LD_LIBRARY_PATH 설정 필요 시:
- export PATH=/opt/myapp/bin:$PATH
- export LD_LIBRARY_PATH=/opt/myapp/lib:$LD_LIBRARY_PATH
라이브러리 누락 확인:
ldd "$(which <prog>)" | grep "not found"
설치 관리 & 삭제
소스 설치의 가장 큰 단점이 바로 ‘삭제/관리 어려움’이므로, 설치 전 반드시 파일 추적 또는 Stow/Checkinstall 같은 도구를 활용하는 것이 좋습니다. 무작정 make install만 하면, 삭제 시 시스템이 지저분해집니다.
1. make uninstall 지원 여부 확인
일부 소스 프로젝트는 Makefile에 uninstall 타겟이 있습니다.
sudo make uninstall
- ./configure 때 사용했던 옵션과 같은 디렉터리에서 실행해야 합니다.
- 지원하지 않는 경우가 많음.
2. 설치 파일 목록 추적 후 삭제
설치 전에 파일 목록을 기록해두면, 나중에 삭제가 쉬워집니다.
# 설치 파일 추적
sudo make install DESTDIR=/tmp/installlog
# 설치된 파일 목록 저장
find /tmp/installlog -type f > install-files.txt
→ 나중에 해당 파일들을 rm으로 제거 가능.
3. GNU Stow를 활용한 깔끔한 관리
GNU Stow를 사용하면 설치/삭제가 심플해집니다.
# 설치 시
./configure --prefix=/usr/local/stow/myapp-1.0
make -j$(nproc)
sudo make install
# 활성화
cd /usr/local/stow
sudo stow myapp-1.0
# 비활성화 (삭제)
sudo stow -D myapp-1.0
sudo rm -rf /usr/local/stow/myapp-1.0
- 장점: /usr/local이 지저분해지지 않음
- 단점: Stow를 미리 설치해야 함
4. 패키지 매니저에 등록해서 관리
checkinstall을 사용하면 소스 설치를 자동으로 .deb 또는 .rpm 패키지로 만들어서, 기존 패키지 매니저(apt, yum)로 관리할 수 있습니다.
sudo apt install checkinstall
sudo checkinstall
→ 설치 후 apt remove myapp으로 삭제 가능.
5. 잘못 설치했을 때의 복구
- /usr/local에 설치한 경우: find /usr/local -name "*myapp*"로 탐색 후 삭제
- /opt에 설치한 경우: 해당 디렉터리 통째로 삭제
- /usr에 섞여 설치된 경우: 반드시 설치 파일 추적 후 제거 (install-files.txt 활용)
'CS > Linux' 카테고리의 다른 글
| [Linux] 리눅스 초기화 (SysV init, systemd, rc.local) (1) | 2025.08.10 |
|---|---|
| [Linux] 백업·복구 도구 비교 (dd, dump, tar, cpio, rsync) (2) | 2025.08.09 |
| [Linux] 파일 시스템의 ACL과 속성(Attributes) (2) | 2025.08.09 |
| [Linux] 네트워크 인터페이스와 Docker 네트워크 트래픽 구조 분석 (2) | 2025.07.30 |
| [Linux] X Window System (3) | 2025.07.27 |