Как изменить возвращаемое значение команды `make` - PullRequest
0 голосов
/ 07 февраля 2019

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

Моя первая мысль - как-то повлиять на возвращаемое значениеmake команда, хотя это не представляется возможным.Я могу это сделать?Есть ли какая-то другая форма связи, которую я могу использовать, чтобы выразить статус теста скрипту bash, который будет вызывать make?Возможно, используя переменные окружения?

Спасибо

Редактировать: Кажется, спасибо, что я не могу установить код возврата для make, поэтому на данный момент мне придется делать тесты, запускать их вВызовите скрипт вместо make-файла, запишите результаты, а затем вручную запустите make clean.Я ценю помощь каждого.

Ответы [ 3 ]

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

Поведение по умолчанию make - возвращать неудачу и отказываться от оставшихся целей в случае неудачи.

for directory in */; do
    if ( cd "$directort" && make ); then
        echo "$0: Make in $directory succeeded" >&2
    else
        echo "$0: Make in $directory failed" >&2
    fi
done
0 голосов
/ 08 февраля 2019

Просто убедитесь, что каждый тест оставляет свой результат в файле, уникальном для этого теста.Наименьшим трением будет создание теста .pass, если тест пройден, в противном случае создайте тест .fail.В конце тестового прогона соберите все файлы и сгенерируйте отчет.

Эта схема имеет два преимущества, которые я вижу:

  • Вы можете запустить тесты параллельно (Вы делаете нам флаг -jn, не так ли? (Подсказка: весь смысл make ))
  • Вы можете использовать файлы результатов, чтобы записать, нужен ли тестперезапуск (стандартная отбраковка работы (подсказка: это почти весь смысл make ))

При условии, что тесты называются test-blah где бла - любая строка, и у вас есть список тестов в ${tests} (в конце концов, вы только что построили их, так что это не является необоснованным предположением).

Aэскиз:

fail = ${@:%.pass=%.fail}

test-passes := $(addsuffix .pass,${tests})
${test-passes}: test-%.pass: test-%
      rm -f ${fail}
      touch $@
      $* || mv $@ ${fail}

.PHONY: all
all: ${test-passes}
all:
# Count the .pass files, and the .fail files
      echo '$(words $(wildcard *.pass)) passes'
      echo '$(words $(wildcard *.fail)) failures'

Более детально:

  • test-passes := $(addsuffix .pass,${tests})Если ${tests} содержит test-1 test-2 (скажем), то ${test-passes} будет test-1.pass test-2.pass
  • ${test-passes}: test-%.pass: test-%Вы просто должны любить статические правила паттернов.
    • Это говорит о том, что файл test-1.pass зависит от файла test-1.Аналогично для test-2.pass.
  • Если test-1.pass не существует или старше исполняемого файла test-1, то make запустит рецепт.
    • rm -f ${fail}${fail} расширяется до цели: pass заменяется на fail или test-1.fail в этом случае.-f гарантирует, что rm не вернет ошибку в случае, если файл не существует.
    • touch $@ - создайте файл .pass
    • $< || mv $@ ${fail}Здесь мы запускаем исполняемый файл
      • Если он возвращает успех, наша работа завершается
      • В случае неудачи выходной файл удаляется, и на его место ставится test-1.fail
      • В любом случае, make не видит ошибок
  • .PHONY: all - Цель all является символической и не являетсяфайл
  • all: ${test-passes}Прежде чем запустить рецепт для all , мы собираем и запускаем все тесты
    • echo '$(words $(wildcard *.pass)) passes'Перед передачей текста в оболочку, make раскрывает $(wildcard) в список файлов передачи, а затем считает файлы с помощью $(words).Оболочка получает команду echo 4 passes (скажем)

Вы запускаете это с

$ make -j9 all

Make сохранит 9 заданийработает сразу - прекрасно, если у вас 8 процессоров.

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

Make вернет только одно из следующих значений в зависимости от источника

#define MAKE_SUCCESS 0
#define MAKE_TROUBLE 1
#define MAKE_FAILURE 2

MAKE_SUCCESS и MAKE_FAILURE должны быть самоочевидными;MAKE_TROUBLE возвращается только при запуске make с опцией -q.

Это почти все, что вы получаете от make, похоже, нет способа установить код возврата.

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