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

Создание команд печати CMake перед выполнением

Я работаю над большим проектом C++, созданным с помощью CMake для Linux. CMake работает нормально, создавая множество файлов Makefile в дереве модулей и приложений. Запуск GNU make приводит к ошибкам компоновщика. Как я могу заставить make распечатать точные команды перед их выполнением?

Опция -d не печатает команды, но содержит много полезной информации.

Опция -n печатает все команды, но не запускает их, поэтому я не могу сказать, в чем именно проблема. Изучая стандартный вывод make -n, я не вижу каких-либо значимых команд. Я подозреваю, что некоторые команды меняются в зависимости от результатов предыдущих команд, и иерархия Makefiles затрудняет определение того, что происходит на самом деле.

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

4b9b3361

Ответ 1

Я уверен, что это сработает:

make VERBOSE=1

Вы также должны иметь возможность добавить это в свой файл CMakeLists.txt, чтобы навсегда установить следующее:

set(CMAKE_VERBOSE_MAKEFILE on)

Это описано в FAQ по CMake.

Ответ 2

Для автоматически сгенерированных Makefile попробуйте:

make V=1

Ответ 3

Опция, которая применяется к GNU make и работает с любым Makefile, независимо от того, сгенерирован ли он CMake или нет, заключается в использовании опции --trace для make. Это распечатает команды, которые make выполняет, и все равно выполнит их.

Это относится ко всем командам, а не только к тем, которые VERBOSE=1 или V=1 запускают печать в сгенерированных CMake/automake make файлах.

И еще одна альтернатива в Linux - запустить make под strace, как strace -f -e trace=execve make <make options>. Вывод из strace будет включать все процессы, которые выполняются: по make, по сценарию оболочки, который запускает make и т.д.

Например, вы можете обнаружить, что сгенерированный CMake make файл выполняет /usr/bin/cmake -E __run_co_compile <lots of options ...>, и все еще удивляетесь, каковы точные вызовы компилятора, которые, в свою очередь, будут выполняться. Вы можете получить это с помощью метода strace.

Ответ 4

Для тех, кто использует cmake --build, который вызывает make для внутреннего использования, используйте:

  $ cmake --build <dir> -- VERBOSE=1

Обратите внимание на -- до VERBOSE=1! Это передает аргумент базовому процессу make.

Или:

  $ VERBOSE=1 cmake --build <dir>

который также передает VERBOSE=1 в make, на этот раз через переменную окружения.

Или, если используется cmake версии 3.14 или выше:

  $ cmake --build <dir> --verbose

Обратите внимание на порядок аргументов! Опция --verbose должна идти после --build и его аргумента.