Для команды cmake "include", в чем разница между файлом и модулем? - PullRequest
32 голосов
/ 14 июля 2010

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

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

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

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

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

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

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

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

EDIT

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

Пока что все обстоит так, я все еще не могу ответить на свой вопрос.

Ответы [ 3 ]

33 голосов
/ 16 июля 2010

Я считаю, что 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, к которому вы пытаетесь получить доступ к модулям / файлам.

8 голосов
/ 15 марта 2017

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

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

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

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

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

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

5 голосов
/ 24 декабря 2014

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

cmake --help-command-list 

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

Как сказал Мэтт Б., CMAKE_MODULE_PATH - не переменная окружения вашей оболочки, а переменная cmake.

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

LIST(APPEND CMAKE_MODULE_PATH ${YourPath})

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

LIST(INSERT CMAKE_MODULE_PATH 0 ${Yourpath})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...