Подтвердить что ты не робот

Для команды cmake "включить" какая разница между файлом и модулем?

Я использую некоторые библиотеки, которые я не хочу создавать как часть каждого проекта, который их использует. Очень понятным примером является LLVM, который имеет 78 статических библиотек. Даже наличие кода cmake для их поиска и импорта в каждом файле cmake чрезмерно.

Очевидным решением является использование команды "include" и вычитание соответствующих кусков cmake script в файлы *.cmake и настройка переменной среды CMAKE_MODULE_PATH.

Кроме того, это просто не работает. Cmake не находит файл, указанный в команде include.

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

В руководстве cmake это подразумевает, что "файл" отличается от "модуля" - только модуль получает автоматическое лечение с добавлением-расширением и поиском. Но нет объяснения, в чем разница. Я догадался, что недостающего расширения может быть достаточно (как со стандартными модулями), но это явно не так.

Поиск руководства для "модуля" не очень помогает, поскольку слово, похоже, перегружено. Например, модуль также является динамической библиотекой, загруженной с использованием LoadLibrary/dl_open.

Может ли кто-нибудь объяснить, какая разница между файлом и модулем в этом контексте, и как я создаю свой собственный модуль, чтобы команда cmake могла найти и использовать его?

Я использую cmake 2.8.1 в Windows.

ИЗМЕНИТЬ

Я довольно уверен, что проблема здесь не в понимании того, как должен работать cmake. Я думаю, что я должен делать что-то, с чем может работать find_package.

Как бы то ни было, я все еще не в состоянии ответить на свой вопрос.

4b9b3361

Ответ 1

Я считаю, что CMake 'module' - это просто файл, который можно использовать с директивой find_package. То есть, когда вы запускаете find_package(Module), он ищет файл в MODULE_PATH с именем FindModule.cmake.

Тем не менее, если вы include файл без расширения, он тоже будет искать через MODULE_PATH для этого file.cmake. В проекте CMake, над которым я работаю, у меня очень похожая структура каталогов относительно того, что вы предлагаете.

+ root/
  + CMakeLists.txt
  + cmake/
  | + FindMatlab.cmake
  | + TestInline.cmake
  | + stdint.cmake
  + src/
  + include/

В CMakeLists.txt у меня есть:

set (CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake")
find_package (Matlab) # runs FindMatlab.cmake
include(TestInline) # defines a macro:
test_inline (CONFIG_C_INLINE)
include(stdint) # simply executes flat CMake code

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

Ответ 2

У меня был такой же вопрос после прочтения документации команды CMake include(). В нем указано:

Загрузите и запустите код CMake из указанного файла. [... snip for brevity...] Если вместо файла указывается модуль, файл с именем .cmake выполняется сначала в CMAKE_MODULE_PATH, затем в каталоге модуля CMake.

Это оставляет много интерпретации относительно того, что CMake рассматривает модуль по сравнению с файлом, потому что модуль CMake является файлом в файловой системе в конце концов. Итак, какая разница?

Исходный код CMake - это единственное место, где я мог бы найти ответ. В основном CMake рассматривает аргумент include() как файл, если он выглядит как абсолютный путь. Это означает:

  • В Linux/Unix
    • Аргумент начинается с "/" или "~"
  • В Windows
    • Второй символ аргумента: ':' (как в C:)
    • Аргумент начинается с '\'

CMake предполагает, что что-то еще, что не соответствует вышеуказанным критериям, является модулем. В этом случае он добавляет '.cmake' к аргументу и ищет для него CMAKE_MODULE_PATH.

Ответ 3

Файл представляет собой CMake listfile, например CMakeLists.txt. Используйте следующую команду, чтобы получить список команд, используемых в

cmake --help-command-list 

Модуль представляет собой файл cmake (*.cmake), который содержит команды cmake.

Как указывает Matt B., CMAKE_MODULE_PATH не является переменной среды вашей оболочки, а переменной cmake.

Чтобы добавить путь к модулю в CMAKE_MODULE_PATH

LIST(APPEND CMAKE_MODULE_PATH ${YourPath})

Или если вы перенести свои модули, которые будут использоваться сначала

LIST(INSERT CMAKE_MODULE_PATH 0 ${Yourpath})