“make: *** No rule to make target” 在使用 Unity 单元测试时出现

3
我最终安装了Ceedling,它使用Ruby代码自动生成测试运行。在我的看法中,这是更好的学习工具集。我将保留问题开放,以防其他人有相同的问题并且有人知道答案。
大家好,StackOverflow社区,
我目前正在阅读《嵌入式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
.

.

.

我的Makefile如下所示(记住,这是复制的):

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.

如果你运行 make test 会发生什么? - jwdonahue
尝试运行 make -d test 以查看哪些目标被评估以及为什么它们被拒绝。 - raspy
附言 -- Makefile 中有一些我认为是不好的做法。首先,包含路径的变量不应该以斜杠结尾(因此,在上面的例子中, PATHS 应该是 src 而不是 src/,对此的引用应该是 $(PATHS)/%.o 而不是 $(PATHS)%.o (前者更易读)。其次,Makefile 应该用于“构建”而不是“运行”结果。如果您想一步完成构建和运行,则可以创建一个脚本来调用 make,然后运行生成的可执行文件。 - HardcoreHenry
添加了有关 make -d testmake test 的更多注释。 - austinhoang
@HardcoreHenry 一些 Makefiles 具有 install: 目标。 - Déjà vu
显示剩余2条评论
2个回答

1

我将重新打开这个帖子,因为我没有找到解决相同问题的方法。

你正在使用为GNUWin32构建的GNU make吗?

我发现GNUWin32 make使用Unix样式的目标和依赖项文件名,但是由于我已经编辑了makefile的路径为Windows样式文件名以使用Windows的mkdir命令,所以makefile无法找到配方。

如果您正在运行为GNUWin32构建的GNU Makefile,则应该编辑您的makefile。

Makefile规则路径应该像这样:

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

mkdir命令应该是这样的:

mkdir test\build\objs

这对我有用。希望能帮到你!


0
我将Unity添加为子模块,但一开始没有克隆它。 因此,我将“.github/workflows/makefile.yml”修改如下:
- uses: actions/checkout@v3
  with:
      submodules: recursive

然后,它工作了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接