Как мне убедиться, что ошибочный код не встроен в процесс CI? - PullRequest
0 голосов
/ 26 сентября 2019

Я пишу библиотеку C ++ и уже использую процесс CI (Continuous Integration), чтобы убедиться, что функции работают.Сборка основана на make-файле, поэтому скрипт CI содержит строку make test.Эта цель будет запускать автоматизированные тесты (скажем, с использованием Catch) и проходить сборку только в случае успеха.

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

Однако я хочу убедиться, что в моем процессе автоматического тестирования это действительно так (что пользовательский код, использующий библиотеку по ошибке, не будет собран).

Итак, я создал папку, содержащую несколько файлов .cpp, каждый из которых демонстрирует неправильное использование библиотеки, поэтому каждый из них не может быть собран.

Моя проблема в том, что если я добавлю новую цель в свойmakefile, чтобы построить их, вернется после первого сбоя.

Я хочу убедиться, что all эти файлы не удалось собрать, и в этом случае вернет 0 только.

Как мне написать цель, которая выполняет это?

Некоторый (не работающий) код, который вернется после первого сбоя.

SRC_FILES := $(wildcard *.cpp)
OBJ_FILES := $(patsubst %.cpp, %.o, $(SRC_FILES))

all: $(OBJ_FILES)
    @echo "done"

%.o: %.cpp
    $(CXX) -o $@ -c $<

Если я в основном игнорирую сбои (добавив строку с -), я не смогу проверить, что все файлы неверны.

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Единственный способ сделать это, если вы хотите использовать одно и то же правило шаблона, - это с помощью рекурсивного создания и передачи флага -k (--keep-going), например:

TEST_SRCS := bad1.cpp bad2.cpp bad3.cpp

.PHONY: test_compile
test_compile:
          $(MAKE) -k $(TEST_SRCS:%.cpp=%.o)

Другой вариант - собрать их все в одном цикле:

test_compile:
         ok=true; \
         for src in $(TEST_SRCS); do \
           $(CXX) -o $${src%.cpp}.o -c $$src || ok=false; \
         done; \
         $$ok
1 голос
/ 27 сентября 2019
srcs := fail1.cpp fail2.cpp fail3.cpp
failed := ${srcs:.cpp=.failed}

PHONY: test
test: ${failed} ; : $@ Success

${failed}: %.failed: %.cpp
    ! gcc blah blah $< -o ${@:.failed=.o}
    touch $@

Здесь происходит следующее: когда вы хотите собрать test, make сначала пытается собрать fail1.failed.

Если компиляция завершится успешно, make завершается с ошибкой.

OTOH, если компиляция завершается неудачно, создается выходной файл fail1.failed.

Кстати, make знает, что fail1.failed зависитна fail1.cpp.Если .failed новее, чем .cpp, тест даже не будет запущен.Хорошо.

То же самое для fail2.failed и fail3.failed.Параллельно безопасно, и если вы правильно установили зависимости, запускаются только те тесты, которые необходимо запустить.Весь смысл сделать действительно.

...