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

При использовании 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, чтобы необходимая информация отображалась внизу вывода, но я бы не хотел повторять длинную сборку больше раз, чем необходимо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Извините, я был неясен. Я отредактировал, чтобы уточнить. Я имел в виду 40 строк логических рецептов, и, как вы упомянули, неудачная строка остановит создание этой конкретной цели. Но в это время выполняется много других целей (из-за опции -j), поэтому неудачная команда редко будет падать на дно.

NoMann 08.04.2019 19:46

Использование -O — единственное, что может помочь вам сделать это проще, сохраняя выходные данные и команду вместе. Вам все равно придется вернуться к выводу, чтобы найти неудачную команду. В GNU make нет средства, которое бы "обобщало" ошибки в конце прогона. Обратите внимание, что make в настоящее время не имеет возможности сохранить вывод команды: обычно он не сохраняет вывод команды. Можно добавить новую функцию для сохранения вывода ошибок при использовании -O.

MadScientist 08.04.2019 19:59

Другие вопросы по теме