Linux 환경에서 소스 코드로 소프트웨어 빌드하기

CompTIABeginner
지금 연습하기

소개

이 실습에서는 Linux 시스템에서 소스 코드를 사용하여 소프트웨어를 직접 빌드하고 설치하는 기본적인 과정을 배웁니다. 이 기술은 사용 중인 배포판의 패키지 관리자에서 찾을 수 없는 애플리케이션을 설치하거나, 특정 기능을 직접 설정하여 사용해야 할 때 매우 중요합니다. 실제 사례인 Pure-FTPd 서버를 활용하여 소스 기반 설치 워크플로우의 각 단계를 직접 경험해 보게 됩니다.

먼저 tar 명령어를 사용하여 흔히 '타볼 (tarball)'이라고 불리는 압축 아카이브 파일에서 소스 코드를 추출하는 것으로 시작합니다. 그다음 ./configure 스크립트를 실행하여 빌드 환경을 준비하고, make 명령어를 통해 소스 코드를 실행 가능한 프로그램으로 컴파일합니다. 컴파일이 성공적으로 완료되면 make install을 사용하여 시스템 전체에 소프트웨어를 설치합니다. 마지막으로, 설치된 소프트웨어를 올바르게 삭제하고 소스 파일을 정리하는 방법까지 학습함으로써 소스 코드 설치의 전체 수명 주기를 완벽히 이해하게 될 것입니다.

이 실습은 단계별 안내를 통해 학습과 실습을 돕는 가이드형 랩 (Guided Lab) 입니다. 각 단계를 주의 깊게 따라가며 실무 경험을 쌓으시기 바랍니다. 통계 데이터에 따르면 이 실습은 초급 수준이며, 98%의 높은 수료율과 학습자들로부터 100%의 긍정적인 평가를 받고 있습니다.

tar 를 이용한 소스 코드 추출

이 단계에서는 tar 명령어를 사용하여 흔히 "타볼 (tarball)"이라고 부르는 소스 코드 아카이브 파일의 압축을 푸는 방법을 배웁니다. 소프트웨어 소스 코드는 필요한 모든 파일을 하나로 묶고 전체 용량을 줄이기 위해 주로 .tar.gz와 같은 압축 아카이브 형태로 배포됩니다.

먼저, 현재 작업 디렉토리인 ~/project에 소스 코드 아카이브가 있는지 확인해 보겠습니다. ls -l 명령어를 사용하여 파일 목록과 상세 정보를 확인합니다.

ls -l

출력 결과에서 pure-ftpd-1.0.53.tar.gz 파일을 확인할 수 있어야 합니다.

total 748
-rw-r--r-- 1 labex labex 765432 Nov 10 12:00 pure-ftpd-1.0.53.tar.gz

이제 tar 명령어를 사용하여 이 아카이브의 내용을 추출하겠습니다. 사용할 옵션은 다음과 같습니다:

  • -x: 아카이브에서 파일을 추출 (extract) 합니다.
  • -z: .gz 확장자가 나타내는 것처럼 gzip 을 사용하여 아카이브의 압축을 해제합니다.
  • -v: 처리되는 모든 파일 목록을 보여주는 상세 (verbose) 출력을 활성화합니다.
  • -f: 처리할 아카이브의 파일 이름 (filename) 을 지정합니다.

터미널에서 다음 명령어를 실행하여 아카이브를 추출하세요:

tar -zxvf pure-ftpd-1.0.53.tar.gz

-v 옵션 덕분에 tar가 추출하는 각 파일의 이름이 화면에 출력됩니다. 출력 내용이 꽤 길겠지만, 아래 예시와 같이 디렉토리 구조와 파일들이 생성되는 모습을 볼 수 있습니다.

pure-ftpd-1.0.50/
pure-ftpd-1.0.50/AUTHORS
pure-ftpd-1.0.50/README
pure-ftpd-1.0.50/README.LDAP
pure-ftpd-1.0.50/README.MySQL
pure-ftpd-1.0.50/README.PGSQL
...
pure-ftpd-1.0.50/src/puredb_p.h
pure-ftpd-1.0.50/src/pure-quotacheck.c
pure-ftpd-1.0.50/src/pure-uploadscript.c

명령어 실행이 끝나면 소스 코드가 담긴 새 디렉토리가 생성됩니다. 다시 한번 ls -l을 실행하여 확인해 봅시다.

ls -l

이제 기존 타볼 파일과 함께 pure-ftpd-1.0.50 디렉토리가 보이는 것을 확인할 수 있습니다.

total 752
drwxr-xr-x 10 labex labex    4096 Nov 10 12:05 pure-ftpd-1.0.50
-rw-r--r--  1 labex labex  765432 Nov 10 12:00 pure-ftpd-1.0.53.tar.gz

아카이브에서 소스 코드를 성공적으로 추출했습니다. 다음 단계에서는 이 디렉토리로 이동하여 설정 및 컴파일 과정을 진행하겠습니다.

./configure 와 make 를 이용한 소프트웨어 설정 및 컴파일

이 단계에서는 현재 시스템 환경에 맞게 소스 코드를 설정한 후, 실행 가능한 프로그램으로 컴파일합니다. 이는 Linux 시스템에서 소스 코드로 소프트웨어를 빌드할 때 거치는 표준적인 2 단계 프로세스입니다.

먼저, 이전 단계에서 생성된 디렉토리로 이동해야 합니다. cd 명령어를 사용하여 pure-ftpd-1.0.50 디렉토리로 들어갑니다.

cd ~/project/pure-ftpd-1.0.50

소스 코드 디렉토리에 들어왔다면, 첫 번째 작업으로 configure 스크립트를 실행합니다. 이 스크립트는 시스템에 소프트웨어 빌드에 필요한 도구, 라이브러리, 의존성 파일들이 모두 갖춰져 있는지 점검합니다. 점검이 끝나면 컴파일 과정에 필요한 지침이 담긴 Makefile을 생성합니다.

스크립트를 실행할 때는 이름 앞에 ./를 붙여야 합니다. 이는 쉘에게 현재 디렉토리에 있는 configure 스크립트를 실행하라고 알려주는 것입니다.

./configure

스크립트가 실행되면서 다양한 점검 항목들이 화면에 빠르게 지나갈 것입니다. 이는 정상적인 과정입니다. 성공적으로 완료되면 아래와 유사한 요약 메시지가 나타납니다.

checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
...
checking for OpenSSL... no
...
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating man/Makefile
...
config.status: executing depfiles commands

Pure-FTPd has been configured.

config.status: creating Makefile이라는 문구를 확인하세요. 이는 Makefile이 성공적으로 생성되었음을 의미합니다.

두 번째 단계는 코드를 컴파일하는 것입니다. make 명령어는 앞서 생성된 Makefile을 읽고 컴파일러 (예: gcc) 를 적절한 옵션과 함께 실행하여, 사람이 읽을 수 있는 소스 코드 (.c 파일) 를 기계가 실행할 수 있는 바이너리 파일로 변환합니다.

이제 make 명령어를 실행하세요.

make

이 과정은 시간이 조금 걸릴 수 있습니다. make가 각 소스 파일에 대해 컴파일러를 호출함에 따라 많은 출력 내용이 나타납니다. 이것이 실제 컴파일이 진행되는 모습입니다.

(CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/bash /home/labex/project/pure-ftpd-1.0.50/config/missing automake-1.15 --gnu src/Makefile)
...
gcc -g -O2 -Wall -W -Wshadow -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline -c pure-ftpd.c
...
gcc -g -O2 -Wall -W -Wshadow -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline   -o pure-ftpd pure_ftpd-pure-ftpd.o pure_ftpd-log.o ...
...
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.50/src'

make 명령어가 오류 없이 종료되면 소프트웨어 컴파일이 성공적으로 완료된 것입니다. 이제 바이너리 파일들이 시스템에 설치될 준비가 되었으며, 다음 단계에서 설치를 진행하겠습니다.

make install 을 이용한 소프트웨어 설치

이 단계에서는 컴파일된 소프트웨어를 시스템에 설치합니다. make를 통해 소스 코드를 컴파일한 후에도 결과물인 바이너리 파일과 기타 필요한 구성 요소 (문서, 설정 파일 등) 는 여전히 소스 코드 디렉토리 안에 머물러 있습니다. make install 명령어는 이 파일들을 표준적인 시스템 경로로 복사하여, 어느 위치에서든 소프트웨어를 실행할 수 있게 해줍니다.

현재 위치가 여전히 ~/project/pure-ftpd-1.0.50 디렉토리인지 확인하세요.

설치 과정은 보통 root 사용자가 소유한 /usr/local/bin이나 /usr/local/sbin과 같은 디렉토리에 파일을 써야 합니다. 따라서 관리자 권한으로 make install을 실행하기 위해 sudo 명령어를 사용해야 합니다.

다음 명령어를 실행하여 Pure-FTPd 를 설치하세요:

sudo make install

make install 명령어는 Makefile을 읽고 설치 지침을 수행합니다. 파일들이 생성되어 시스템 디렉토리로 복사되는 과정을 출력 결과로 확인할 수 있습니다.

make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.50/src'
/usr/bin/mkdir -p '/usr/local/sbin'
/usr/bin/install -c pure-ftpd pure-pw pure-pwconvert pure-authd pure-certd pure-uploadscript pure-quotacheck '/usr/local/sbin'
/usr/bin/mkdir -p '/usr/local/share/man/man8'
/usr/bin/install -c -m 644 ../man/pure-ftpd.8 ../man/pure-pw.8 ../man/pure-pwconvert.8 ../man/pure-authd.8 ../man/pure-certd.8 '/usr/local/share/man/man8'
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.50/src'
make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.50'
/usr/bin/mkdir -p '/usr/local/etc'
/usr/bin/install -c -m 644 pure-ftpd.conf '/usr/local/etc'
make[1]: Nothing to be done for 'install-data-am'.
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.50'

이제 소프트웨어 설치가 완료되었습니다. 설치 여부를 확인하는 간단한 방법은 which 명령어를 사용하는 것입니다. 이 명령어는 시스템의 PATH 경로에서 실행 파일을 찾아 전체 경로를 출력합니다.

which pure-ftpd

설치가 성공했다면, pure-ftpd 실행 파일이 표준 시스템 디렉토리에 위치해 있음을 나타내는 다음과 같은 출력이 나타납니다.

/usr/local/sbin/pure-ftpd

이제 소프트웨어를 설정하고 사용할 준비가 끝났습니다. 하지만 이번 실습의 목적을 위해, 다음 단계에서는 설치한 소프트웨어를 다시 삭제하는 과정을 진행해 보겠습니다.

make uninstall 과 rm 을 이용한 소프트웨어 삭제 및 정리

마지막 단계에서는 소스 코드로 설치한 소프트웨어를 올바르게 삭제하고 빌드 파일을 정리하여 시스템을 원래 상태로 되돌리는 방법을 배웁니다. 이는 소프트웨어를 수동으로 관리할 때 매우 중요한 과정입니다.

Makefile을 사용하는 잘 만들어진 소스 패키지들은 대부분 uninstall 타겟을 제공합니다. 이 타겟은 make install이 수행한 작업을 역으로 실행하여 시스템 디렉토리에 복사된 모든 파일을 제거하도록 설계되었습니다.

먼저 현재 위치가 ~/project/pure-ftpd-1.0.50 디렉토리인지 확인하세요. 설치와 마찬가지로 삭제 작업에도 관리자 권한이 필요합니다. sudo와 함께 make uninstall 명령어를 사용하세요.

sudo make uninstall

설치되었던 시스템 디렉토리에서 파일들이 삭제되고 있다는 메시지가 출력됩니다.

make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.50/src'
rm -f /usr/local/sbin/pure-ftpd /usr/local/sbin/pure-pw /usr/local/sbin/pure-pwconvert /usr/local/sbin/pure-authd /usr/local/sbin/pure-certd /usr/local/sbin/pure-uploadscript /usr/local/sbin/pure-quotacheck
rm -f /usr/local/share/man/man8/pure-ftpd.8 /usr/local/share/man/man8/pure-pw.8 /usr/local/share/man/man8/pure-pwconvert.8 /usr/local/share/man/man8/pure-authd.8 /usr/local/share/man/man8/pure-certd.8
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.50/src'
make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.50'
rm -f /usr/local/etc/pure-ftpd.conf
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.50'

소프트웨어가 정상적으로 삭제되었는지 확인하기 위해 다시 한번 which 명령어를 사용해 봅니다.

which pure-ftpd

이번에는 아무런 출력도 나오지 않아야 합니다. pure-ftpd 실행 파일이 /usr/local/sbin에서 삭제되어 시스템의 PATH에서 더 이상 찾을 수 없기 때문입니다.

소프트웨어가 삭제되었으므로, 마지막으로 소스 코드 디렉토리 자체를 제거하겠습니다. 현재 위치한 디렉토리는 삭제할 수 없으므로, 먼저 프로젝트의 루트 디렉토리로 이동합니다.

cd ~/project

이제 rm 명령어에 -r(재귀적 삭제) 옵션을 사용하여 pure-ftpd-1.0.50 디렉토리와 그 안의 모든 내용을 삭제합니다.

rm -r pure-ftpd-1.0.50

명령어가 성공적으로 실행되면 아무런 메시지도 출력되지 않습니다. ~/project 디렉토리의 내용을 확인하여 삭제 여부를 검증할 수 있습니다.

ls -l

pure-ftpd-1.0.50 디렉토리는 사라지고 원래의 타볼 파일만 남은 것을 확인할 수 있습니다.

total 748
-rw-r--r-- 1 labex labex 765432 Nov 10 12:00 pure-ftpd-1.0.53.tar.gz

축하합니다! 소스 코드 추출부터 설정, 컴파일, 설치, 그리고 마지막 삭제와 정리까지 소프트웨어 빌드의 전 과정을 성공적으로 마쳤습니다.

요약

이 실습을 통해 Linux 시스템에서 소스 코드를 사용하여 소프트웨어를 빌드하고 설치하는 표준 절차를 학습했습니다. 먼저 tar 명령어를 사용하여 타볼 (.tar.gz) 이라고 불리는 압축 소스 코드 아카이브를 추출하는 것으로 시작했습니다. 추출 후에는 소스 디렉토리로 이동하여 ./configure 스크립트를 실행함으로써 시스템 의존성을 점검하고 Makefile 을 생성하여 컴파일 준비를 마쳤습니다. 마지막으로 make 명령어를 사용하여 소스 코드를 실행 가능한 바이너리로 컴파일하고, make install을 통해 소프트웨어를 적절한 시스템 디렉토리에 복사했습니다.

또한, 설치된 소프트웨어를 제거하고 빌드 환경을 정리하는 올바른 방법도 실습했습니다. make uninstall 명령어를 사용하여 시스템에서 설치된 파일들을 삭제하는 방법을 배웠으며, 마지막으로 rm 명령어를 사용하여 원본 소스 코드 디렉토리를 제거함으로써 시스템을 이전 상태로 깨끗하게 되돌리는 과정을 완료했습니다.