find_package()의 기본 개념

find_package()는 CMake에서 외부 라이브러리나 패키지를 찾아서 프로젝트에 포함시키기 위해 사용되는 명령어이다. 이 명령어는 주로 CMake 프로젝트에서 필요한 외부 종속성을 자동으로 탐지하고, 필요한 설정을 구성하는 데 사용된다.

find_package()의 사용법

find_package() 명령어는 다음과 같은 형식을 갖는다:

find_package(<PackageName> [version] [REQUIRED] [COMPONENTS components...])

Module 모드와 Config 모드

find_package()는 두 가지 모드로 동작할 수 있다: Module 모드와 Config 모드.

Module 모드

Module 모드는 CMake가 자체적으로 제공하거나 사용자가 정의한 Find 모듈을 사용하여 패키지를 찾는 방식이다. 예를 들어, Find<PackageName>.cmake 파일을 통해 패키지를 찾는다.

find_package(Foo)

이 명령어는 FindFoo.cmake 파일을 CMake 모듈 경로에서 찾아 실행한다. 이 파일은 보통 환경 변수를 사용하여 패키지를 찾고, CMake 변수들을 설정한다.

Config 모드

Config 모드는 패키지 자체가 제공하는 <PackageName>Config.cmake 파일을 사용하는 방식이다. 이 방식은 보통 패키지 설치 과정에서 함께 설치되는 설정 파일을 사용한다.

find_package(Foo CONFIG)

이 명령어는 FooConfig.cmake 파일을 패키지 설치 경로에서 찾아 실행한다. Config 모드는 보통 패키지의 버전 정보와 구성 설정이 포함된 파일을 제공한다.

REQUIRED 옵션

REQUIRED 옵션은 패키지가 반드시 필요할 때 사용된다. 이 옵션을 지정하면 패키지를 찾지 못할 경우 CMake는 오류를 발생시키고, 빌드가 중단된다.

find_package(Foo REQUIRED)

이 명령어는 Foo 패키지가 시스템에 설치되어 있지 않으면 빌드를 중단시킨다.

COMPONENTS 옵션

COMPONENTS 옵션은 특정 패키지 내에서 필요한 구성 요소만을 선택적으로 불러올 수 있도록 한다.

find_package(Foo COMPONENTS Bar Baz)

이 경우, Foo 패키지에서 BarBaz라는 구성 요소만을 찾아 설정한다. 필요한 구성 요소가 모두 발견되지 않으면 CMake는 오류를 발생시킬 수 있다.

QUIET 및 NO_MODULE 옵션

QUIET 옵션은 패키지를 찾지 못했을 때 경고 메시지를 억제한다. NO_MODULE 옵션은 Module 모드를 사용하지 않도록 강제한다.

find_package(Foo QUIET NO_MODULE)

이 명령어는 Foo 패키지를 조용히 찾아보되, Module 모드는 사용하지 않도록 설정한다.

find_package() 사용 시 변수 설정

find_package()는 패키지를 찾을 때 다양한 CMake 변수를 설정한다. 대표적인 변수는 다음과 같다:

예를 들어, find_package(Foo)를 사용하면 Foo_FOUND, Foo_INCLUDE_DIRS, Foo_LIBRARIES 등의 변수가 설정될 수 있다.

Custom Find 모듈 작성

CMake가 제공하지 않는 패키지를 찾기 위해 사용자 정의 Find 모듈을 작성할 수 있다. 이 파일은 Find<PackageName>.cmake 형식을 따르며, CMake 모듈 경로에 위치시킨다.


find_path(FOO_INCLUDE_DIR Foo.h)
find_library(FOO_LIBRARY NAMES foo)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Foo DEFAULT_MSG FOO_INCLUDE_DIR FOO_LIBRARY)

mark_as_advanced(FOO_INCLUDE_DIR FOO_LIBRARY)

이 예제는 Foo.h 헤더 파일과 foo 라이브러리를 찾아서 CMake 변수로 설정하는 간단한 Find 모듈이다.

경로 설정 및 패키지 검색 순서

CMake는 CMAKE_PREFIX_PATH 등의 변수를 사용하여 패키지를 검색할 경로를 지정할 수 있다. 이 경로 변수는 패키지가 설치된 디렉토리를 지정하는 데 사용된다.

set(CMAKE_PREFIX_PATH "/path/to/custom/dir")

이 경로에 따라 find_package()는 지정된 디렉토리에서 패키지를 찾는다. CMake는 기본적으로 시스템의 표준 경로를 먼저 검색하고, 그 후 사용자 정의 경로를 검색한다.


관련 자료: - CMake Documentation on find_package - [Professional CMake: A Practical Guide by Craig Scott]