没有规则来制定目标,但规则存在

时间:2017-06-26 11:30:39

标签: makefile

我想编写一些Makefile来通过Unity测试框架测试C代码。 但是,当我想测试它时,我收到消息make: *** No rule to make target 'unity_build/results/test_unity_dumb_example.unity_res', needed by 'unity_test'. Stop.。我无法弄清楚出了什么问题,因为存在与模式匹配的文件规则:$(UNITY_PATHR)%.unity_res:

这是我的Makefile的开头:

UNITY_PATHU = ${UNITY_INSTALL_DIR}/
UNITY_PATHS = src/
UNITY_PATHS += src/unity_dumb_example/
UNITY_PATHT = unity_test/
UNITY_PATHB = unity_build/
UNITY_PATHD = unity_build/depends/
UNITY_PATHO = unity_build/objs/
UNITY_PATHR = unity_build/results/

UNITY_BUILD_PATHS = $(UNITY_PATHB) $(UNITY_PATHD) $(UNITY_PATHO) $(UNITY_PATHR)

# Tell compiler where to look for all test files
UNITY_SRCT = $(wildcard $(UNITY_PATHT)*.c)

UNITY_COMPILER=gcc -c
UNITY_LINKER=gcc
UNITY_DEPEND=gcc -MM -MG -MF
UNITY_CFLAGS=-I. -I$(UNITY_PATHU) -I$(UNITY_PATHS) -DTEST

UNITY_RESULTS = $(patsubst $(UNITY_PATHT)test_%.c,$(UNITY_PATHR)test_%.unity_res,$(UNITY_SRCT))

unity_test: $(UNITY_BUILD_PATHS) $(UNITY_RESULTS)
    @echo "-----------------------\nIGNORES:\n-----------------------"
    @echo `grep -s IGNORE $(UNITY_PATHR)*.unity_res`
    @echo "-----------------------\nFAILURES:\n----------------------"
    @echo `grep -s FAIL $(UNITY_PATHR)*.unity_res`
    @echo "\nDONE"

$(UNITY_PATHR)%.unity_res: $(UNITY_PATHB)%.out
    ./$< > $@ 2>&1

在GNU make手册中,我已阅读

  

目标是匹配文件名的模式; '%'   匹配任何非空子字符串,而其他字符只匹配自己。

我不明白为什么要抱怨,因为没有拼错。

修改 完全清洁后,输出如下:

mkdir -p unity_build/
mkdir -p unity_build/depends/
mkdir -p unity_build/objs/
mkdir -p unity_build/results/
make: *** No rule to make target 'unity_build/results/test_unity_dumb_example.unity_res', needed by 'unity_test'.  Stop.

存在所有需要的路径。

当我在调试模式-d中运行make时,我可以看到make正在尝试使用词干test_test_unity_dumb_example而非test_unity_dumb_example的模式规则,例如:

Trying pattern rule with stem 'test_test_unity_dumb_example'

test_test_是我的错,但我修好了。我仍然无法使它发挥作用。

当我使用-p运行时,我可以在输出中找到类似的内容:

# Implicit Rules

unity_build/results/%.unity_res: unity_build/%.out
#  recipe to execute (from 'Makefile.unity', line 30):
    ./$< > $@ 2>&1

解决

问题在于$(UNITY_PATHB)%.out先决条件的先决条件。确切地说,一个关键源文件的路径是${UNITY_INSTALL_DIR}/src而不是${UNITY_INSTALL_DIR}/。 但是我仍然觉得很奇怪,make抱怨目标规则比无法构建的目标高2级。

0 个答案:

没有答案