冒号在先决条件下,如何理解?

时间:2016-04-19 12:50:06

标签: makefile gnu-make

以下是Caffe Makefile的摘录。

TEST_BIN_DIR = build/test
$(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_CXX_BUILD_DIR)/%.o $(GTEST_OBJ) | $(DYNAMIC_NAME) $(TEST_BIN_DIR)
    @ echo LD $<
    $(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) \
    -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(LIBRARY_NAME) -Wl,-rpath,$(ORIGIN)/../lib

TEST_CXX_BINS先决条件中冒号(:)的含义是什么?它是否在先决条件中定义了另一条规则?

它不是标准的隐式规则或模式规则。我已经搜索过网络和GNU Make手册,找不到任何可供参考的内容。

1 个答案:

答案 0 :(得分:4)

这是一种静态模式规则。第一部分(从左到第一个冒号)是一个目标列表。第二部分定义了与每个目标匹配的模式。然后可以在列出先决条件的第三部分(右侧第二个冒号)中使用(或不使用)匹配的%词干。在您的示例中,TEST_CXX_BINS应该是目标列表。如果其中一个目标是$(TEST_BIN_DIR)/foo.testbinbuild/test/foo.testbin),那么将使用以下规则:

$(TEST_BIN_DIR)/foo.testbin: $(TEST_CXX_BUILD_DIR)/foo.o $(GTEST_OBJ) | $(DYNAMIC_NAME) $(TEST_BIN_DIR)
    @ echo LD $<
    $(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) \
    -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(LIBRARY_NAME) -Wl,-rpath,$(ORIGIN)/../lib

请注意|之后的先决条件是先决条件:它们必须存在并且如果不存在则会被创建,但是如果它们不存在,则make将不会检查它们是否是最近的或不是目标。

另请注意,由于$*自动变量,匹配的词干也可以在配方中引用。