Makefile: 使用规则复制文件

17

我正在尝试使用我的规则复制文件,但是我的规则没有被触发:

BUILDDIR = build
COPY_FILES = code/xml/schema/schema.xsd config.txt

all: $(BUILDDIR) $(COPY_FILES) copy

$(BUILDDIR):
    mkdir -p $@

$(COPY_FILES):
    cp -f $@ $(BUILDDIR)

copy:
    cp -f $(COPY_FILES) $(BUILDDIR)

我试图使用 $(COPY_FILES) ,但它没有被触发,尽管 $(BUILDDIR) 和 copy 被触发了。我不确定我的 Makefile 哪里出了问题。如果可能的话,我想让 $(COPY_FILES) 规则起作用(并删除 copy)。有人知道原因吗?

2个回答

27

$(COPY_FILES)规则存在的问题在于该规则的目标文件已经存在,即code/xml/schema/schema.xsdconfig.txt。因此,Make没有必要执行该规则。我不确定为什么Make不执行copy规则,但我怀疑有一个名为copy的文件使事情变得混乱。无论如何,[copy]是一个错误的规则。

请尝试这个方法:

COPY_FILES = $(BUILD_DIR)/schema.xsd $(BUILD_DIR)/config.txt

all: $(COPY_FILES)

$(BUILD_DIR)/schema.xsd: code/xml/schema/schema.xsd
$(BUILD_DIR)/config.txt: config.txt

$(BUILD_DIR)/%:
    cp -f $< $@

1
他说复制已被触发,但这并不改变它是一条糟糕的编写规则的事实。 - Etan Reisner
2
@Beta 如果要复制的文件位于 src/ 目录中并且会定期更改,您会如何处理?例如,如果您无法明确列出需要复制的所有文件,而是使用 $(wildcard) 构建它们,该怎么办? - PeterT
8
@PeterT:没问题:COPY_FILES := $(patsubst src/%,build/%,$(wildcard src/*)),最终规则为 $(BUILD_DIR)/%: $(SRC_DIR)/% - Beta

0
在我的情况下,我使用一个简单的“for循环”来复制所有这些文件。
例如,将规则编写如下:
RELEASE_DIR = ../rc1
RELEASE_FILES = ai.h main.cc main_async.cc bmp_utils.h bmp_utils.cc
release: $(RELEASE_FILES)
     for u in $(RELEASE_FILES); do echo $$u; cp -f $$u $(RELEASE_DIR); done

然后,

make release

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接