Makefile:从一对变量生成规则

问题描述 投票:0回答:1

我有一个 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)
生成和调用规则的帮助将不胜感激。

makefile gnu-make
1个回答
0
投票

在这种情况下,我们正在寻找“模式”规则。

图案是:

要实现

./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 $@
© www.soinside.com 2019 - 2024. All rights reserved.