Как определить неудачную команду при использовании make -j - PullRequest
0 голосов
/ 08 апреля 2019

При использовании make -j для файла с множеством целей, и одна из них не работает, может быть немного сложно определить конкретную команду, которая вызвала ошибку.Особенно, когда на выходе много.

Могу ли я убедить gnu make напечатать что-то вроде этого (желательно в конце вывода):

This particular command failed: "frobniz -foo" with output "frobniz only takes -foo options on a thursday"? 

Сейчас я прибегаю к использованию make -j -Otarget внутри tmux с его историей поиска, так что я могу найти этот «неудачный» вывод:

Makefile:41: recipe for target 't4' failed

Увы, цель 't4' имеет около 40 команд с большим количеством выходных данных, поэтому мне нужно больше искать вДля того, чтобы найти фактическую команду, которая терпит неудачу.Это управляемо, но неуклюже.Я тоже пробовал remake, но, похоже, у него нет вариантов для этого.

РЕДАКТИРОВАТЬ: Очевидно, я должен был поместить здесь некоторый код, позвольте мне изменить это;Это одна цель из 16, в каждой по 40 команд.Пример ниже был обрезан до 4 команд.

t4:
  sso -dump FAIL:B -path /instadm-bin/ktkopdat.start -ttarget "AA" ht1
  sso -dump FAIL:B -path /instadm-bin/ktknyadm -ttarget "BB" ht1
  sso -dump FAIL:B -path /instadm-bin/multiadm -ttarget "CC" ht1
  sso -dump FAIL:B -path /instadm-bin/ktkslet.start -ttarge "DD" ht1

Допустим, я выполнил make -j, и вторая строка выше не выполнена.Ошибка и команда видны в выходных данных make, но смешаны с множеством других выходных данных.

Что make выполняет для генерации ошибки: sso -dump FAIL:B -path /instadm-bin/ktknyadm -ttarget "BB" ht1 - сбой со статусом -1.

Теперь make должен знать, какая команда завершилась неудачей, поскольку он может прервать процесс на этом этапе.Эта информация очень ценна для меня, но, тем не менее, она скрыта в беспорядке результатов множества параллельных процессов.Обратите внимание, что я, конечно, мог бы перезапустить make без опции -j, что обеспечило бы отображение необходимой информации в нижней части вывода, но я бы предпочел не повторять длинную сборку больше, чем необходимо.

1 Ответ

0 голосов
/ 08 апреля 2019

Я не уверен, что вы подразумеваете под 40 командами с большим количеством выводимых данных . Было бы полезно, если бы вы предоставили пример.

Если вы имеете в виду, у вас есть 40 логических строк рецепта (без использования обратной косой черты для объединения 40 физических строк в одну логическую строку), то, как только одна из этих команд не будет выполнена, make прекратит сборку этого рецепта и не будет запускать какие-либо больше команд, поэтому неудачная команда всегда будет последней.

Если вы имеете в виду, что у вас есть длинный сценарий оболочки, который состоит из 40 физических строк, объединенных в одну логическую строку с использованием точек с запятой и обратной косой черты, то make не может вам помочь, потому что make не знает, какая команда завершилась неудачей.

Make вызовет один экземпляр оболочки и передаст всю строку логического рецепта в эту оболочку, и дождется выхода оболочки с кодом выхода 0 или не-0. Если код выхода равен 0, то make предполагает, что рецепт выполнен успешно; если код выхода не равен 0, make предполагает, что рецепт не удался. У Make нет никакого способа узнать, что было вызвано более одной команды, какие команды были вызваны, какие из них могли быть неудачными, какие были отправлены, какой вывод и т. Д. Вся эта информация известна только оболочке, а не make.

...