2014-03-12 4 views
0

Я пытаюсь передать вывод компилятора команде tee в windows, но я столкнулся с проблемой, когда если сбой компилятора внутри, он продолжит компиляцию следующего файла, когда я захочу его стоп. Есть ли способ, чтобы статус выхода первой команды был статусом выхода второй команды?Как получить статус выхода из первой команды в трубке в make?

$(ODIR)/%.o: %.c $(DEPS) 
    $(CC) -c -o [email protected] $< $(CFLAGS) 2>&1 | tee build_log.txt 

ответ

0

Прежде всего, я оставил бы любую регистрацию вызывающему лицу. Во-вторых, этот вид трубопроводов неопрятен в изготовлении. В-третьих, не вентилятор потери потока stderr внутри сделать.

Это, пожалуйста, вопрос оболочки. Если вы используете bash, см. pipefail в руководстве. К сожалению, я думаю, что это довольно сложно включить. (Да, я знаю, что ты сказал, окна, но я предполагаю, что вы не используете отвратительный CMD.)

SHELL := /bin/bash 

passes: 
    (exit 1) |& cat 

fails: 
    bash -c 'set -o pipefail; (exit 1) |& cat' 
+0

Если вы установили SHELL в/bin/bash, вам не нужно использовать 'bash -c ...' в командной строке. Тот или другой будет делать. По крайней мере, в системе UNIX ... надеюсь, и в Windows. Хотя в Windows (если вы не используете cygwin) этот путь не будет работать. – MadScientist

+0

@MadScientist Есть ли способ использовать переменную 'SHELL' в Makefile, так что _bash_ будет включать параметр' pipefail'? – bobbogo

+0

Не легко: bash не поддерживает это как параметр командной строки. Но все, что я имел в виду выше, вы можете просто написать 'set -o pipefail; (exit 1) | & cat' вам не нужно добавлять часть 'bash -c'. Единственный способ, который я знаю сделать для всех рецептов без явного добавления их к каждому из них (либо в каталог, либо через переменную), - это создать файл, содержащий эту команду, например 'initfile', а затем добавить' export BASH_ENV = initfile' в ваш файл. – MadScientist

0

После Борясь много, я пришел к этому решению ...

.ONESHELL: 
$(ODIR)/%.o: %.c $(DEPS) 
    $(CC) -c -o [email protected] $< $(CFLAGS) 2> temp_err_file 
    set EXIT_STATUS=%ERRORLEVEL% 
    type temp_err_file >> build_log.txt 
    type temp_err_file 1>&2 
    del /q temp_err_file 
    exit /b %EXIT_STATUS% 

Здесь .ONESHELL позволяет make запускать весь рецепт в команде одиночной оболочки вместо запуска каждой строки в отдельном cmd и собирать статус возврата каждого отдельно. Общий статус выхода зависит от основной команды компиляции, поэтому в конце необходимо выйти со статусом компиляции.

Я знаю, что это не чистое решение, связанное с temp_err_file, и если что-то пойдет не так после команды компиляции, make не сможет его поймать, но я думаю, это лучшее, что я могу найти для работы с окнами без потери потока stderr и Ведение журнала.

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

  • Нет связанных вопросов^_^