Я использую cmake в Windows для сборки RTK, который зависит от ITK, но RTK (который использует find_package()) не может найти мою установку ITK, хотя я указываю место ее установки с помощью ITK_DIR
.
Я собрал ITK отдельно и установил его (используя цель установки cmake) в <...>/ITK/install
. Я вижу, что ITKConfig.cmake
вставили <...>/ITK/install/lib/cmake/ITK-4.13
. Я вызываю cmake с
> cmake -DITK_DIR=<...>/ITK/install .
Согласно документация find_package():
[...] CMake constructs a set of possible installation prefixes for the package. Under each prefix several directories are searched for a configuration file. The tables below show the directories searched. Each entry is meant for installation trees following Windows (W), UNIX (U), or Apple (A) conventions:
<prefix>/ (W) <prefix>/(cmake|CMake)/ (W) <prefix>/<name>*/ (W) <prefix>/<name>*/(cmake|CMake)/ (W) <prefix>/(lib/<arch>|lib|share)/cmake/<name>*/ (U) <prefix>/(lib/<arch>|lib|share)/<name>*/ (U) <prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ (U) <prefix>/<name>*/(lib/<arch>|lib|share)/cmake/<name>*/ (W/U) <prefix>/<name>*/(lib/<arch>|lib|share)/<name>*/ (W/U) <prefix>/<name>*/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ (W/U)
[...] Directories above marked with (W) are intended for installations on Windows where the prefix may point at the top of an application’s installation directory. Those marked with (U) are intended for installations on UNIX platforms where the prefix is shared by multiple packages. This is merely a convention, so all (W) and (U) directories are still searched on all platforms.
Основываясь на этой информации, я ожидаю, что find_package() найдет ITKConfig.cmake
. Но это связано с системной установкой ITK, которая у меня есть в C:\Program Files
. Я включил CMAKE_FIND_DEBUG_MODE=ON
и получил следующий результат от find_package():
Checking file [C:/<...>/ITK/install/ITKConfig.cmake]
Checking file [C:/<...>/ITK/install/itk-config.cmake]
Checking prefix [C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/]
Checking file [C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/ITKConfig.cmake]
Checking file [C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/itk-config.cmake]
... <more> ...
Похоже, он ищет в ITK_DIR
, но не в подкаталоге lib/cmake/ITK-4.13
, где находится файл ITKConfig.cmake
.
Однако если я вместо этого укажу конкретную папку, в которой находится этот файл, например так:
> cmake -DITK_DIR=<...>/ITK/install/lib/cmake/ITK-4.13 .
затем find_package() находит ITK и работает.
Что я неправильно понимаю? Я бы предпочел не указывать имя версии пакета в переменной ITK_DIR
, поэтому было бы неплохо иметь поведение, описанное в документации.
Переменная CMakeFoo_DIR
— это не префикс для файла конфигурации поиска для Foo
пакета. Это каталог, в котором находится файл конфигурации точно или вообще не находится:
If
<PackageName>_DIR
has been set to a directory not containing a configuration file CMake will ignore it and search from scratch.
Описание find_package
содержит алгоритм выбора префиксы. Один из них является:
Search paths specified in cmake-specific environment variables. ...
<PackageName>_DIR
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH
Здесь вы можете найти переменную <PackageName>_DIR
, но на этот раз это переменная окружающая обстановка:
> ITK_DIR=<...>/ITK/install cmake .
Если вы хотите установить переменную CMake, вы можете установить переменную <PackageName>_ROOT
:
> cmake -DITK_ROOT=<...>/ITK/install .
Обратите внимание, что такая переменная используется только последними версиями CMake (начиная с CMake 3.12).
Обратите внимание, что каталоги поиска не будут содержать компонент версия
ITK-4.13/
. Не уверен, почему проект ITK устанавливает файл конфигурации в этот подкаталог...