pkgconfig pkg-config

markyang92·2022년 12월 6일
1

yocto

목록 보기
28/53
post-thumbnail

보통 inherit pkgconfig로 사용된다.


openembedded-core/meta/classes/pkgconfig.bbclass가 있는데 내용은 아래와 같다.

DEPENDS:prepend = "pkgconfig-native "
  • 딱 한 줄 있다.
    • 즉, 사용하는 recipe에서 inherit pkgconfig를 사용하면
      • DEPENDS:prepend = "pkgconfig-native " 를 사용한다.
      • 즉 해당 레시피 빌드시, Native pkgconfig를 필요로한다.
    • 그렇다면 $TMPDIR/work/x86_64-linux/pkgconfig-native가 있다는 건데?

pkgconfig

  • compile 할 때, -I/usr/include/glib-2.0, -lglib-2.0 과 같이 설정 했던 것이 기억나는가?
    • 이러한 라이브러리들이 /usr/local과 같은 경로에 있다면, 일일히 옵션을 적어줘야한다.
  • 이러한 것들을 관리하는 것이 쉽지않은데, pkgconfig가 도와준다.
    • 핵심 내용은 라이브러리를 가져다 쓰는 사람에게, 컴파일, 링크 정보를 쉽게 제공하는 것이다.
      • -I${includedir}/foo, -L${libdir} -lfoo
  • .pc 파일로 관리가 된다.
    • /usr/lib/pkgconfig
    • /usr/local/lib/pkgconfig
    • 에 저장된다.
  • .pc파일의 예
  • 메타데이터
    • Name: 라이브러리 | 패키지이름으로 사람에게 읽힐 용도로 사용한다.
      • 주의: pkg-config 툴에서 사용하는 .pc파일의 파일 이름과는 별개
    • Description
    • URL
    • Version이 패키지를 가져다가 사용하는 다른 패키지에 영향을 줄 수 있는 부분이다.
      pkg-config 시스템은 RPM의 버전 비교 알고리즘을 사용한다.
      버전 값은 .숫자로만 이루어진 형태를 사용해야 한다.
      숫자가 아닌 알파벳 글자를 사용하면 제대로 동작하지 않을 수 있으며, 버전 숫자는 증가하는 값을 사용하며 라이브러리의 변화를 구체적으로 반영해야 한다.
      버전만으로 충분히 이 패키지를 가져다 사용하는 다른 패키지에 갱신 정보를 제공할 수 있다.

    • Requires: 이 패키지가 Depend하는 다른 패키지 이름의 목록으로 공백으로 구분한다.
      비교 연산자(=, <, >, <=, >=)를 사용하여 버전 지정을 할 수 있다.
    • Requires.private: 이 패키지가 Depend하는 다른 패키지의 이름 목록으로 공백으로 구분한다.
      Requires와는 다르게, 패키지 안에서만 사용하며, 이 패키지를 가져다 사용하는 애플리케이션에는 사용할 필요 없을 패키지를 나열한다.
      이 패키지를 링크하여 사용하는데 굳이 노출시키지 않아도 될 의존 라이브러리라면 여기에 작성하자! 이 패키지를 가져다 사용하는 다른 패키지에서 이 패키지가 의존하는 패키지의 심볼을 직접 사용하는 것이 아니라면 굳이 링크를 하지 않아도 되기 때문이다.
    • Conflicts (optional): 패키지와 충돌을 일으키는 다른 패키지를 목록 형식으로 정의한다. 버전을 지정하는 형식은 Requires와 같다. Conflicts: bar < 1.2.3, bar >= 1.3.0 형식으로 같은 패키지를 두 번 정의하는 것도 가능하다.
    • Cflags: 외부에서 이 패키지를 가져다 컴파일할 때 사용하는 컴파일러 옵션 플래그로, 이 패키지에서 의존하는 컴포넌트가 pkg-config 파일을 지원하지 않아서 컴파일러 옵션을 지정하도록 전달하기 위해 사용된다.
      이 패키지에서 의존하는 컴포넌트가 pkg-config를 지원한다면 RequiresRequires.private에 이름만을 나열해야 한다.
    • Libs: 외부에서 이 패키지를 가져다 링크할 때 사용하는 링크 옵션 플래그로, Cflags와 마찬가지로 이 패키지에서 Public하게 의존하는 컴포넌트가 pkg-config파일을 지원하지 않는 경우 링크 옵션을 지정하도록 전달하기 위해 사용한다.
      이 패키지에서 의존하는 컴포넌트가 pkg-config 파일을 지원한다면 RequiresRequires.private에 지정해야한다.
    • Libs.private: 외부에서 이 패키지를 가져다가 정적 링크할 때 사용하는 링크 옵션 플래그다. 이 패키지가 의존하여 사용하는 다른 패키지를 링크하는 옵션 플래그로 이 패키지를 가져다가 사용하는 애플리케이션에서 직접 사용할 필요 없을 패키지에 대한 링크 옵션 플래그이다. 이 패키지에서 의존하는 컴포넌트가 pkg-config 파일을 지원한다면, RequiresRequires.private에 지정해야한다.

pkg-config 파일 작성

  • 어떤 패키지에 대한 pkg-config파일을 작성하려면, 우선 패키지, 라이브러리가 어떤 형태로 배포될 지 생각해봐야 한다.
    • pkg-config파일이 라으벌리 하나만을 대표하는 것이 가장 좋으며, 이 때에는 패키지, 라이브러리 '마다' pkg-config 파일 하나씩 생성해야한다.

파일명

  • 패키지설치하게 되는 라이브러리 파일 이름libfoo.so라면, libfoo.'pc' 라고 파일명을 짓자.
    • 주의 .pc 파일 이름이 내 패키지를 가리킬 수 있도록, 다른 .pc파일과 겹치지 않는 파일 이름을 가지자.
      • foo.pc, foolib.pc도 파일 이름으로 사용할 수 있다.

$PKG_CONFIG_PATH

  • 기본적으로 /usr/lib/pkgconfig, /usr/share/pkgconfig
    • 대부분 시스템에 설치된 라이브러리 모듈은 보통 위의 디렉토리에 pkg-config를 위치시킨다.
    • 일부는 /usr/local/lib/pkgconfig에 있는 경우도 있는데 이경우, export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

그럼 여튼, 내 프로그램이 라이브러리 x를 사용하려 한다.

$ gcc $(pkg-config --cflags --libs x) myapp.c -o myapp

pciutils에서 pkg-config를 사용

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글