使用模式制作目标

时间:2015-05-07 11:16:53

标签: makefile

我正在做一些感觉应该非常简单的事情。我在名为./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,这是一项相对昂贵的操作,所以这是不可取的)

1 个答案:

答案 0 :(得分:1)

找到有用的东西。使用辅助扩展,您可以访问依赖项中的目标变量。我之前看过这个,但错过了最重要的事情:添加一个名为.SECONDEXPANSION: all: $(OUT_FILES) %.js: src/$$@ cp $< $@ 的空目标

{{1}}