我想创建一个使用monorepo的Makefile,并且正在基于源文件目录的动态输出目录挣扎。基于源文件目录的动态输出目录的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
文件。
的Makefile:
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 [email protected]
$(packages):
@echo "[email protected]"
clean:
rm -rf $(package_dest_dir)
我不知道我是否需要使用VPATH
还是什么...帮助吗?
注意:Makefile
目前只是足以制作和删除所有目标目录。
虽然你的问题并不完全是[this one]的重复(http://stackoverflow.com/questions/39015453/building-c-program-out-of-source-tree-with-gnu-make/39033569 #39033569),你可以在这里找到几种不同的方法来实现你想要做的事情。花时间阅读并理解答案。 – Tim
谢谢你指点我正确的方向。我实际上已经尝试过动态规则生成,但是我的'define'永远不会被调用。再给它一次,并更新我的问题(并希望回答)。 –