"make: *** Нет правила для создания цели" Использование Unity Unit Testing

В итоге я установил ceedling, который использует код Ruby для автоматического создания тестовых прогонов. Намного лучший набор инструментов для изучения imo. Я собираюсь оставить вопрос открытым на случай, если у кого-то есть такая же проблема, и у кого-то есть ответ.

Привет, семья Stackru,

В настоящее время я читаю "Разработка через тестирование для встроенного C" и пытаюсь заставить работать Unity (модульный тестер). Я могу скомпилировать пример кода с помощью gcc.

Когда я пытаюсь следовать руководству по make и запускаю make в командной строке:

make: *** No rule to make target 'build/results/TestEx.txt', needed by 'test'.  Stop.

Я попытался проследить схему дерева от throwtheswitch, и мое личное дерево ниже (для ясности удалены файлы Unity):

.
├── build
│   ├── depends
│   ├── objs
│   └── results
├── makefile
├── src
│   ├── ex.c
│   └── ex.h
├── test
│   └── TestEx.c
├── testex
└── Unity
.

.

.

Мой make-файл выглядит так (помните, он скопирован):

ifeq ($(OS),Windows_NT)
  ifeq ($(shell uname -s),) # not in a bash-like shell
    CLEANUP = del /F /Q
    MKDIR = mkdir
  else # in a bash-like shell, like msys
    CLEANUP = rm -f
    MKDIR = mkdir -p
  endif
    TARGET_EXTENSION=.exe
else
    CLEANUP = rm -f
    MKDIR = mkdir -p
    TARGET_EXTENSION=out
endif

.PHONY: clean
.PHONY: test

PATHU = Unity/src/
PATHS = src/
PATHT = test/
PATHB = build/
PATHD = build/depends/
PATHO = build/objs/
PATHR = build/results/

BUILD_PATHS = $(PATHB) $(PATHD) $(PATHO) $(PATHR)

SRCT = $(wildcard $(PATHT)*.c)

COMPILE=gcc -c
LINK=gcc
DEPEND=gcc -MM -MG -MF
CFLAGS=-I. -I$(PATHU) -I$(PATHS) -DTEST

RESULTS = $(patsubst $(PATHT)Test%.c,$(PATHR)Test%.txt,$(SRCT) )

PASSED = `grep -s PASS $(PATHR)*.txt`
FAIL = `grep -s FAIL $(PATHR)*.txt`
IGNORE = `grep -s IGNORE $(PATHR)*.txt`

test: $(BUILD_PATHS) $(RESULTS)
    @echo "-----------------------\nIGNORES:\n-----------------------"
    @echo `grep -s IGNORE $(PATHR)*.txt`
    @echo "-----------------------\nFAILURES:\n-----------------------"
    @echo `grep -s FAIL $(PATHR)*.txt`
    @echo "-----------------------\nPASSED:\n-----------------------"
    @echo "$(PASSED)"
    @echo "\nDONE"

$(PATHR)%.txt: $(PATHB)%.$(TARGET_EXTENSION)
    -./$< > $@ 2>&1

$(PATHB)Test%.$(TARGET_EXTENSION): $(PATHO)Test%.o $(PATHO)%.o $(PATHU)unity.o #$(PATHD)Test%.d
    $(LINK) -o $@ $^

$(PATHO)%.o:: $(PATHT)%.c
    $(COMPILE) $(CFLAGS) $< -o $@

$(PATHO)%.o:: $(PATHS)%.c
    $(COMPILE) $(CFLAGS) $< -o $@

$(PATHO)%.o:: $(PATHU)%.c $(PATHU)%.h
    $(COMPILE) $(CFLAGS) $< -o $@

$(PATHD)%.d:: $(PATHT)%.c
    $(DEPEND) $@ $<

$(PATHB):
    $(MKDIR) $(PATHB)

$(PATHD):
    $(MKDIR) $(PATHD)

$(PATHO):
    $(MKDIR) $(PATHO)

$(PATHR):
    $(MKDIR) $(PATHR)

clean:
    $(CLEANUP) $(PATHO)*.o
    $(CLEANUP) $(PATHB)*.$(TARGET_EXTENSION)
    $(CLEANUP) $(PATHR)*.txt

.PRECIOUS: $(PATHB)Test%.$(TARGET_EXTENSION)
.PRECIOUS: $(PATHD)%.d
.PRECIOUS: $(PATHO)%.o
.PRECIOUS: $(PATHR)%.txt

Бег make -d test (удален текст, чтобы он поместился в теле, но сжат до важных частей):

    Trying pattern rule with stem 'TestEx'.
    Trying implicit prerequisite 'build/TestEx'.
    Looking for a rule with intermediate file 'build/TestEx'.
     Avoiding implicit rule recursion.
     Avoiding implicit rule recursion.
     Trying pattern rule with stem 'TestEx'.
     Trying implicit prerequisite 'build/TestEx,v'.
     Trying pattern rule with stem 'TestEx'.
     Trying implicit prerequisite 'build/RCS/TestEx,v'.
     Trying pattern rule with stem 'TestEx'.
     Trying implicit prerequisite 'build/RCS/TestEx'.
     Trying pattern rule with stem 'TestEx'.
     Trying implicit prerequisite 'build/s.TestEx'.
     Trying pattern rule with stem 'TestEx'.
     Trying implicit prerequisite 'build/SCCS/s.TestEx'.
   No implicit rule found for 'build/results/TestEx.txt'.
   Finished prerequisites of target file 'build/results/TestEx.txt'.
  Must remake target 'build/results/TestEx.txt'.
make: *** No rule to make target 'build/results/TestEx.txt', needed by 'test'.  Stop.

2 ответа

Я повторно открываю тему, потому что мне не удалось найти решение той же проблемы.

Вы используете GNU make, созданную для GNUWin32?

Я обнаружил, что GNUWin32 make использует имена файлов в стиле Unix для целей и зависимостей, но, поскольку я отредактировал PATHS файла makefile для имен файлов в стиле Windows, чтобы использовать окна mkdir команда тогда makefile не смогла найти рецепты.

Вам следует отредактировать свой make-файл, если вы используете его с GNU Makefile, созданным для GNUWin32.

Пути правил Makefile должны быть такими:

      test/build/objs/%.o: test/%.c

и команда mkdir должна быть такой:

      mkdir test\build\objs

Это сработало для меня. Надеюсь, это поможет!

Я добавил Unity в качестве подмодуля, но изначально не клонировал его. Итак, я изменил «.github/workflows/makefile.yml» следующим образом:

      - uses: actions/checkout@v3
  with:
      submodules: recursive

Тогда это работает!

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