RPM build .pc 파일과 pkgconfig 의존성 정리
보통 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 를 찾게됨.