【发布时间】:2016-09-20 00:52:16
【问题描述】:
我正在尝试使用 monorepo 创建一个 Makefile,并且在基于源文件目录的动态输出目录方面遇到了一些困难。
我的项目是这样布局的:
% tree .
.
├── Makefile
└── packages
├── bar
│ └── src
│ └── index.js
│ └── other-file.js
└── foo
└── src
└── index.js
5 directories, 4 files
我想处理每个包中的每个 *.js 文件(例如,./packages/foo/src/index.js)并将输出发送到另一个目录(特别是 ./packages/foo/lib/index.js)。
例如make bar 会:
- 处理
./packages/bar/src/index.js->./packages/bar/lib/index.js - 处理
./packages/bar/src/other-file.js->./packages/bar/lib/other-file.js
我还可能希望将此模式用于./src 中的其他类型的文件,例如处理.less 文件。
生成文件:
PACKAGES_ROOT = ./packages
packages := $(shell ls $(PACKAGES_ROOT))
package_source_dir := $(addprefix packages/,$(addsuffix /src/,$(packages)))
package_dest_dir := $(subst src,lib,$(package_source_dir))
package_source := $(foreach sdir, $(package_source_dir), $(wildcard $(sdir)*.js*))
package_dest := $(subst src,lib,$(package_source))
.PHONY: all checkdirs clean
all: checkdirs
checkdirs: $(package_dest_dir)
$(package_dest_dir):
mkdir -p $@
$(packages):
@echo "$@"
clean:
rm -rf $(package_dest_dir)
我不确定是否需要使用VPATH 或什么...帮助?
注意:Makefile 当前足以创建和删除所有目标目录。
【问题讨论】:
-
虽然您的问题与this one 不完全重复,但您可以在这里找到一些不同的方法来实现您想要做的事情。花时间阅读并理解答案。
-
感谢您为我指明正确的方向。我实际上已经尝试过动态规则生成,但我的
define从未被调用过。再试一次,并用它更新我的问题(并希望得到答案)。