어떤 패키지 관리자를 사용하든, 리눅스에서 프로그램을 설치하는 방법은 크게 두 가지입니다. 미리 빌드된 패키지를 사용하거나, 프로그램을 직접 컴파일하는 것입니다. 요즘은 전자가 기본 선택지가 되었지만, 때로는 소스에서 직접 컴파일하는 것을 고려해볼 만한 경우도 있습니다.
바이너리 패키지란 무엇인가?

리눅스에서 프로그램을 설치하는 방식은 윈도우의 전통적인 소프트웨어 설치 방식과 상당히 다릅니다. 제조사 웹사이트에서 설치 파일을 내려받는 대신, 사용 중인 리눅스 배포판에 맞춰 구성된 프로그램 저장소(repository)에서 파일을 가져옵니다. 이 저장소는 리눅스 패키지 관리자나 앱 스토어를 통해 접근할 수 있습니다.
이러한 저장소의 프로그램을 구성하는 파일들은 아카이브 형식으로 되어 있습니다. 모든 것을 하나의 파일로 묶어 접근과 배포가 쉽도록 만든 것입니다. 예를 들어 데비안은 DEB 형식으로 프로그램을 저장하고 배포합니다. 이렇게 묶인 파일들을 바이너리 패키지라고 부릅니다.
이 파일들을 추출해 컴퓨터에 설치하려면 패키지 관리자나 앱 스토어 같은 전용 프로그램이 필요합니다. 이러한 도구는 설치된 파일 목록을 추적하거나 소프트웨어 업데이트를 관리하는 등의 유용한 기능도 함께 수행합니다.
패키지는 어디에서 오는가?
모든 소프트웨어는 C나 C++ 같은 특정 프로그래밍 언어로 작성된 소스 코드라는 텍스트로 이루어져 있습니다. 일반적으로 이 소스 코드를 그냥 아카이브로 묶는다고 해서 패키지가 되는 것은 아닙니다. 코드는 컴퓨터가 이해하고 실행할 수 있는 언어로 변환되어야 합니다.
이 과정을 컴파일이라고 하며, 그 결과물로 컴퓨터가 실행할 수 있는 바이너리가 생성됩니다. 패키지와 소프트웨어의 차이점은, 소프트웨어 바이너리가 설정 파일 같은 다른 요소들과 함께 하나의 패키지 안에 저장된다는 점입니다.
"소스에서 설치"란 무엇인가?

프로그램을 "소스에서 설치"한다는 것은 패키지 관리자를 사용하지 않고 프로그램을 설치하는 것을 의미합니다. 대신 소스 코드를 직접 컴파일하고 그 결과물인 바이너리를 컴퓨터에 복사하는 방식입니다.
대부분의 경우 GitHub, GitLab, Bitbucket 같은 호스팅 서비스에서 프로젝트의 소스 코드를 내려받을 수 있습니다. 규모가 큰 프로그램은 개인 웹사이트에 소스 코드를 올려두기도 합니다. 코드는 보통 아카이브 형식으로 압축되어 있으며, 이를 소스 패키지라고 부릅니다.
빌드 과정을 자동화해 주는 특수한 도구들이 있습니다. 리눅스 데스크톱에서는 주로 make라는 명령줄 프로그램이 이 역할을 담당합니다. 서로 다른 언어로 작성된 소스 코드는 바이너리로 변환하기 위해 각각의 컴파일러와 명령이 필요한데, make 프로그램이 이 과정을 자동으로 처리해 줍니다.
이 자동화가 동작하려면 프로그램이 make에게 무엇을 컴파일할지 알려주는 makefile을 제공해야 합니다. 요즘은 CMake 같은 전용 소프트웨어가 makefile을 자동으로 생성해 주는 경우가 많습니다. 여기부터는 사용자의 몫입니다. 어떤 기능을 소프트웨어에 포함시켜 컴파일할지 정확하게 지정할 수 있습니다.
소스 빌드 예시
예를 들어 아래 명령은 CMake를 사용해 Calligra 오피스 스위트의 설정 파일을 생성합니다. 생성된 파일은 make 프로그램에게 Calligra의 Writer 구성 요소만 컴파일하도록 지시합니다.
cmake -DPRODUCTSET=WORDS -DCMAKE_INSTALL_PREFIX=$HOME/kde/inst5 $HOME/kde/src/calligra
이렇게 설정한 후에는 make 도구를 실행해 컴파일하고 결과물을 컴퓨터에 복사하기만 하면 됩니다. 방법은 다음과 같습니다:
make
make install
이것이 프로그램을 컴파일하는 일반적인 패턴이지만, 소스 패키지를 설치하는 방법은 이 외에도 다양합니다. 예를 들어 젠투(Gentoo) 리눅스는 이를 처리하는 내장 방식을 갖추고 있어 과정이 훨씬 빠르고 쉽습니다. 반면 바이너리 패키지를 만드는 것은 위 명령보다 몇 단계 더 많은 과정이 필요합니다.
바이너리 패키지의 장점
리눅스를 사용하고 있다면, 설치된 소프트웨어는 누군가 미리 컴파일해 둔 것일 가능성이 높습니다. 소스 패키지보다 바이너리 패키지 사용이 훨씬 보편화되었는데, 그 이유는 무엇일까요?
바이너리 버전은 관리가 더 쉽다

바이너리 패키지에는 컴파일된 설치 파일만 들어 있는 것이 아닙니다. 패키지 관리자가 모든 프로그램을 손쉽게 추적할 수 있도록 돕는 정보도 함께 저장되어 있습니다. 예를 들어 DEB 파일(데비안 및 데비안 계열 배포판의 패키지 형식)에는 프로그램 실행에 필요한 다른 소프트웨어(의존성)와 현재 버전 같은 중요한 정보도 포함되어 있습니다.
덕분에 패키지 설치가 훨씬 수월합니다. 프로그램이 정상적으로 실행되기 위해 어떤 파일이 추가로 필요한지 걱정할 필요가 없습니다. 패키지 관리자가 패키지 자체에서 해당 정보를 읽어 필요한 의존성을 자동으로 내려받아 줍니다.
반면 소스에서 프로그램을 설치할 때는, 코드를 별도의 바이너리 패키지로 만들지 않는 한 사용자 본인이 그 소프트웨어를 관리해야 합니다. 프로그램이 작동하는 데 필요한 다른 프로그램들을 파악하고 직접 설치해야 합니다.
바이너리 버전은 안정성이 높다
패키지 저장소를 관리하는 사람들은 바이너리의 문제점을 테스트하고, 발견된 문제를 최대한 수정하려고 노력합니다. 이는 프로그램의 안정성 향상으로 이어지며, 소스에서 직접 설치한 사용자는 이러한 혜택을 놓칠 수 있습니다.
또한 패키지는 시스템에서 정상적으로 실행될 수 있도록 엄격한 규칙을 따라야 하는 경우가 많습니다. 데비안과 우분투에는 정책 매뉴얼이 있으며, 다른 많은 리눅스 배포판도 마찬가지입니다.
일부 프로그램은 동일한 소프트웨어 의존성의 서로 다른 버전에 의존하기도 합니다. 패키지 저장소는 이런 충돌을 해결하려고 최선을 다하기 때문에, 사용자가 일일이 신경 쓸 필요가 없습니다.
소스 패키지 컴파일의 장점
소스에서 프로그램을 설치하는 것이 모두에게 필요한 것은 아닙니다. 바이너리 패키지를 고수하는 것이 PC 관리 측면에서 일반적으로 더 쉽기 때문입니다. 그럼에도 불구하고 이 다소 번거로운 설치 방식에는 분명한 장점이 있습니다.
소스 코드는 최신 소프트웨어를 제공한다
프로그램의 신뢰성을 높이는 데에는 시간이 걸린다는 점이 단점 중 하나입니다. 그 결과 상대적으로 오래된 버전의 소프트웨어를 사용하게 될 수 있습니다. 최신 기능을 원하는 사람들은 약간의 불안정성을 감수하는 편을 선호하기도 합니다.
컴파일 없이 이러한 수요를 충족해 주는 리눅스 운영체제도 있지만, 몇 가지 단점이 있습니다. 예를 들어 정기적인 패키지 버전을 릴리스하지 않는 소프트웨어는 저장소에서 최신 상태로 유지하기가 소스 설치보다 어렵습니다.
그 이유는 바이너리 패키지가 보통 프로그램의 공식 릴리스 버전을 기반으로 만들어지기 때문입니다. 따라서 버전 사이의 변경 사항은 대부분 반영되지 않습니다. 소스에서 직접 컴파일하면 이러한 변경 사항을 즉시 활용할 수 있습니다.
또한 사용하려는 소프트웨어가 리눅스 운영체제에 미리 패키지로 제공되지 않을 수도 있습니다. 그런 경우 소스에서 설치하는 것이 유일한 선택지입니다.
원하는 것만 골라 담을 수 있다

소스 패키지의 또 다른 장점은 설치하는 프로그램에 대해 더 많은 통제권을 가질 수 있다는 것입니다. 바이너리 저장소에서 설치하면 패키지를 커스터마이징할 수 있는 방법이 제한적입니다.
예를 들어 명령줄 기반 오디오·비디오 변환기인 FFmpeg를 살펴보겠습니다. 기본적으로 수많은 기능이 포함되어 있으며, 그중 일부는 평생 사용하지 않을 수도 있습니다. 실제로 FFmpeg에는 JACK 오디오 지원이 포함되어 있지만, 이 기능은 주로 전문 프로덕션 환경에서만 사용됩니다.
FFmpeg를 직접 컴파일하면 원하지 않는 기능을 제거하여 더 가볍고 자신의 필요에 딱 맞는 프로그램을 만들 수 있습니다. 이는 다른 대형 프로그램에도 마찬가지로 적용됩니다.
시스템 자원이 부족할 때는 기능을 제거하는 것이 부담을 덜는 좋은 방법이 됩니다. 저사양 컴퓨터에 많이 탑재되는 Chrome OS가 젠투 리눅스 기반인 것도 결코 우연이 아닙니다. 소스 기반인 젠투는 많은 소프트웨어를 직접 컴파일하기 때문에 시스템을 훨씬 가볍게 운영할 수 있습니다.
둘 다 활용하면 안 될까?
매일 패키지를 컴파일하고 싶지는 않겠지만, 이 방법을 알아두면 언젠가 유용하게 쓰일 수 있습니다. 다만 Snap Store나 Flathub 같은 곳에서 제공하는 새로운 범용 패키지 형식 덕분에, 최신 소프트웨어를 얻기 위해 굳이 소스에서 빌드해야 할 일은 점점 줄어들고 있습니다.