Что означает «Перезапустить cmake no build system arguments»? - PullRequest
1 голос
/ 05 февраля 2020

Я получаю сообщения

Re-run cmake no build system arguments

И различные сбои в моей зарождающейся системе сборки CMake. Я также погуглил и нашел около десятка результатов, где появляется это сообщение об ошибке, но ни одно из этих обращений не скажет вам, что означает указанное сообщение c. Большинство из этих случаев находятся на веб-сайтах конкретных c проектов, поэтому сопровождающие проекта c просто пропускают часы анализа и выкладывают причину сообщения, которое пользователь проекта будет рад использовать.

Я также наткнулся на строку исходного кода CMake, которая выдает этот текст.

if (this->CheckBuildSystemArgument.empty()) {
  if (verbose) {
    cmSystemTools::Stdout("Re-run cmake no build system arguments\n");
  }
  return 1;
}

Таким образом, аргумент пуст. Это ничего не объясняет, потому что минимальный допустимый вызов 'cmake' равен

cmake .

Это не лучший вызов:

cmake ..

считается CMave mavens намного лучше, предполагая что текущий каталог пуст и у родителя есть CMakeLists.txt. Люди, которые все время используют CMake, поймут, что в командной строке обычно нет «аргумента сборки системы». Если вы ищете документацию по cmake.org, то нет документации по такому понятию, как «система сборки» или «аргумент системы сборки».

Система сборки, которую я пытаюсь создать, немного сложна для правдивости. Подводя итог здесь. Поэтому вместо этого я хотел бы узнать, что на самом деле означает это сообщение, и кое-что о том, как я мог бы сделать это go прочь. Я попытался свести к минимуму мою систему сборки, чтобы исправить другую проблему, и даже не воспроизвел проблему. Кроме того, эта минимизация была на внешнем уровне, который на самом деле является Makefile и покрывал проблему управления вещами с помощью переменных среды.

Итак, кто-то может сказать мне, что означает «Перезапустить cmake no build system arguments»

1 Ответ

3 голосов
/ 06 февраля 2020

Чтобы начать с некоторого контекста, в документации CMake есть много информации о системах сборки, так как это основная функция CMake. CMake является генератором системы сборки. Из документации , краткой информации о роли CMake в отношении систем сборки:

A buildsystem описывает, как собрать исполняемые файлы и библиотеки проекта из его источника код с использованием инструмента сборки для автоматизации процесса. Например, система сборки может быть Makefile для использования с инструментом создания командной строки или файлом проекта для интегрированной среды разработки (IDE). Чтобы избежать поддержки нескольких таких систем сборки, проект может задавать свою систему сборки абстрактно, используя файлы, написанные на языке CMake. Из этих файлов CMake генерирует предпочтительную систему сборки локально для каждого пользователя через бэкэнд, называемый generator .

Имея это в виду, CMake пытается упростить задачу, проверяя систему сборки для нас. Таким образом, если мы обновим наши файлы CMake, нам не нужно будет перезапускать CMake и восстанавливать систему сборки. Эта «проверка системы сборки» запускает по умолчанию при вызове cmake из командной строки. Но он также будет запускаться при сборке кода (например, с помощью make), чтобы убедиться, что ваша система сборки обновлена.

Вы можете увидеть специальную предопределенную цель CMake, которая проверяет вашу систему сборки. Для систем сборки на основе Makefile это будет выглядеть примерно так в вашем Makefile:

cmake_check_build_system:
    $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 0
.PHONY : cmake_check_build_system

Недокументированный параметр командной строки CMake --check-build-system, за которым следует CMakeFiles/Makefile.cmake, является "аргументом системы сборки", которым вы были Ищу.

Это сообщение:

Re-run cmake no build system arguments

появляется при запуске cmake, поскольку CMake все еще внутренне выполняет проверку системы сборки. В этом случае аргумент --check-build-system не предоставляется, поэтому CMake всегда регенерирует, как ожидается. Таким образом, это не сообщение об ошибке, а просто подробное сообщение журнала, дающее немного больше информации о том, что делает CMake.


Эта «проверка системы сборки» должна происходить со всеми системами сборки CMake. Например, Visual Studio создает цель ZERO_CHECK с таким же поведением. Вместо этого он использует параметр командной строки --check-stamp-list (также недокументированный), чтобы проверить актуальность вашего проекта / решения.


Еще одно примечание: вы можете отключить Автоматическая проверка системы сборки CMake c путем переключения переменной CMAKE_SUPPRESS_REGENERATION на ON. Просто поместите его внизу вашего файла CMake верхнего уровня:

set(CMAKE_SUPPRESS_REGENERATION ON)

Конечно, CMake всегда будет восстанавливаться, когда вы вызываете cmake напрямую. Но когда эта переменная равна ON, специальная цель регенерации будет удалена (cmake_check_build_system для Make-файлов, ZERO_CHECK для Visual Studio и др. c).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...