我有一个 Makefile,它有两个变量:
SOURCE_DIR := ./source
BUILD_DIR := ./build
C_FILES := $(shell find $(SOURCE_DIR) -name '*.c')
BIN_FILES := $(patsubst $(SOURCE_DIR)%.c,$(BUILD_DIR)%, $(C_FILES))
$(C_FILES)
和$(BIN_FILES)
都是两个字符串。一个是所有现有.c
文件的路径,用空格分隔,另一个是所有相应可执行文件的字符串(没有扩展名,尚未生成)
我的下一个预期步骤是编写一个规则,使用 C_FILES 中对应的“元素”为 BIN_FILES 中的每个“元素”构建二进制文件。然而,我是个新手,我仍然不知道如何编写一个可以迭代一对变量的规则。
我尝试过:
$(BIN_FILES): %:%.c
cc $< -o $@
all: $(BIN_FILES)
但是当我运行
make all
时,它一直坚持认为 build/ch01/hello.c
这是有道理的,因为它正在寻找 ./build/...
类似的模式。如何让 make
查找先决条件的 s./ource/...
模式,同时在 ./build/..
中构建可执行文件
任何有关使用变量
$(BIN_FILES)
和 $(C_FILES)
生成和调用规则的帮助将不胜感激。
在这种情况下,我们正在寻找“模式”规则。
图案是:
要实现
./build/<file>
,我们依赖于./source/<file.c>
所以模式规则看起来像:
$(BUILD_DIR)/%: $(SOURCE_DIR)/%.c
如果两个
%
标志在源和目的地方面匹配,那么它将能够构建。
因此,如果我们有
./source/a.c
,我们希望最终得到 ./build/a
整个 makefile 看起来像这样:
SOURCE_DIR := ./source
BUILD_DIR := ./build
C_FILES := $(shell find $(SOURCE_DIR) -name '*.c')
BIN_FILES := $(patsubst $(SOURCE_DIR)%.c,$(BUILD_DIR)%, $(C_FILES))
all: $(BIN_FILES)
$(BUILD_DIR)/%: $(SOURCE_DIR)/%.c
$(CC) $< -o $@