CMake find_dependency не уважает поведение в документации пакета? - PullRequest
2 голосов
/ 03 октября 2019

В документации, касающейся создания пакета CMake , указано, что:

Макрос find_dependency также устанавливает ClimbingStats_FOUND в False, если зависимость не найденанаряду с диагностикой того, что пакет ClimbingStats не может использоваться без пакета Stats.

Тем не менее, мы наблюдаем, что это только в случае, если ClimbingStats запрашивается из нижестоящегобез аргумента REQUIRED.

Не требуется

find_package(ClimbingStats CONFIG)

Тогда мы получим поведение, описанное выше, то есть:

Found package configuration file:

    ...

, но для ClimbingStats_FOUND установлено FALSE, поэтому пакет "ClimbingStats "считается НЕ НАЙДЕННЫМ. Причина, указанная в пакете:

ClimbingStats could not be found because dependency Stats could not be found.

Обязательно

Если вместо этого мы сделаем обязательный пакет ClimbingStats:

find_package(ClimbingStats CONFIG REQUIRED)

Тогда об ошибке не упоминается ClimbingStatsвообще

Could not find a package configuration file provided by "Stats" with any of
  the following names:

    StatsConfig.cmake
    stats-config.cmake

  Add the installation prefix of "Stats" to CMAKE_PREFIX_PATH or set
  "Stats_DIR" to a directory containing one of the above files.  If "Stats"
  provides a separate development package or SDK, be sure it has been
  installed.

Мы неправильно понимаем документацию, связанную выше, или это ошибка в поведении CMake?

Есть ли способ потребовать пакет и при этом получить описательныйсообщение об ошибке (как в первом примере), когда его восходящие потоки не найдены?

1 Ответ

3 голосов
/ 03 октября 2019

Мы неправильно понимаем документацию, связанную выше, или это ошибка в поведении CMake?

Похоже на ошибку в документации CMake .

Документация для find_dependency гласит:

find_dependency перенаправляет правильные параметры для QUIET и REQUIRED, которые были переданы исходному вызову find_package().

Итак, когда внешний find_package() был вызван с ключевым словом REQUIRED, внутренний find_package() также вызывается с этим ключевым словом.

Именно такое поведение наблюдается в вашем случае: сообщение об ошибкегенерируется вызовом

find_package(stats REQUIRED)

, и код вызывающей стороны не имеет возможности обработать свой FALSE результат, чтобы сделать сообщение об ошибке более информативным.


Есть ли способтребует пакет и все еще получает описательное сообщение об ошибке (как в первом примере), когда его исходные данные не найдены?

Насколько я понимаю, более "нативное" поведение find_dependency будет не вперед REQUIRED ключевое слово для внутреннего find_package, но проверьте результат этого find_package вручную и отправьте соответствующее сообщение, если оно ЛОЖНО.

Вы можете отправить запрос функции в CMakeтрекер об этом.

...