CS/Linux

[Linux] 소스 빌드 (make)

kyoulho 2025. 8. 10. 13:09

소스 컴파일이 필요한 이유

리눅스에서 소프트웨어 설치 방법은 크게 두 가지입니다.

  • 패키지 설치 (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 활용)