Linux

RPM build .pc 파일과 pkgconfig 의존성 정리

yunilogs 2025. 5. 15. 00:48

보통 A.rpm 패키지가 빌드될 때, foo.rpm 패키지에 의존성이 걸리면(foo가 설치되어야 A가 설치되어야 한다면)

다음과 같은 방법으로 A.spec 파일에 룰이 작성된다.

 

BuildRequires: pkgconfig(foo)

=> 빌드할때 foo.pc 파일이 필요하니 알아서 해당 .pc가 들어있는 devel 패키지를 깔아 달라는 뜻.

=> 참고로 pkgconfig(foo)는 foo.pc가 들어있는 devel 패키지를 가리키는 이름.

위의 행위는 이를 만족시키는 foo-devel이 설치된다.

 

foo-devel이 설치되는 것은 어떤 의미인데?

devel이 붙는 패키지는 개발용 패키지임.

좀 더 정확하게 말하자면 foo-devel.rpm 은 아래의 파일들이 정의된다.

1. 헤더 파일(/usr/include/foo/*.h)

2. 링커 심볼릭 링크

3. 정적 라이브러리 (필요시)

4. .pc 파일 - 해당 설명은 따로 추가

=> foo-devel.rpm을 설치해야, #include <foo.h> 컴파일과 -lfoo 링크가 가능하다.

=> 따라서 devel 패키지는 런타임 패키지에 대해 Requires: libfoo = %{vesion} 을 명시해야한다.

 

단순하게 말하면, A 패키지에서 foo 패키지의 헤더나, 라이브러리를 쓰는 경우 알려줄 수 있게 devel이 필요한 것.

%package devel
Summary:        libfoo 개발용 파일
Requires:       %{name} = %{version}    # 런타임 패키지 의존
BuildRequires:  pkgconfig(libfoo)       # 자기 자신의 .pc 파일 검사

=> 실제 동작하는 라이브러리 코드(libfoo.so)는 foo 런타임 패키지에 들어있다. ex) lbifoo.so.1.2.3

 

 

.pc 파일?

- 라이브러리를 빌드할 때 컴파일러와 링커에 넘겨야할 경로, 링크 옵션, 라이브러리 의존 관계를 관리하도록 설계된 메타데이터 파일.

- 보통 /usr/lib/pkgconfig 또는 /usr/lib64/pkgconfig 하위에 설치 됨.

예를 들면 아래와 같은 빌드 옵션, 정보들을 참조할수 있다.

prefix=/usr                   # 1. 전체 설치 경로의 기본(base) 디렉터리
exec_prefix=${prefix}         # 2. 실행 파일이나 라이브러리 등이 설치될 경로 (prefix와 동일)

libdir=${exec_prefix}/lib64   # 3. 공유 라이브러리(.so)가 설치될 디렉터리
includedir=${prefix}/include  # 4. 헤더 파일(.h)이 설치될 디렉터리

Name: foo                     # 5. pkg-config 모듈 이름 (이 이름으로 호출)
Description: Foo 라이브러리   # 6. 라이브러리 설명
Version: 1.2.3                # 7. 라이브러리 버전

Requires: bar >= 2.0.0        # 8. 컴파일·링크 시점에 반드시 함께 사용해야 하는 다른 모듈
Requires.private: baz         # 9. 정적 링크(static) 시 추가로 필요한 모듈

Cflags: -I${includedir}/foo   # 10. 컴파일러에 넘길 헤더 검색 경로 옵션
Libs: -L${libdir} -lfoo       # 11. 링커에 넘길 라이브러리 검색 경로 및 링크 옵션
Libs.private: -lbaz           # 12. 정적 링크할 때만 추가로 필요한 `-l` 옵션

이때 Libs: 의 -lfoo로 libfoo.so 를 찾게됨.