嗨!
几天前我开始摆弄 makefile,所以我给自己一个学习的练习,同时让我的生活更轻松。 我基本上想读取 makefile 所在的目录(root)并使用 luamin在将文件部署到我们的服务器之前尽可能地压缩该文件。但我希望它尽可能灵活,因此根据所述文件在目录中的位置,它应该将其镜像到服务器。
因此,如果它在名为 home
的子文件夹中找到文件,它应该创建一个与其中压缩文件同名的新文件夹。我已经开始对根文件夹中的文件进行压缩,并创建文件应驻留的目录。
objs = $(wildcard *.lua)
dirs = $(wildcard */)
compress: $(objs)
mkdir -p .build
luamin -f $(objs) > .build/$(objs)
mkdir .build/$(dirs)
clean:
rm -rf ./.build
deploy: .build
cp ./.build/* ~
最佳答案
如果您使用GNU make,有几个功能可以真正帮助您完成您想要的事情。警告:当且仅当您的文件名不包含空格时,此方法才有效:
srcfiles := $(shell find . -path .build -prune -o -type f -name '*.lua' -print)
dstfiles := $(addprefix .build/,$(srcfiles))
.PHONY: compress clean deploy
compress: $(dstfiles)
$(dstfiles): .build/%: %
mkdir -p $(dir $@)
luamin -f $< > $@
clean:
rm -rf ./.build
deploy: .build
cp ./.build/* ~
说明:
shell
make 函数用于运行find
搜索所有子目录的命令,除了.build
,对于*.lua
文件。结果分配给srcfiles
使变量。addprefix
make函数用于添加.build/
srcfiles
的所有单词的前缀创建变量并将结果分配给dstfiles
使变量。compress
target 是 Makefile 中的第一个(真实)目标。因此,它是仅调用make
时运行的默认目标。 。与调用make compress
相同。compress
目标被声明为虚假的。这告诉 make 它不是一个真正的文件,就像clean
一样。和deploy
。compress
target 取决于所有目标文件。如果其中一个丢失或比其相应的源文件旧,则必须重建它。- 品牌 static pattern rule
$(dstfiles): .build/%: %...
声明一个通用规则,其中每个目标文件 (.build/./foo/bar/baz.lua
) 取决于相应的源文件 (./foo/bar/baz.lua
)。该配方创建目标目录(./foo/bar/
),该目录由dir
计算得出。使函数。然后,它应用luamin
命令。该配方使用$@
和$<
automatic variables .
关于Makefile 子目录中的多个目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53026696/