使用模式制作目标

Make target using a pattern

我正在做一些感觉应该非常简单的事情。我在名为 ./src 的目录中有源文件,这些文件被转换并保存到 ./为了这个问题,我就说他们被复制到那里了。

以下是构建前的目录:

/src/lib/foo.js
/src/lib/mod/bar.js
/src/bin/baz.js
/Makefile

构建后应该有以下内容:

/src/lib/foo.js
/src/lib/mod/bar.js
/src/bin/baz.js
/lib/foo.js
/lib/mod/bar.js
/bin/baz.js
/Makefile

在我的 Makefile 中我有这个:

SRC_FILES := src/lib/foo.js src/lib/mod/bar.js src/bin/baz.js
OUT_FILES := lib/foo.js lib/mod/bar.js bin/baz.js

这些是从 find 和模式替换生成的,但为简单起见,在此处列出...

现在,我希望能起作用的是:

%.js: src/%.js
    cp $< $@

但是当我 运行 make lib/foo.js 我得到 Nothing to be done for 'lib/foo.js'.

查看调试的输出,它似乎试图找到一个名为 lib/src/foo.js 的依赖项。这就是 the manual.

中描述的内容

感觉应该是一件很简单的事情吧!我做错了什么?


此外,我试过:

$(OUT_FILES): $(SRC_FILES)
    cp $< $@

...这有效,但如果任何源发生变化,它会重建每个文件。 (请记住,我的实际转换不只是cp,这是一个相对昂贵的操作,所以这是不可取的)

找到有用的东西。使用二次扩展,您可以访问依赖项中的目标变量。我早些时候看到了这个,但错过了最重要的事情:添加一个名为 .SECONDEXPANSION

的空目标
.SECONDEXPANSION:

all: $(OUT_FILES)

%.js: src/$$@
    cp $< $@