Как перенаправить вывод CMake в файл вместо командной строки Windows - PullRequest
1 голос
/ 10 октября 2019

Я рассчитываю время компиляции для C-проекта, используя CMake для статистики компиляции.

Ниже вы видите CMD-команды CMake, которые я использую для печати времени компиляции:

set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") 
set_property(TARGET ${MAIN_TARGET} PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")

Эти строки кода печатаются в командной строке Windows cmd (например):

Elapsed time: 0 s. (time), 0.000672 s. (clock)

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

Я нашел решение здесь: Как сохранить вывод CMake в файл?

cmake ... >> output_file.txt 2>&1
cmake ... 2>> output_file.txt

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

set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time" >> output_file.txt 2>&1) 
set_property(TARGET ${MAIN_TARGET} PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time" >> output_file.txt 2>&1)

Что я делаю не так?

1 Ответ

1 голос
/ 10 октября 2019

Поскольку RULE_LAUNCH_COMPILE задает префикс команды, а перенаправление потока идет в конце команды оболочки, использование ее таким образом не может работать.

Кроме того, команды, указанные в CMake, не являются командами оболочки. Это означает, что специальные символы не будут интерпретироваться и будут просто аргументами для команды.

Подводя итог, то, что вы пытаетесь сделать, будет расширено до чего-то вроде:

cmake -E time >> output_file.txt 2>&1 gcc...

Это будет выполняться не оболочкой, а самой CMake, поэтому произойдет сбой, поскольку время попытается выполнить команду с именем ">>".

Решение для вас - использовать промежуточныйскрипт, например:

@echo off
time %* >> output_file.txt

Давайте назовем это trace.cmd. Использование %* означает, что мы берем все аргументы в сценарий и передаем их в качестве аргументов команде time.

Затем вы можете использовать его следующим образом:

set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E trace.cmd")

Отказ от ответственности: я не проверял решение.

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