Makefile 在子目录中创建多个目标
你好强> 几天前我开始处理makefiles,所以我给自己做了一个练习来学习,同时也让我的生活更轻松。 我基本上希望读取makefile所在的目录(根目录),并在将其部署到服务器之前尽可能多地压缩该文件。但我希望它尽可能灵活,因此根据所述文件在目录中的位置,它应该将其镜像到服务器 因此,如果它在名为Makefile 在子目录中创建多个目标,makefile,Makefile,你好 几天前我开始处理makefiles,所以我给自己做了一个练习来学习,同时也让我的生活更轻松。 我基本上希望读取makefile所在的目录(根目录),并在将其部署到服务器之前尽可能多地压缩该文件。但我希望它尽可能灵活,因此根据所述文件在目录中的位置,它应该将其镜像到服务器 因此,如果它在名为home的子文件夹中找到一个文件,它应该创建一个与压缩文件同名的新文件夹。我已经得到了根文件夹中文件的压缩工作,以及文件应该驻留的目录的创建 objs = $(wildcard *.lua) dirs =
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/* ~
如果您使用gnumake,那么有几个特性可以真正帮助您实现所需的功能。警告:当且仅当文件名不包含空格时,此选项才有效:
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/* ~
srcfiles:=$(shell find.-path.build-prune-o-type f-name'*.lua'-print)
dstfiles:=$(addprefix.build/,$(srcfiles))
.假冒:压缩干净
压缩:$(DST文件)
$(dstfiles):.build/%:%
mkdir-p$(dir$@)
卢阿明-f$<>$@
清洁:
rm-rf./.构建
部署:。生成
cp./.build/*~
说明:
shell
make函数用于运行find
命令,该命令搜索所有子目录,除了.build
,以查找*.lua
文件。结果分配给srcfiles
make变量addprefix
make函数用于向srcfiles
make变量的所有单词添加.build/
前缀,并将结果分配给dstfiles
make变量compress
目标是生成文件中的第一个(真实)目标。因此,当调用justmake
时,它是默认的目标。这与调用make compress
相同。compress
目标被声明为虚假。这告诉make它不是一个真正的文件,就像clean
和deploy
一样。压缩目标取决于所有目标文件。如果一个文件丢失或比其相应的源文件旧,则必须重新生成该文件$(dstfiles):.build/%:%…
声明了一个通用规则,其中每个目标文件(.build//foo/bar/baz.lua
)依赖于相应的源文件(/foo/bar/baz.lua
)。配方创建目标目录(/foo/bar/
),该目录是通过dir
make函数计算出来的。然后,它应用luamin
命令。配方使用了$@
和$,因此如果目录包含foo/bar.lua
,那么您希望使用mkdir.build/foo
创建一个目录,然后使用luamin-f foo/bar>.build/foo/bar.lua
创建压缩文件,对吗?是的。这样我就不必担心它们被复制到错误的地方,只需给出一个路径,根目的地。我没有安装GNU,也从来没有听说过它。因此,我使路径工作,但我不能使destfiles
变量工作。我尝试了cut
命令,但它只对第一个元素执行此操作。有没有一种方法可以循环遍历类似于addprefix
的变量中的元素?您使用的是什么品牌以及它的哪个版本?我现在看到,当我打印安装了GNU的版本时,它说它使用的是为x86_64-pc-linux-GNU构建的GNU make 4.1。好吧,dstfiles
(不是destfiles
)变量到底发生了什么?问题似乎是它将选项卡转换为空格,因此无法识别该文件。