Прежде всего, синтаксис cmake действительно прост. Он состоит из «команд» и «аргументов». Это так просто, что требуется некоторое время, чтобы это впиталось. Все есть «команда (аргументы)». Кроме того, имена команд не чувствительны к регистру. Раньше они должны были быть ВСЕМИ КОПИЯМИ, но начиная с версии 2.6 (я думаю) это не имеет значения. Аргументы, однако, чувствительны к регистру.
cmake_minimum_required (VERSION 2.6)
Эта команда устанавливает минимальную требуемую версию cmake для проекта. Если текущая версия cmake ниже 2.6, она прекратит обработку и сообщит об ошибке. Это предотвращает необходимость поддерживать древние версии инструмента.
set (CMAKE_BACKWARDS_COMPATIBILITY 2.6)
Установите для переменной CMAKE_BACKWARDS_COMPATIBILITY значение 2.6. На самом деле это небольшая ошибка в представленном вами файле CMakeLists.txt, так как CMAKE_BACKWARDS_COMPATIBILITY не следует использовать для версии 2.6 и выше. Сценарий, вероятно, должен использовать cmake_policy
. Это указывает на то, как должны вести себя новые версии cmake, когда сталкиваются с несоответствиями в предыдущих версиях cmake. Любые сценарии, которые вы пишете с нуля сегодня, не должны беспокоиться об этом.
Project(${PLUGIN_NAME})
Устанавливает имя проекта равным значению того, что находится в переменной PLUGIN_NAME
. Это значение отображается как имя проекта в некоторых IDE. Чтобы записать значение в переменную, вы можете использовать set(PLUGIN_NAME myName)
, а для чтения значения вы используете синтаксис ${}
: "${PLUGIN_NAME}"
. Некоторые команды также записывают переменные, но вы используете их так же, как в команде set
.
file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
[^.]*.cpp
[^.]*.h
[^.]*.cmake
)
file
- это команда. Его первый аргумент GLOB
означает «вернуть файлы на диск, имена которых соответствуют шаблонам, которые я приведу в качестве аргументов». Следующий аргумент GENERAL
- это переменная, в которой хранится результат, подобно set
, он записывает результат в переменную, и вы можете позже прочитать его с помощью ${GENERAL}
. RELATIVE
и путь означает возврат имени файла относительно этого пути, а не полного пути. Поэтому вместо «C: \ some \ long \ path \ src \ foo.cpp» или «/home/me/some/path/src/foo.cpp» вы получите «src \ foo.cpp» или «src / foo.cpp». Переменная CMAKE_CURRENT_SOURCE_DIR - это «волшебная переменная», которую CMake заполняет для вас, и она ссылается на путь к исходному каталогу, обрабатываемому в данный момент, где находится этот файл CMakeLists.txt. Последний список аргументов - это шаблоны файлов, которые будут сопоставлены. По сути, все, что имеет расширение файла cpp, h или cmake.
include_directories(${PLUGIN_INCLUDE_DIRS})
Добавить каталоги в ${PLUGIN_INCLUDE_DIRS}
в каталоги, которые ищет компилятор для поиска включаемых файлов. Это приведет к дополнительным аргументам "-I", если вы скомпилируете, например, с gcc.
# Generated files are stored in ${GENERATED} by the project configuration
Строки, начинающиеся с #, являются комментариями.
SET_SOURCE_FILES_PROPERTIES(
${GENERATED}
PROPERTIES
GENERATED 1
)
С файлами могут быть связаны пары ключ / значение, и это влияет на их построение. Здесь для файлов, перечисленных в переменной ${GENERATED}
, свойству «GENERATED» присвоено значение 1. Что это значит? Что ж, теперь CMake знает, что не нужно искать файлы «$ {GENERATED}» на диске, так как они будут созданы на следующем этапе сборки. В размещенном фрагменте никто не устанавливает переменную ${GENERATED}
. Я предполагаю, что это установлено в другом месте в файлах проекта. Не путайте переменную ${GENERATED}
со свойством GENERATED! Это тонкий момент, и, возможно, переменная должна была быть GENERATED_FILES
, чтобы избежать путаницы, т.е. SET_SOURCE_FILES_PROPERTIES(${GENERATED_FILES} PROPERTIES GENERATED 1)
.
SOURCE_GROUP(Generated FILES ${GENERATED})
Это создает группу, которая в Visual Studio преобразуется во вкладку файла, которая называется «Сгенерировано» и содержит файлы в переменной ${GENERATED}
.
SET(SOURCES ${GENERAL} ${GENERATED})
Эта строка устанавливает переменную SOURCES для того, что находится в переменных ${GENERAL}
и ${GENERATED}
. Ранее мы установили ${GENERAL}
, чтобы быть списком файлов cpp, h и cmake, которые были в текущем исходном каталоге. В C-подобном псевдокоде это похоже на «SOURCES = GENERAL + GENERATED». В качестве детали реализации, значение SOURCES на самом деле является списком, а его содержимое разделено знаком ";" персонажи. Обычно это делается для того, чтобы позже вы могли создать библиотеку или исполняемый файл, просто используя переменную ${SOURCES}
, а не повторяя две другие переменные везде.