如何构造这个复杂的通用Makefile规则

时间:2016-12-09 22:13:53

标签: gcc makefile gcov

每个模块都使用自己的测试独立测试_ $(MODULE).c。 已生成包含无覆盖模块的$(LIBRARY)共享库。 $(basename $<)。o应该覆盖$(LIBRARY)中的那个。出于某种原因,我得到的结果好像没有被覆盖。有人可以审查这个并提出修复建议吗?目前,我对五个对象中的每一个都有非通用的gcov规则。这些gcov正常工作。下面我将展示通用规则和规则的一个特定用途。

SHARED_OPTS=-O0 -Wall -Wextra -fPIC
GOPTS=$(SHARED_OPTS) -g -coverage -pg

%.gcov : %
    @echo "\t$@ generic (needs work)"
    @-gcc $(GOPTS) -c -o test_$(basename $<).o test_$<
    @-gcc $(GOPTS) -c -o      $(basename $<).o      $<
    @-gcc $(GOPTS)    -o gcov_test_$(basename $<) \
        test_$(basename $<).o \
        $(basename $<).o \
        -L . -l $(LIBRARY)
    @-./gcov_test_$(basename $<)
    @-gcov $< >$@.out 2>&1
    @echo "no Mac gprof: -gprof gcov_test_$(basename $<) gmon.out > $<.prof"
    @$(call timestamp,$@)

Unicode.c.gcov: Unicode.c

如果有人有兴趣通过开发共享库来合作开发高效率的高质量Unicode lexing /解析支持,我很乐意有评论者或贡献者。

上面显示的Makefile片段位于github存储库中:

https://github.com/jlettvin/Unicode特别是在c子目录下。

1 个答案:

答案 0 :(得分:1)

当您尝试在makefile中发现问题时,应该避免使用@,因为它隐藏了命令行,因此您无法查看问题。此外,你应该避免-:如果这些命令中的任何一个失败,你肯定不想继续运行其余的配方,我不会期望。

我不知道它是否是剪切/粘贴问题,但我必须假设这些行至少是错误的:

@-gcc $(GOPTS) -c -o test_$(basename $<).o test_$<
@-gcc $(GOPTS) -c -o      $(basename $<).o      $<

据我所知,你的makefile中,这些行的最后几个字分别应该是test_$<.c$<.c