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
참고자료
- https://cmake.org/cmake/help/latest/command/find_package.html
- https://www.reddit.com/r/cpp_questions/comments/svese6/find_package_in_cmakelisttxt/
- https://wiki.hanzheteng.com/development/cmake/cmake-find_package
- https://stackoverflow.com/questions/20746936/what-use-is-find-package-when-you-need-to-specify-cmake-module-path
- https://cmake.org/cmake/help/latest/variable/CMAKE_FIND_PACKAGE_PREFER_CONFIG.html
'CMake' 카테고리의 다른 글
[CMake] .cmake 파일의 사용 (0) | 2025.04.23 |
---|---|
[CMake] target_link_directories(), target_link_libraries() (0) | 2025.04.22 |
[CMake] CMAKE_PREFIX_PATH (0) | 2025.04.17 |
[CMake] Microsft store에서 제공하는 powerhsell의 HRESULT: 0x80070005 오류 (0) | 2025.04.15 |
[CMake, C++, VScode] linter 에러 (0) | 2023.01.08 |