Почему find_package() не ищет в ${<name>_DIR}/lib/cmake/<name>-<version>?

Я использую 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, поэтому было бы неплохо иметь поведение, описанное в документации.

Обратите внимание, что каталоги поиска не будут содержать компонент версияITK-4.13/. Не уверен, почему проект ITK устанавливает файл конфигурации в этот подкаталог...

Tsyvarev 13.06.2019 16:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
242
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Переменная 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 содержит алгоритм выбора префиксы. Один из них является:

  1. 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).

Другие вопросы по теме