2

我有以下需要实现的场景。我将不得不从特定目录中提取所有源文件。因此过滤掉某些并编译其余部分。我正在按如下方式实施这种情况。

SOURCES = $(wildcard $(ROOT_DIR)/SRC/*.c)
FILTERED_SOURCES= $(filter-out $(ROOT_DIR)/SRC/File1.c, $(SOURCES))

我在这里面临的问题是 File1.c 没有被过滤掉。我预测可能的原因是过滤功能中使用的模式是一个长路径名,其中包含斜线和点。所以这里的问题是

  1. 是否可以将文件名而不是整个路径存储在“SOURCES”中
  2. 在过滤命令中是否有任何其他可疑的东西。
4

1 回答 1

2

您是否尝试打印出 的值SOURCES?或者,是否$(ROOT_DIR)包含空格?

SOURCES := $(wildcard $(ROOT_DIR)/SRC/*.c)
$(error $(SOURCES))

就个人而言,我会使用abspath函数将所有内容转换为绝对路径,然后过滤结果列表。

SOURCES          := $(abspath $(wildcard $(ROOT_DIR)/SRC/*.c))
FILTERED_SOURCES := $(filter-out $(abspath $(ROOT_DIR)/SRC/File1.c), $(SOURCES))

要返回使用原始$(ROOT_DIR)前缀(虽然它通常是可选的),可以使用patsubstfunction

SOURCES          := $(patsubst $(abspath $(ROOT_DIR))%,$(ROOT_DIR)%,$(SOURCES))
FILTERED_SOURCES := $(patsubst $(abspath $(ROOT_DIR))%,$(ROOT_DIR)%,$(FILTERED_SOURCES))
于 2012-09-06T21:11:03.050 回答