Makefile 当模式不包含配方不明显时进行行为

Makefile 当模式不包含配方不明显时进行行为,makefile,Makefile,在以下情况下调用make all时,我会收到错误消息: 没有规则使target`venv/lib/python2.7/site-packages/planar\u growth/node\u degree\u tracker.so 我不明白为什么会这样。我希望目标$(DST_DIR)/%.so匹配DST_DIR中的所有.so文件,并从SRC_DIR复制它们。为什么没有发生这种情况 SRC_DIR := ./src/spg DST_DIR := ./venv/lib/python2.7/site-

在以下情况下调用make all时,我会收到错误消息:

没有规则使target`venv/lib/python2.7/site-packages/planar\u growth/node\u degree\u tracker.so

我不明白为什么会这样。我希望目标
$(DST_DIR)/%.so
匹配DST_DIR中的所有.so文件,并从SRC_DIR复制它们。为什么没有发生这种情况

SRC_DIR := ./src/spg
DST_DIR := ./venv/lib/python2.7/site-packages/planar_growth
SRC_FILES := node_degree_tracker spatialgrowth splay data_structures
DST_FILES_CYTHON = $(patsubst %,$(DST_DIR)/%.so,$(SRC_FILES))

$(DST_DIR): 
    virtualenv --system-site-packages venv
    mkdir $(DST_DIR)

$(DST_DIR)/%.py: $(SRC_DIR)/%.py $(DST_DIR)
    cp $< $@

compile:
    cd ./src/spg && \
    python setup.py build_ext --inplace

.PHONY: $(SRC_DIR)/%.so
$(SRC_DIR)/%.so: compile

$(DST_DIR)/%.so: $(SRC_DIR)/%.so $(DST_DIR)
    cp $< $@

all: $(DST_FILES_CYTHON)
    cp $(SRC_DIR)/simulate_spg.py $(DST_DIR)/.
问题在于:

$(SRC_DIR)/%.so: compile
这是一个没有配方的模式规则。我目前找不到参考资料,但这是一个问题,至少在Make的某些版本中是如此

因此,给它一个没有任何作用的配方,比如:

$(SRC_DIR)/%.so: compile
    @:
或者这个:

$(SRC_DIR)/%.so: compile;

包含来自
make-d
的输出。没有配方的模式规则本身不是问题:只是它记录的行为有些出乎意料;没有配方的模式规则将删除模式规则。这在GNU make的所有版本中都是正确的,因为添加了模式规则。@MadScientist:我模糊地记得,但在手册中找不到它;你应该回答,我会删除我的答案。@Madscient如果你想给出一个规范的答案,我会把它保留24小时。如果不是的话,我会接受Beta版的答案。另外,我有一个比一年前在cygwin上运行的版本更高的makefile。这有一个没有配方的模式规则,并且按照我的预期工作。@Beta您说明了问题和解决方案:您应该得到接受。我只是澄清了一件事(请随时用澄清更新您的答案)。干杯
$(SRC_DIR)/%.so: compile;