将$ @与vpath一起使用

时间:2016-10-03 04:25:31

标签: makefile gnu-make

SRC_DIRS += $(CMM_DIR)
SRC_DIRS += $(ABC_DIR)

VPATH = $(SRC_FILES)

tear_abc123: $(OBJ)/ur23.o
    $(CC) $(CFLAGS) -c $(subst tear_,,$@.c) $@.c $@_compiletime.c -o $@

在此,$@_ compiletime.c(比如tear_abc123_compiletime.c)在$(CC)之前生成。 make抛出一个找不到abc123.c的错误。其中abc123.c出现在$(ABC_DIR)中。为什么vpath无法找到c文件。

1 个答案:

答案 0 :(得分:1)

主要问题是VPATH仅适用于先决条件。它并不适用于'命令'目标的一部分。

要使VPATH工作,您应该在先决条件中指定源列表,并使用$^在命令中引用它。

请参阅以下示例(对于文件树,如下所示)

.
|-- abc
|   |-- abc123.c
|   |-- tear_abc123.c
|   `-- tear_abc123_compiletime.c
`-- Makefile

Makefile包含

SRC_DIRS := abc
VPATH := $(SRC_DIRS)

TARGET := tear_abc123

SOURCE_FILES := $(TARGET).c $(TARGET)_compiletime.c $(subst tear_,,$(TARGET).c)

tear_abc123: $(SOURCE_FILES)
        @echo "SOURCE_FILES := $(SOURCE_FILES)"
        @echo "prerequisites = $^"

输出

$ make
SOURCE_FILES := tear_abc123.c tear_abc123_compiletime.c abc123.c
prerequisites = abc/tear_abc123.c abc/tear_abc123_compiletime.c abc/abc123.c

如你所见

  • SOURCE_FILES实际上只包含源文件名
  • 先决条件会自动替换为正确的路径