使用模式制作目标
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 $< $@
我正在做一些感觉应该非常简单的事情。我在名为 ./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 $< $@