2015. 7. 26. 11:25

컴파일 가이드


* 이 페이지는 리눅스와 그 파생들 하에서 소스코드 패키지로부터 시작하는 프로젝트를 컴파일하기 위한 일반적인 명령어들을 제공한다


- 소스 코드로부터 컴파일해야 하는 이유

바이너리 패키지는 보통 많은 플랫폼들에 대해 서드파티 패키져에 의해 제공되지만, 일부의 경우 여러 이유로 옵션이 없다

* 바이너리 패키지는 기한이 지나거나 치명적인 버그를 포함하거나 소프트웨어의 최신 버전에서 사용할 수 있는 필수적인 특징이 빠져있다

* 예를 들어 특별한 설치 레이아웃을 지원하기 위해, 플랫폼-특별 옵션을 얻기 위해 또는 바이너리 패키지에 지원되지 않는 특별한 라이브러리에 대한 링크를 위해 빌드를 커스터마이즈 할 필요가 있다

* 소스 코드를 편집하므로써 소프트웨어를 커스터마이즈 하기를 원한다


이 모든 경우에 소스코드로부터 패키지를 빌드하는 것은 최상의 해답이다


* 개요

대부분의 소스 패키지 설치는 다음과 같은 과정을 따른다고 가정한다

* configuration(with a configure script)

* compilation(with make)

* installation(with make install)


Configuration은 컴파일 스텝을 따름으로써 필요되는 필수적인 파일의 생성을 허락할 것이고, 일반적으로 소스 패키지에 의해 제공되는 configure 스크립트를 통해 되어진다. configuration 동안 install prefix와 사용 가능한 컴포넌트를 정의하는 것은 가능한다


컴파일은 보통 configuration 단계 완료 후에 make를 실행하는 것으로 구성된다. 이 구문에서 필요한 라이브러리와 바이너리는 생성된다.

Installation은 configuration 단계동안 지정된 path에서 바이너리와 라이브러리를 설치할 것이다. 컴파일 경로 안에 컴퓨일된 바이너리를 사용할 수 있기 때문에 이 단계는 정말로 필요하지 않다


* 설치 경로

패키지는 여러 디렉토리에 설티된 여러 개의 연관있는 파일들로 구성된다. configure 단계는 보통 사용자가 install prefix라 불리는 것을 지정하도록 허락하고, 보통 configure --prefix=PREFIX 옵션을 통해 구체화된다, 여기에서 PREFIX는 보통 기본으로 /usr/local에 있다. prefix는 모든 컴포넌트가 설치되어 있는 공통적인 디렉토리를 구체화한다


다음 디렉토리들은 보통 설치 안에 포함된다

- PREFIX/bin : 생성된 바이너리들을 포함한다(e.g. FFmpeg의 경우 ffmepg, ffplay, ffprobe 등)

- PREFIX/include : 라이브러리 헤더를 포함한다(e.g. FFmpeg의 경우 libavutil/avstring.h, libavcodec/avcodec.h, libavformat/avformat.h 등)은 패키지 라이브러리에 대해 링크된 응용프로그램을 컴파일 하기 위해 필요하다

- PREFIX/lib : 생성된 라이브러리를 포함한다(e.g. FFmpeg의 경우 libavutil, libavcodec, libavformat 등)

- PREFIX/share : 다양한 시스템 독립적인 컴포넌트를 포함한다; 특히 문서 파일과 예제


prefix를 구체화 함으로써, 설치 레이아웃을 정의하는 것이 가능하다

/usr/local/과 같이 shared prefix를 사용함으로써 다른 패키지가 같은 디렉토리에 설치될 것이어서 일반적으로 설치를 바꾸는 것이 더 어려울 것이다

/opt/PROJECT/와 같은 prefix를 사용하기 때문에 프로젝트는 지정된 디렉토리에 설치될 것이고 시스템으로부터 제거하기 위해 간단히 /opt/PREFIX 경로를 제거할 수 있다. 반면에 그런 설치는 커스텀 경로를 가리키기 위해 모든 환경 변수를 편집할 필요가 있다.


* 환경 변수

환경에 정의된 여러 변수들은 패키지 설치에 영향을 미친다. 특히 설치 prefix에 의존하여 시스템 도구에 발견될 수 있는 설치된 컴포넌트들을 확신하기 위해 이 변수들의 일부를 업데이트 할 필요가 있다.

환경 변수들의 리스트는 env 명령어를 통해 보여질 수 있다.

영향력 있는 변수들의 리스트는 다음과 같다

- PATH : : 는 경로를 구분한다 여기서 시스템은 바이너리를 찾는다. 예를 들어 만약 /usr/local/에 패키지를 설치하면, /usr/local/bin/을 포함하기 위해서 PATH를 업데이트 해야 한다. 예를 들어 export PATH=/usr/local/bin:$PATH 명령어를 통해 될 수 있다.

- LD_LIBRARY_PATH :  /usr/local/lib - export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH. 이 변수는 가끔 ldconfig를 이용해 사용안 되게 할 수 있다

- CFLAGS : C 컴파일러의 의해 사용되는 플래그를 포함한다

- LDFLAGS : 링커에 의해 사용되는 지시자 -LPREFIX/lib

- PKG_CONFIG_PATH : pkg-config