2014-09-09 3 views
8

Я пытаюсь понять цель, стоящую за CMake. Почему он разработан так, как сейчас. Вот несколько вопросов, на которые я хотел бы ответить.Понимание цели за CMake

  • Почему cmake генерирует make-файлы вместо того, чтобы просто строить проект?
  • Почему файлы cmake представляют собой несколько команд, а не только файлы конфигурации, например: ini/xml/yaml
  • Каковы команды, которые я пишу в CMakeLists.txt? Просто вызвать компилятор будет слишком легко. Я думаю,
  • В каком порядке я должен выполнять команды?
  • Все ли нечувствительно к регистру? Могу ли я написать все в нижнем регистре?
  • Почему учебники посоветовали мне перечислять каждый исходный файл явно?
  • Как создать свой CMakeLists.txt, чтобы он был коротким и простым в обслуживании. Каждый файл, который я искал в реальных проектах, выглядел очень загроможденным.

ответ

11

Это может быть трудно понять, как работает CMake. Я сделаю все возможное, чтобы кратко ответить на некоторые из ваших вопросов.

Почему cmake генерирует make-файлы вместо того, чтобы просто строить проект?

CMake is cross-platform make system и является независимым от компилятора. Он не генерирует только создание систем сборки, а также создает файлы решений Visual Studio. В том же файле CMakeList.txt кто-то может легко создать сборку Windows (Visual Studio) или сборку Linux (g ++).

Почему CMake файлы [ряд] команды, а не только файлы конфигурации, например: INI/XML/YAML

Составители не используют универсальную конфигурацию, поэтому CMake должен адаптироваться к цели компилятор.

Файлы CMake представляют собой серию команд для создания соответствующей конфигурации для целевого компилятора.

Каковы команды, которые я пишу в CMakeLists.txt? Просто вызвать компилятор будет слишком легко. Я думаю,

Предполагается создать соответствующую конфигурацию для целевого компилятора, и они будут, если они будут правильно записаны.

В каком порядке я должен выполнять команды?

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

Первая команда в вашем файле cmake должна быть минимально необходимой версией с последней версией CMake (3.0.1). Оттуда это зависит.:)

Например, эта команда не будет работать с версиями CMake меньше 2.6. cmake_minimum_required (VERSION 2.6)

См. Некоторые ссылки на учебники в конце этого ответа.

Все ли нечувствительно к регистру? Могу ли я написать все в нижнем регистре?

Как указано на CMake вики language syntax page, все команды нечувствительны к регистру, но вы должны рассмотреть случай за содержание переданных команде.

Почему учебники советуют мне перечислять каждый исходный файл явно?

Потому что вы должны явно указать каждый исходный файл. Это можно сделать в файле cmake или в отдельном списке файлов, на который ссылается файл cmake. Обратитесь к Антонио answer за предостережение от использования отдельного списка файлов.

CMake делает обеспечить commandaux_source_directory, который собирает имена всех исходных файлов в указанном каталоге и сохраняет список в переменной, но оно должно быть использовано только для «порожденных» исходных файлов по той же причине, указанной в Антонио answer.

Как создать свой CMakeLists.txt, чтобы он был коротким и простым в обслуживании. Каждый файл, который я искал в реальных проектах, выглядел очень загроможденным.

Очень легко загромождать файл CMake, и один из способов помочь с этим - использовать файлы .cmake, которые вы ссылаетесь, используя команду include.

Хороший ресурс (хотя еще находится в стадии разработки) можно найти на CMake about page.

Он разбит на несколько разделов:

  1. Overview
  2. Статистика (в стадии разработки)
  3. Participants
  4. Documentation
  5. License
  6. Success Stories
  7. Publications
  8. News

Учебники

CMake Tutorial - Из официальной CMake странице документации

Getting Started With CMake - учебник, который использует CMake с GCC.

Using CMake To Build QT Projects - Учебник, в котором используется CMake с QT.

+0

большое спасибо за информацию. Но это все еще неясно: какова конфигурация, которую должен создать файл? Я знаю, что это «все зависит от того, чего вы хотите». Но я всегда смущен, чтобы помочь себе здесь. Документация, которую вы здесь указали, является ссылкой, что именно я не ищу, потому что она предполагает, что я уже понял общую цель. – Arne

+0

@ Арне, если вы хотите получить конкретный ответ на конкретный вопрос, я предлагаю вам создать новый вопрос с этими деталями. Трудно быть конкретным без этих деталей. – jmstoker

+0

Я думал, что мой вопрос был конкретным, чтобы просить подробный учебник. Вопросы были лишь некоторыми примерами, а не всеми моими проблемами. Это просто не так, чтобы начать изучать CMake, написав 20 вопросов переполнения стека. Поэтому я думал, что пропущу что-то, что все знают, кроме меня, что мне нужно читать. – Arne

2

Поскольку jmstoker дал уже очень полный ответ, я остановлюсь на этой конкретной точке:

"Why do tutorials advise me to list every source file explicitly?"

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

С git есть решение, позволяющее запускать «cmake». каждый раз, когда происходит слияние. Getting cmake to run before building after pulling from git

+0

Проблема, с которой я сталкиваюсь при записи каждого файла вручную в мой CMakeLists.txt, заключается в том, что я должен сделать это вручную.Было бы неплохо, если бы список файлов моего проекта был создан моим ide (qtcreator), так что мне не нужно ничего касаться вручную при добавлении файла в проект. – Arne

+0

Это отличный момент, Антонио, хорошо сказано! @Arne Да, было бы проще, чтобы файлы автоматически добавлялись через IDE, но эта функция не существует изначально в CMake. Есть плагины для некоторых IDE, которые работают с CMake, которые могут это предоставить, но в фоновом режиме они будут записывать файлы CMakeList.txt или .cmake. – jmstoker

+0

Мне не нравится писать автоматически в файл, который должен быть написан вручную, потому что он становится грязным очень быстро. Но это еще одна тема. Здесь я просто просил ввести вводные учебники. Не ссылки, а не истории успеха. Учебники, которые заставляют меня понимать концепции cmake кому-то вроде меня, который думает, что каждая строка любой системы сборки раздражает и ненужна, потому что уже доказано, что она вообще работает и без нее, как в go. Некоторые учебники, которые объясняют мне, почему некоторые шаги необходимы для построения C++. Это важно для меня. – Arne

Смежные вопросы