规则和配方中的Makefile匹配模式

时间:2018-06-03 05:49:06

标签: c++ bash makefile

我的makefile中的测试出现了一种模式。我知道模式匹配器%$<。我正在尝试编译一些C ++。

我有一个makefile的片段,如下所示:

diff-test: main-test.o diff.o test/diff-test.cpp 
    $(CC) $(FLAGS) $(BOOST_LINK_FLAGS) build/main-test.o build/diff.o test/diff-test.cpp -o build/diff-test
    build/diff-test

walk-test: main-test.o walk.o test/walk-test.cpp
    $(CC) $(FLAGS) $(BOOST_LINK_FLAGS) build/main-test.o build/%.o test/%-test.cpp -o build/%-test
    build/walk-test

我尝试了以下几点:

%-test: main-test.o %.o test/%-test.cpp 
    $(CC) $(FLAGS) $(BOOST_LINK_FLAGS) build/main-test.o build/$<.o test/$<-test.cpp -o build/$<-test
    build/$<-test

但这与我想要的测试无法匹配:

make diff-test
make: *** No rule to make target `diff-test'.  Stop.

1 个答案:

答案 0 :(得分:1)

我认为你不想$<。这扩展到第一个先决条件,在这种情况下是main-test.o,这意味着您将使用build/main-test.o-testmain-test.o.o构建test/main-test.o-test.cpp,这似乎不太可能。

你的意思可能是$*

但是,您不能在先决条件列表中使用自动变量:它们仅在配方本身内定义。

为什么不在先决条件列表中使用该模式;那个模式规则应该如何运作:

%-test: %.o test/%-test.cpp main-test.o
        $(CC) $(FLAGS) $(BOOST_LINK_FLAGS) $^ -o build/$*-test
        build/$*-test