Почему я могу использовать модули, поставляемые CMake (в частности, CMakeDependentOption.cmake) локально, но не на CI или Docker?

#c #docker #cmake #module #continuous-integration

#c #docker #cmake #модуль #непрерывная интеграция

Вопрос:

У меня есть проект cmake, который успешно создается локально, но ошибки с

   include could not find load file:

    CmakeDependentOption

  

при попытке сборки на платформе CI или в Docker. Обратите внимание, что CMakeDependentOption.cmake — это скрипт, который поставляется с самим cmake. Поэтому он должен быть просто доступен. На CI для установки cmake я wget выбираю соответствующую версию cmake со страницы загрузки, разархивирую ее и добавляю каталог bin в переменную PATH среды. Затем я использую cmake команду для создания своей библиотеки. Результатом является приведенная выше ошибка.

Я подозреваю, что это означает, что переменная CMake (например, «CMAKE_MODULE_PATH», но нет, поскольку эта переменная кажется пустой в начале скрипта cmake) перепутана или каким-то образом не установлена. Путь к нужному файлу include

 <cmake_root>/share/cmake-3.18/Modules/CMakeDependentOption.cmake
  

И я проверил, что он существует вручную. Мой вопрос: есть ли способ найти этот каталог из cmake? Возможно, a cmake --config или cmake --libs mode (немного похоже на pkg-config?)

В противном случае, есть ли у кого-нибудь какие-либо предложения относительно того, почему это происходит и как это обойти.

Комментарии:

1. Это выглядит как опечатка с вашей стороны. CmakeDependentOption vs CMakeDependentOption отличается в файловых системах с учетом регистра.

2. Да, это было так. Подумал, что что-то подозрительное. Спасибо!

Ответ №1:

Вы можете локально, потому что, скорее всего, вы не используете платформу на базе Linux, такую как Windows или mac. Это связано с тем, что файловая система Linux чувствительна к регистру. Что означает CmakeDependentOption , что отличается от CMakeDependentOption .

Docker запускает контейнеры в Linux, поэтому имена файлов будут учитываться с учетом регистра, и включение завершится ошибкой, если случаи разные.