我正在做一些感觉应该非常简单的事情。我在名为./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
,这是一项相对昂贵的操作,所以这是不可取的)
答案 0 :(得分:1)
找到有用的东西。使用辅助扩展,您可以访问依赖项中的目标变量。我之前看过这个,但错过了最重要的事情:添加一个名为.SECONDEXPANSION:
all: $(OUT_FILES)
%.js: src/$$@
cp $< $@
的空目标
{{1}}