Почему find_package () не выглядит в $ {<name> _DIR} / lib / cmake / <name>- <version>? - PullRequest
0 голосов
/ 13 июня 2019

Я использую 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 создает набор возможных префиксов установкидля упаковки.Под каждым префиксом ищется несколько каталогов для файла конфигурации.В таблицах ниже показаны каталоги, которые искали.Каждая запись предназначена для деревьев установки в соответствии с соглашениями Windows (W), UNIX (U) или Apple (A):

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

[...] Каталоги, отмеченные выше (W), предназначены для установокв Windows, где префикс может указывать вверху установочного каталога приложения.Помеченные (U) предназначены для установки на платформах UNIX, где префикс используется несколькими пакетами. Это просто соглашение, поэтому все каталоги (W) и (U) все еще ищутся на всех платформах.

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

1 Ответ

1 голос
/ 13 июня 2019

CMake переменная Foo_DIR является , а не префиксом для файла конфигурации поиска для пакета Foo. Это каталог, в котором файл конфигурации точно расположен или не расположен вообще:

Если для <PackageName>_DIR задан каталог, не содержащий файл конфигурации, CMake проигнорирует его и выполнит поиск с нуля.

Описание find_package содержит алгоритм выбора префиксов . Один из них:

  1. Пути поиска, указанные в специфичных для cmake переменных среды. ...

    <PackageName>_DIR

    CMAKE_PREFIX_PATH

    CMAKE_FRAMEWORK_PATH * +1030 *

    CMAKE_APPBUNDLE_PATH

Здесь вы можете найти <PackageName>_DIR переменную, но на этот раз это environment variable:

> ITK_DIR=<...>/ITK/install cmake .

Если вы хотите установить переменную CMake, вы можете установить <PackageName>_ROOT variable:

> cmake -DITK_ROOT=<...>/ITK/install .

Обратите внимание, что такая переменная используется только в последних версиях CMake (начиная с CMake 3.12).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...