[CMake] find_package()

Artiper
|2025. 4. 16. 20:13

find_package()

패키지(일반적으로 프로젝트 외부에서 제공)를 찾아 패키지별 세부 정보를 로드한다. 이 명령에 대한 호출은 dependency providers가 가로챌 수도 있다.

 

find_package(<PackageName> [<version>] [REQUIRED] [COMPONENTS <components>...])
  • `<PackageName>` : 유일한 필수 인수이다.
  • `[<version>]` : 생략하는 경우가 많다
  • `[REQUIRED]` : 패키지 없이 프로젝트가 성공적으로 configure 될 수 없으면 지정해야 한다.
  • `[COMPONENTS <components>]` : 좀 더 복잡한 패키지들은 `COMPONENTS` 키워드로 컴포넌트를 선택할 수 있도록 지원하지만, 대부분 패키지는 그 정도로 복잡하지는 않다.

 

Basic Signature

사용된 모드에 관계없이 패키지 탐색 성공 여부를 나타내는 <PackageName>_FOUND 변수가 설정된다. 패키지가 발견되면 패키지 자체에 문서화된 다른 변수와 임포트된 대상을 통해 패키지 관련 정보가 제공될 수 있다.

  • `QUIET` : 필요한 패키지가 아닌 경우 패키지를 찾을 수 없다는 등의 정보 메세지를 표시하지 않도록 설정한다.
  • `REQUIRED` : 패키지를 찾을 수 없는 경우 오류 메시지와 함께 처리를 중지한다.
  • `COMPONENTS` : 필수 컴포넌트의 패키지별 목록은 COMPONENTS 키워드 뒤에 나열될 수 있다. 이러한 구성 요소 중 하나라도 충족되지 않으면 패키지를 찾을 수 없는 것으로 간주한다.

 

Search Modes

find_packge() 커맨드는 패키지를 검색하기 위한 몇 가지 모드가 존재한다. Module 모드가 Config 모드보다 우선순위가 높으므로 사용자가 직접 `Find<packageName>`.cmake 파일을 작성하여 기본 config 파일을 덮어쓸 수 있다.

 

Module mode

해당 모드는 CMake에서 `Find<PackageName>.cmake`라는 파일을 검색한다. 먼저 CMAKE_MODULE_PATH에 나열된 위치를 찾은 다음, CMake 설치 시 제공된 Find Modules를 검색한다. 파일을 발견하면 해당 파일을 읽고 처리한다. 이는 라이브러리 제공자가 아닌 사용자가 작성하는 경우가 많다. 별도의 커스텀 된 패키지 찾기 로직이 필요하거나, 과거에는 많은 라이브러리들이 CMake를 공식적으로 지원하지 않아 라이브러리 사용자가 `Find<PackageName>.cmake`를 작성하는 경우가 많았다고 한다,

 

Config mode

일반적으로 패키지를 설치한 디렉터리에 존재한다. 이 모드에서 CMake는 `<lowercasePackageName>-config.cmake` 또는 `<PackageName>Config.cmake`라는 파일을 검색한다. 버전 정보가 지정된 경우 `<lowercasePackageName>-config-version.cmake` 또는 `<PackageName>ConfigVersion.cmake`도 검색한다. config 모드를 사용하기 위해서는 해당 패키지 설치 디렉터리를 CMAKE_PREFIX_PATH에 전달해야 한다.

 

 

해당 사이트를 참고하면 모드 우선 순위를 변경할 수 있다.

https://cmake.org/cmake/help/latest/variable/CMAKE_FIND_PACKAGE_PREFER_CONFIG.html

 

 

참고자료